添加发布逻辑
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 })