
基于kov-blog的VueVuex状态管理实战教程post与token模块设计解析【免费下载链接】kov-blogA blog platform built with koa,vue and mongoose. 使用 koa ,vue 和 mongo 搭建的博客页面和支持markdown语法的博客编写平台,自动保存草稿。博客地址:https://chuckliu.me项目地址: https://gitcode.com/gh_mirrors/ko/kov-blogkov-blog 是一个基于 Koa Vue Mongoose 搭建的全栈博客平台支持 Markdown 编写与草稿自动保存。本文基于它的后台管理端真实 Vuex 代码拆解 post 与 token 两个核心模块的设计思路帮助新手快速掌握 VueVuex 状态管理在博客平台中的实战用法。1. 为什么博客后台需要 Vuex 状态管理 后台管理端里草稿列表、Markdown 编辑器、标签面板等多个组件同时存在。如果各组件自己维护数据很容易出现这些问题状态分散当前草稿 ID、未保存标记、登录 token 散落在不同组件里联动困难切换一篇草稿需要同步列表、编辑器、发布按钮等多处状态不可控的副作用未保存的内容可能被悄悄覆盖丢失Vuex 的做法是把全局共享的状态集中到一处所有修改都必须经过 mutation天然可追踪。这就是博客平台引入状态管理的价值。目录结构一览admin/src/vuex/ ├── store.js # Store 入口开启 strict 严格模式 ├── mutation_types.js # mutation 类型常量 ├── modules/ # state mutations数据层 │ ├── post.js # 草稿模块 │ └── token.js # 登录令牌模块 ├── actions/ # actions业务 接口层 │ ├── post.js │ └── token.js └── getters/ # getters派生状态层 ├── post.js └── token.js这种按职责分层的目录组织是第一个值得学习的设计点。2. token 模块登录态与自动跳转 token 模块只有两个 mutation却是最教科书的写法。状态初始化从 sessionStorage 读取const state { token: sessionStorage.getItem(token) }token 从浏览器 sessionStorage 初始化页面刷新后登录态依然保留——这是会话持久化的常用技巧。mutations让状态与存储同步TOKEN_CREATE { state.token token; sessionStorage.setItem(token, token); }, TOKEN_DELETE { sessionStorage.removeItem(token); state.token null; }state 与 sessionStorage 在 mutation 中成对写入保证两边永远一致不会出现内存里已登出、存储里还留着 token的不一致问题。action一行代码完成登录后跳转admin/src/vuex/actions/token.js中的createToken在登录成功后 dispatchTOKEN_CREATE再执行this.$router.replace(posts)跳到草稿列表页。而deleteToken有个容易忽略的细节它直接调用导入的router.go(login)不用this.$router——因为这个 action 有时是在封装的 fetch 函数里被调用的比如请求返回 401 时此时拿不到组件实例this上不存在 $router。这是初学者常踩的坑。3. post 模块草稿全生命周期管理 post 模块是整个状态管理的核心管理一篇草稿从创建 → 编辑 → 保存 → 发布 → 删除的完整生命周期。源码注释里明确了概念区分post 其实只是笔记/草稿article 才是发布后对外可见的文章。这个区分贯穿整个模块。3.1 state 设计几个字段管住全局const state { all: [], // 草稿完整列表 currentPostId: null, // 当前草稿 ID currentPostIndex: -1, // 当前草稿下标 articleId: null, // 对应的已发布文章 ID title: , // 当前草稿标题 postSaved: true, // 内容是否已保存 postTitleSaved: true // 标题是否已保存 }最精妙的是postSaved/postTitleSaved两个布尔标记。内容与标题是两个独立的异步保存请求已保存状态必须分开跟踪才能准确判断现在能不能切换草稿。3.2 mutations处处是未保存保护每个写操作都带有守卫。以切换草稿为例POST_FOCUS { // 当前草稿还没保存的话不允许切换 if (state.postSaved state.postTitleSaved) { state.currentPostIndex index; state.currentPostId state.all[index].id; state.title state.all[index].title; } }同样的守卫也出现在RECEIVE_ALL_POSTS未保存时跳过列表刷新和POST_DELETE未保存时禁止删除中从机制上杜绝误切换导致内容丢失这类常见 bug。3.3 草稿操作全景表Mutation触发时机作用RECEIVE_ALL_POSTS列表接口返回后替换草稿列表未保存时跳过POST_FOCUS点击列表中某篇切换当前草稿并同步标题POST_EDIT编辑器开始输入标记内容未保存POST_SAVE内容保存成功恢复已保存状态POST_TITLE_EDIT/POST_TITLE_SAVE标题编辑/保存标题保存标记独立于内容POST_TITLE_MODIFY标题请求成功本地同步新标题POST_EXCERPT_MODIFY摘要被修改更新当前草稿摘要POST_TAG_MODIFY标签被修改标记为未发布POST_LAST_EDIT_TIME任意修改后记录最后编辑时间POST_CREATE新建草稿列表头部插入并自动聚焦POST_PUBLISH发布成功写入 articleId 并标记已发布POST_DELETE删除成功移除条目自动切回第一篇3.4 actions请求 → dispatch标准套路admin/src/vuex/actions/post.js里的每个 action 都遵循同一套节奏调用admin/src/services/posts/index.js中的接口封装了drafts、publications等 Koa 后台路由请求成功后dispatch对应 mutation返回 Promise方便组件层 catch 错误deletePost是个典型例子export const deletePost ({ dispatch, state }) { if (state.post.postSaved) { return service.deleteDraft(state.post.currentPostId).then(res { if (res.success) dispatch(types.POST_DELETE); }); } let err new Error(); err.error_message 文章尚未保存,请稍后再试; return Promise.reject(err); }是否已保存的校验被前置到 action 层并统一抛出友好报错组件层完全不用关心这些细节。3.5 getters组件唯一的读窗口admin/src/vuex/getters/post.js对外暴露postList、currentPostId、currentPostIndex、postTitle、postSaved、postTitleSaved、articleIdOfPost等派生值。组件只通过这些 getter 读状态不直接摸模块内部状态流向一目了然。4. 总结可复用的三步模块编写法 ⚡从这两个模块可以提炼出新增一个 Vuex 模块的通用步骤新手直接照做即可定常量在admin/src/vuex/mutation_types.js中统一导出 mutation 类型字符串杜绝拼写错误写模块在admin/src/vuex/modules/下新建文件定义statemutations并在admin/src/vuex/modules/index.js注册完成数据层接业务在admin/src/vuex/actions/封装接口并在请求完成后 dispatch mutation在admin/src/vuex/getters/暴露只读派生值另外一个值得一提的细节admin/src/vuex/store.js中开启了strict: debug——开发环境下任何绕过 mutation 直接改 state的误操作都会立刻报错生产环境则自动关闭。这种环境差异化配置非常值得借鉴。5. 动手试试 git clone https://gitcode.com/gh_mirrors/ko/kov-blog克隆后重点看admin/src/vuex/下的 6 个小文件不到 200 行代码就完整演示了博客平台中 Vuex 状态管理的标准姿势分层分模块、未保存守卫、会话持久化。如果你能讲清POST_EDIT到POST_SAVE的完整流转过程这篇教程的核心内容就掌握了。【免费下载链接】kov-blogA blog platform built with koa,vue and mongoose. 使用 koa ,vue 和 mongo 搭建的博客页面和支持markdown语法的博客编写平台,自动保存草稿。博客地址:https://chuckliu.me项目地址: https://gitcode.com/gh_mirrors/ko/kov-blog创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考