ASP.NET Core + Vue 小項目:構(gòu)造自己的在線 Markdown 筆記本

目錄

  • 概要
  • 知識點
  • 完整示例圖
  • 代碼與資源文件
  • 流程步驟

概要

基于 MVP 最小可行性產(chǎn)品設(shè)計理念缀壤,我們先完成一個可以使用枝嘶,并具備基本功能的 Markdown 筆記本應(yīng)用涩咖,再進行逐步完善。

知識點

本文運用了 Vue 的計算屬性、雙向綁定华望、指令、生命周期鉤子仅乓,還有 localStorage 和異步請求等知識點赖舟。

完整示例圖

代碼與資源文件

https://github.com/liqingwen2015/MarkdownDemo
為了避免網(wǎng)絡(luò)原因造成的問題,文中所使用的第三方庫以及 css 文件都下載好并且已經(jīng)放入里面夸楣。

流程步驟

1.先構(gòu)建一個基本的 html 文件宾抓,并引入核心 js 庫。

這里需要引入的第三方庫為 vue.js豫喧、marked.js石洗。

<html>

<head>
    <title></title>
    <!-- 引入樣式文件 -->
    <link rel="stylesheet" href="index.css" />
</head>

<body>
    <!-- 引入 js 庫 -->
    <script src="/lib/vue.js"></script>
    <script src="/lib/marked.js"></script>

    <!-- js 代碼 -->
    <script src="index.js"></script>
</body>

</html>

因為考慮到項目主要劃分為兩塊,左邊是書寫區(qū)域紧显,右邊為預(yù)覽區(qū)域讲衫,<body> 塊代碼修改為:

<body>
    <!-- 引入 js 庫 -->
    <script src="lib/vue.js"></script>
    <script src="lib/marked.js"></script>

    <div id="app">
        <!-- 主區(qū)域:書寫 -->
        <section class="main"></section>

        <!-- 預(yù)覽區(qū)域 -->
        <aside class="preview"></aside>
    </div>

    <!-- js 代碼 -->
    <script src="index.js"></script>
</body>

修改 js 代碼:創(chuàng)建 Vue 實例,并將其掛載到 DOM 元素上孵班。

new Vue({
    el: '#app'
})

【備注】上面的掛載方式是比較常見的一種涉兽,我們也可以使用 app.$mount('#app') 進行掛載。

2.接下來我們使用 Vue 的雙向綁定機制控制輸入的內(nèi)容和預(yù)覽的內(nèi)容篙程。

修改 html:

<body>
    <!-- 引入 js 庫 -->
    <script src="lib/vue.js"></script>
    <script src="lib/marked.js"></script>

    <div id="app">
        <!-- 主區(qū)域:書寫 -->
        <section class="main">
            <textarea v-model="editor"></textarea>
        </section>

        <!-- 預(yù)覽區(qū)域 -->
        <aside class="preview">
            {{editor}}
        </aside>
    </div>

    <!-- js 代碼 -->
    <script src="index.js"></script>
</body>

修改 js枷畏,增加數(shù)據(jù)屬性:

new Vue({
    el: '#app',
    data() {
        return {
            editor: '編輯器'
        }
    }
})

現(xiàn)在,打開 index.html 頁面房午,在瀏覽器頁面中的左側(cè)進行輸入就可以在預(yù)覽窗口中同步看到輸入后的情況矿辽。

3.接下來丹允,我們需要對輸入的內(nèi)容經(jīng)過 Markdown 形式轉(zhuǎn)換郭厌,在這里,我們使用 Vue 的計算屬性來進行優(yōu)化渲染 Markdown 的實時預(yù)覽

修改 js:

new Vue({
    // 掛載
    el: '#app',
    
    // 數(shù)據(jù)
    data() {
        return {
            editor: '編輯器'
        }
    },

    // 計算屬性
    computed: {
        editorPreview() {
            return marked(this.editor);
        }
    }
})

修改 <body>雕蔽,使用 v-html 指令取代 {{ }}折柠,以這種方式來渲染 HTML 元素。

