发布个人文章

添加发布逻辑

1、打开 src/views/articles/Create.vue 文件,复制以下代码替换原 <script>

src/views/articles/Create.vue

 1 <script>
 2 import SimpleMDE from 'simplemde'
 3 import hljs from 'highlight.js'
 4 import ls from '@/utils/localStorage'
 5 
 6 window.hljs = hljs
 7 
 8 export default {
 9   name: 'Create',
10  // 添加相关数据
11 data() {
12   return {
13     title: '', // 文章标题
14     content: '' // 文章内容
15   }
16 },
17 mounted() {
18   const simplemde = new SimpleMDE({...})
19 
20   // 监听编辑器的 change 事件
21   simplemde.codemirror.on('change', () => {
22     // 将改变后的值赋给文章内容
23     this.content = simplemde.value()
24   })
25 
26   // 将 simplemde 添加到当前实例,以在其他地方调用
27   this.simplemde = simplemde
28   // 初始化标题和内容
29   this.fillContent()
30 },
31 methods: {
32   // 编辑器只会自动保存文章的内容,我们需要自己保存文章的标题
33   saveTitle() {
34     ls.setItem('smde_title', this.title)
35   },
36   // 初始化标题和内容
37   fillContent() {
38     const simplemde = this.simplemde
39     const title = ls.getItem('smde_title')
40 
41     // 如果 localStorage 有标题数据,使用它作为文章标题
42     if (title !== null) {
43       this.title = title
44     }
45 
46     // 使用编辑器的内容作为文章内容
47     this.content = simplemde.value()
48   },
49   // 发布
50   post() {
51     const title = this.title
52     const content = this.content
53 
54     // 如果标题和内容都不为空,提交发布
55     if (title !== '' && content.trim() !== '') {
56       const article = {
57         title,
58         content
59       }
60 
61       // 在控制台输出当前文章
62       console.log(article)
63       // 清除数据
64       this.clearData()
65     }
66   },
67   // 清除数据
68   clearData() {
69     this.title = ''
70     ls.removeItem('smde_title')
71     // 清除编辑的内容
72     this.simplemde.value('')
73     // 清除编辑器自动保存的内容
74     this.simplemde.clearAutosavedValue()
75   }
76 }
77 }
78 </script>
79 更改说明:

2、查找 <input v-validator.required,使用 v-model 绑定 title,并添加 input 事件处理器 saveTitle

1 <input v-model.trim="title" v-validator:blur.required="{ title: '标题' }" type="text" class="form-control" placeholder="请填写标题" @input="saveTitle">

3、查找 <button class="btn btn-primary",添加 click 事件处理器 post

1 <button class="btn btn-primary" type="submit" @click="post">发 布</button>

 使用vuex管理文章状态:

管理文章状态

因为会有很地方用到文章的数据,所以我们把相关的逻辑都放到 store 里,以便使用和统一管理。

 

1). 添加状态和事件类型

打开 src/store/index.js 文件,添加 articles 和 UPDATE_ARTICLES(注释部分是涉及的修改):

src/store/index.js

 1 .
 2 .
 3 .
 4 const state = {
 5   user: ls.getItem('user'),
 6   auth: ls.getItem('auth'),
 7   // 所有文章状态
 8   articles: ls.getItem('articles')
 9 }
10 
11 const mutations = {
12   UPDATE_USER(state, user) {
13     state.user = user
14     ls.setItem('user', user)
15   },
16   UPDATE_AUTH(state, auth) {
17     state.auth = auth
18     ls.setItem('auth', auth)
19   },
20   // 更改所有文章的事件类型
21   UPDATE_ARTICLES(state, articles) {
22     state.articles = articles
23     ls.setItem('articles', articles)
24   }
25 }
26 .
27 .
28 .
29 2). 添加发布事件

2). 添加发布事件

在 src/store 下新建 actions.js 文件,复制贴入以下代码:

src/store/actions.js

 1 // 引入路由作页面跳转用
 2 import router from '../router'
 3 
 4 // 导出一个 post 事件,这里的用户参数是 { article, articleId },article 包含文章标题和内容,articleId 是文章 ID 
 5 export const post = ({ commit, state }, { article, articleId }) => {
 6   // 从仓库获取所有文章
 7   let articles = state.articles
 8 
 9   // 没有文章时,建一个空数组
10   if (!Array.isArray(articles)) articles = []
11 
12   // 存在 article 时
13   if (article) {
14     // 因为是单用户,所以指定用户 ID 为 1
15     const uid = 1
16     // 获取用户传过来的 title 和 content
17     const { title, content } = article
18     // 获取当前日期
19     const date = new Date()
20 
21     // 如果没传 articleId,表示新建文章
22     if (articleId === undefined) {
23       // 获取最后一篇文章
24       const lastArticle = articles[articles.length - 1]
25 
26       if (lastArticle) {
27         // 将当前 articleId 在最后一篇文章的 articleId 基础上加 1
28         articleId = parseInt(lastArticle.articleId) + 1
29       } else {
30         // 将当前 articleId 在文章长度基础上加 1
31         articleId = articles.length + 1
32       }
33 
34       // 将当前文章添加到所有文章
35       articles.push({
36         uid,
37         articleId,
38         title,
39         content,
40         date
41       })
42     }
43 
44     // 更新所有文章
45     commit('UPDATE_ARTICLES', articles)
46     // 跳转到首页,并附带 articleId 和 showMsg 参数,showMsg 用来指示目标页面显示一个提示,我们稍后添加相关逻辑
47     router.push({ name: 'Home', params: { articleId, showMsg: true } })
48   }
49 }

3). 引入 actions.js

打开 src/store/index.js 文件,引入并混入 actions.js(注释部分是涉及的修改):

src/store/index.js

 1 import Vue from 'vue'
 2 import Vuex from 'vuex'
 3 import ls from '../utils/localStorage'
 4 import router from '../router'
 5 // 引入 actions.js 的所有导出
 6 import * as moreActions from './actions'
 7 .
 8 .
 9 .
10 const actions = {
11   login({ commit }, user) {
12     if (user) commit('UPDATE_USER', user)
13     commit('UPDATE_AUTH', true)
14     router.push('/')
15   },
16   logout({ commit }) {
17     commit('UPDATE_AUTH', false)
18     router.push({ name: 'Home', params: { logout: true } })
19   },
20   updateUser({ state, commit }, user) {
21     const stateUser = state.user
22 
23     if (stateUser && typeof stateUser === 'object') {
24       user = { ...stateUser, ...user }
25     }
26 
27     commit('UPDATE_USER', user)
28   },
29   // 使用对象展开运算符混入 moreActions
30   ...moreActions
31 }
32 .

修改发布逻辑

打开 src/views/articles/Create.vue 文件,查找 console.log(article),改为分发 post 事件:

src/views/articles/Create.vue

// 修改
console.log(article)
// 为 => 分发 post 事件,并附带参数 { article }
this.$store.dispatch('post', { article })
原文地址:https://www.cnblogs.com/yangguoe/p/9317483.html