• 发布个人文章


    添加发布逻辑

    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 })
  • 相关阅读:
    java之JDBC
    git删除未监视的文件
    java之正则表达式
    linux命令之信息显示与搜索文件命令
    linux命令之文件备份与压缩命令
    gitlab中修改项目名称客户端修改方法
    linux中使用unzip命令中文乱码解决办法
    使用Python进行统计量描述
    Machine Learning
    Courase Neural Networks for Machine Learning Lecture1 Note
  • 原文地址:https://www.cnblogs.com/yangguoe/p/9317483.html
Copyright © 2020-2023  润新知