<body>
    <!-- 引入 js 庫 -->
    <script src="lib/vue.js"></script>
    <script src="lib/marked.js"></script>

    <div id="app">
        <!-- 主區(qū)域:書寫 -->
        <section class="main">
            <textarea v-model="editor"></textarea>
        </section>

        <!-- 預(yù)覽區(qū)域 -->
        <aside class="preview" v-html="editorPreview"> </aside>
    </div>

    <!-- js 代碼 -->
    <script src="index.js"></script>
</body>
運行效果圖

4.保存內(nèi)容

目前扇售,如果關(guān)閉了瀏覽器或者對頁面進行了刷新,所有內(nèi)容都會丟失嚣艇。所以承冰,我們目前使用 localStorage
的方式進行數(shù)據(jù)的保存操作。

現(xiàn)在產(chǎn)生了一個疑問:應(yīng)該什么時候進行保存呢食零?

我們現(xiàn)在使用 Vue 的偵聽器功能來對數(shù)據(jù)的改動進行保存操作困乒,因為它可以監(jiān)聽到 editor 的每一改動操作,意思是每次輸入操作都會觸發(fā)偵聽器里面的方法贰谣。

修改 js:

new Vue({
    // 掛載
    el: '#app',

    // 數(shù)據(jù)
    data() {
        return {
            editor: '編輯器'
        }
    },

    // 計算屬性
    computed: {
        editorPreview() {
            return marked(this.editor);
        }
    },

    // 偵聽器
    watch: {
        editor(val) {
            localStorage.setItem('editor', this.editor);
        }
    }
})

那么現(xiàn)在又產(chǎn)生了新的疑問:應(yīng)該怎樣才能夠在每次進入這個頁面時顯示之前保存的信息呢娜搂?

現(xiàn)在迁霎,我們通過利用 Vue 的生命周期鉤子(目前使用 created 鉤子)來進行數(shù)據(jù)的讀取及恢復(fù)。

修改 js:

new Vue({
    // 掛載
    el: '#app',

    // 數(shù)據(jù)
    data() {
        return {
            editor: '編輯器',
            key: {
                editor: 'editor'
            }
        }
    },

    // 計算屬性
    computed: {
        editorPreview() {
            return marked(this.editor);
        }
    },

    // 偵聽器
    watch: {
        editor(val) {
            localStorage.setItem(this.key.editor, this.editor);
        }
    },

    // 生命周期鉤子
    created() {
        this.editor = localStorage.getItem(this.key.editor) || '第一次使用 Markdown 筆記本';
    }
})

【備注】在進行修改 js 后百宇,editor 屬性第一次加載的時候可能為 null考廉,這會導(dǎo)致整個應(yīng)用出錯,所以這里采用了默認值携御。

5.localStorage 畢竟不是永久保存的方式昌粤,這里我使用一種較為簡單的方式,保存方法替換為異步請求到 WebApi 接口保存到數(shù)據(jù)庫的方式

修改 html啄刹,引入 axios 庫:

<script src="lib/axios.min.js"></script>

同時婚苹,修改 js,增加兩個 Http 請求的方法鸵膏,獲取和保存:

new Vue({
    // 掛載
    el: '#app',

    // 數(shù)據(jù)
    data() {
        return {
            editor: '',
            key: {
                editor: 'editor'
            },
            url: 'http://localhost:34473/api/markdown'  // 需要替換成自己的 API 路徑
        }
    },

    // 計算屬性
    computed: {
        editorPreview() {
            return marked(this.editor);
        }
    },

    // 偵聽器
    watch: {
        editor(val) {
            //localStorage.setItem(this.key.editor, this.editor);
            this.save();
        }
    },

    // 生命周期鉤子
    created() {
        this.load();
        // this.editor = localStorage.getItem(this.key.editor) || '第一次使用 Markdown 筆記本';
    },

    // 方法
    methods: {
        load() {
            var that = this;
            axios.get(that.url).then(function (result) {
                console.log(result.data);
                that.editor = result.data;
            });
        },
        save() {
            var that = this;
            axios.post(that.url, { content: that.editor }).then(function (result) { });
        }
    }
})

新增的 API 控制器 MarkdownController.cs 的內(nèi)容如下:

    [Route("api/[controller]")]
    [ApiController]
    public class MarkdownController : ControllerBase
    {
        public static MarkdownViewModel MarkdownViewModel = new MarkdownViewModel()
        {
            Content = "我的第一個 Markdown 應(yīng)用"
        };

        [HttpGet]
        public ActionResult<string> Get()
        {
            return MarkdownViewModel.Content;
        }

        [HttpPost]
        public void Save([FromBody] MarkdownViewModel vm)
        {
            MarkdownViewModel = vm;
        }
    }

視圖模型 MarkdownViewModel.cs 的內(nèi)容如下:

    public class MarkdownViewModel
    {
        public string Content { get; set; }
    }

【備注】需要自行進行 WebApi 的跨域配置膊升,演示時進行了忽略配置
【備注】示例代碼可從 https://github.com/liqingwen2015/MarkdownDemo 下載

【切換閱讀方式】https://www.cnblogs.com/liqingwen/p/10264626.html
【參考】Vue.js 2 Web Development Projects

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谭企,隨后出現(xiàn)的幾起案子廓译,更是在濱河造成了極大的恐慌,老刑警劉巖债查,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件非区,死亡現(xiàn)場離奇詭異,居然都是意外死亡盹廷,警方通過查閱死者的電腦和手機征绸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俄占,“玉大人管怠,你說我怎么就攤上這事「组” “怎么了渤弛?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甚带。 經(jīng)常有香客問我她肯,道長,這世上最難降的妖魔是什么鹰贵? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任晴氨,我火速辦了婚禮,結(jié)果婚禮上碉输,老公的妹妹穿的比我還像新娘籽前。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布聚假。 她就那樣靜靜地躺著块蚌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膘格。 梳的紋絲不亂的頭發(fā)上峭范,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音瘪贱,去河邊找鬼纱控。 笑死,一個胖子當著我的面吹牛菜秦,可吹牛的內(nèi)容都是我干的甜害。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼球昨,長吁一口氣:“原來是場噩夢啊……” “哼尔店!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起主慰,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嚣州,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后共螺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體该肴,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年藐不,在試婚紗的時候發(fā)現(xiàn)自己被綠了匀哄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雏蛮,死狀恐怖涎嚼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情底扳,我是刑警寧澤铸抑,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布贡耽,位于F島的核電站衷模,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒲赂。R本人自食惡果不足惜阱冶,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滥嘴。 院中可真熱鬧木蹬,春花似錦、人聲如沸若皱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爷贫,卻和暖如春蚌吸,著一層夾襖步出監(jiān)牢的瞬間信峻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工卧土, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人像樊。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓尤莺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親生棍。 傳聞我的和親對象是個殘疾皇子颤霎,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 33、JS中的本地存儲 把一些信息存儲在當前瀏覽器指定域下的某一個地方(存儲到物理硬盤中)1涂滴、不能跨瀏覽器傳輸:在...
    萌妹撒閱讀 2,083評論 0 2
  • vue-cli搭建項目 確保安裝了node與npm 再目標文件夾下打開終端 執(zhí)行cnpm i vue-cli -g...
    Akiko_秋子閱讀 3,238評論 1 22
  • 在尤大微博鋪墊著“將會引入一些關(guān)于 TypeScript 的改進”一周之后捷绑,代號為 Level E 的 Vue.j...
    極樂叔閱讀 14,764評論 0 12
  • ## 框架和庫的區(qū)別?> 框架(framework):一套完整的軟件設(shè)計架構(gòu)和**解決方案**。> > 庫(lib...
    Rui_bdad閱讀 2,907評論 1 4
  • 活著,僅僅是活著首量。你夢想的樣子可能與你實際的處境相差十萬八千里壮吩,只是你心安而已,覺得這樣的生活有意義加缘,這樣活...
    7d3dec75a0f5閱讀 387評論 0 1