Vuex 使用指南

  • 前言
  • 案例需求
  • 第一步:state
  • 第二步:Getter
  • 第三步:Mutation
  • 第四步:Action
  • 第五步:属性或者方法整合
  • 实现功能

前言

Vuex 是为 Vue 专门制定的状态管理工具。其核心思想是将所有的状态集中在顶层进行统一管理。通过不同的事件类型,进行统一分发不同的状态,再通过状态去影响视图层。

在使用前执行npm install Vuex下载 Vuex。

案例需求

实现一个 todoList (任务管理功能),包含的功能有:

  1. 获取初始任务列表;
  2. 添加待办事项;
  3. 编辑任务状态(将任务置为未完成或者已完成);
  4. 删除待办事项;
  5. 查询任务列表(按状态已完成/未完成/所有查询)。

第一步:state

state 是驱动应用的数据源,是一棵单一状态树。根据案例所示,需要创建一个 taskList,用来储存任务列表信息。

  state: {taskList:[],//初始化任务列表filter:'all'//初始化任务状态,默认显示所有列表},

第二步:Getter

如果多个组件需要使用到同一个变量,可以封装在 Getter 中。或者 Getter 中也可以改变状态。根据案例所示,需要创建一个改变 filter 状态的方法 changeFilter,是否展示任务项方法 isDisplay。

    //是否展示任务项isDisplay:state => item =>{if(state.filter == 'all'){return true};if(state.filter == 'completed'){if(item.done){return true}else {return false}}if(state.filter == 'uncompleted'){if(!item.done){return true}else {return false}}},//改变过滤状态changeFilter: state =>flag=> {state.filter = flag;},

第三步:Mutation

更改 state 状态的唯一办法就是 Mutation,并且 Mutation 必须是同步函数。根据案例所示,需要创建添加任务方法 addTodo,获取初始任务列表方法 getInitData,编辑任务状态方法 changeStatus、删除任务方法 delTask。

    //添加任务列表addTodo(state,item){//新添加item的id根据列表最后的id自增item.id = state.taskList[state.taskList.length-1].id+1;state.taskList = [...state.taskList,item];},//获取初始任务列表getInitData(state,arr){state.taskList = arr;},//修改任务状态changeStatus(state,item){item.done = !item.done;},//删除任务delTask(state,index){state.taskList.splice(index,1);}

第四步:Action

Action 中主要是分发 Mutation,与 Mutation 的区别是可以在这里处理异步操作。比如调取接口获取初始任务列表信息。

    //模拟异步获取任务列表getDataAsync (context) {var arr = [];setTimeout(() => {arr = [{text:"国际会议",id:1,done:true}];context.commit('getInitData',arr);}, 1000)}}

第五步:属性或者方法整合

mapState:是将所有的 State 整合在一起。
mapGetters:是将所有的 Getters 整合在一起。
mapMutations:是将所有的 Mutations 整合在一起。
mapActions:是将所有的 Actions 整合在一起。
以上带 map 的方法是一个整合作用,在使用多个 state 或者方法时可以直接用 this.的形式,而不用 this.$ store.形式,比如对于被 state 储存的 taskList。在组件中使用时可以直接this.taskList,而不用 this.$store.state.taskList。

实现功能

  1. 在项目跟目录新建 store 文件夹,在其文件夹下新建 index.js。

index.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
//创建Store实例
const store = new Vuex.Store({state: {taskList:[],//初始化任务列表statusList:[{label:"所有",flag:'all'},{label:"已完成",flag:'completed'},{label:"未完成",flag:'uncompleted'}],//任务状态列表filter:'all'//初始化任务状态},getters: {//是否展示任务项isDisplay:state => item =>{if(state.filter == 'all'){return true};if(state.filter == 'completed'){if(item.done){return true}else {return false}}if(state.filter == 'uncompleted'){if(!item.done){return true}else {return false}}},//改变过滤状态changeFilter: state =>flag=> {state.filter = flag;},},mutations: {//添加任务列表addTodo(state,item){//新添加item的id根据列表最后的id自增item.id = state.taskList[state.taskList.length-1].id+1;state.taskList = [...state.taskList,item];},//获取初始任务列表getInitData(state,arr){state.taskList = arr;},//修改任务状态changeStatus(state,item){item.done = !item.done;},//删除任务delTask(state,index){state.taskList.splice(index,1);}},actions: {//模拟异步获取任务列表getDataAsync (context) {var arr = [];setTimeout(() => {arr = [{text:"国际会议",id:1,done:true}];context.commit('getInitData',arr);}, 1000)}}
});
export default store;
  1. 新建 Vuex.vue 文件,编写功能代码。
<template><div class="vuex-m-20"><div class="vuex-tx-c">todo list 案例</div><div class="vuex-m-20"><input type="text" v-model="text"><button @click="add">添加待办</button><div v-for="(item,index) in taskList" v-if="show(item)" ><span :class="item && item.done?'vuex-line':''" @click="operate('change',item)">{{item.text}}</span><span class="vuex-ml-20" @click="operate('del',index)">删除</span></div></div><div><div class="vuex-mtb-20"><span @click="query(item.flag)" class="vuex-ml-20" v-for="item in statusList" >{{item.label}}</span></div></div></div>
</template>
<script>import { mapState,mapGetters,mapMutations,mapActions} from 'vuex';export default {name: 'Vuex',data () {return {text:""}},created(){//获取初始任务列表this.getDataAsync();},computed: {//监听任务列表变化taskList(){return this.taskList;},//任务状态列表statusList(){return this.statusList;},//过滤任务列表show(){return item =>{return this.isDisplay(item);}},...mapGetters(['changeFilter','isDisplay']),...mapState(['taskList','statusList','filter'])},methods: {...mapMutations(['addTodo','changeStatus','delTask']),...mapActions(['getDataAsync']),add(){// 添加任务项this.addTodo({text:this.text,done:false});},//按完成状态查询任务列表query(status){this.changeFilter(status);},//编辑任务状态和删除任务operate(str,param){if(str == 'change'){this.changeStatus(param);}else {this.delTask(param)}}}}
</script>
<style scoped>.vuex-m-20{margin: 20px;}.vuex-line{text-decoration:line-through}.vuex-ml-20{margin-left: 20px;}.vuex-tx-c{text-align: center;}.vuex-mtb-20{margin: 20px 0;}
</style>

Vuex 使用指南(todoList 案例)相关推荐

  1. Redux 使用指南(todoList 案例)

    Redux 使用指南 前言 案例需求 实现思路 第一步:定义 Action 第二步:定义 Reducer 第三步:整合 Reducer 第四步:定义 Store 第五步:处理业务逻辑 第六步:注意事项 ...

  2. Vue之Todolist案例和ES6语法

    2.7 Todolist案例 2.7.1 准备工作 <!DOCTYPE html> <html> <head><meta charset="utf- ...

  3. Vue.js-Day02-AM【Vue表单、核心指令(单选框、密码框、多行文本框、单选、多选、勾选、下拉列表)、组件汇总案例、ToDoList案例、计算属性(computed)、watch监听】

    Vue.js实训[基础理论(5天)+项目实战(5天)]博客汇总表[详细笔记] 目   录 1.Vue表单 原生JS实现异步表单提交 运行截图 代码 核心指令 单选框.密码框.多行文本框 单选 多选 勾 ...

  4. js 操作vuex数据_Vue.js中使用Vuex实现组件数据共享案例

    当组件中没有关联关系时,需要实现数据的传递共享,可以使用Vuex 先不管图片 一.安装 在vue cli3中创建项目时勾选这个组件就可以了 或者手动安装 npm install store --sav ...

  5. HTML5与CSS3权威指南笔记案例1

    第1章 <!DOCTYPE html> <meta charset = "UTF-8"> <title> Search </title&g ...

  6. Vue版todolist案例

    Vue版todolist案例 todolist – 记录你的待办事项 <!DOCTYPE html> <html><head><meta charset=&q ...

  7. vue2.0-脚手架-todolist案例

    一 vue脚手架2.0 安装 npm install vue-cli -g 查阅一下脚手架可支持的模板 vue list可以查到 template-name 使用脚手架生成项目(以下命令得运行在项目的 ...

  8. 【Vue2.0】— TodoList案例(十七)

    [Vue2.0]- TodoList案例(十七) <template><div id="root"><div class="todo-con ...

  9. 尚硅谷todolist案例

    vue todolist案例 1 拆分组件 一共拆分为4个组件 TodoHeader TodoItem TodoList TodoFooter item是list的子组件 2 组件化编码流程 实现静态 ...

最新文章

  1. redis3.2集群搭建
  2. 数字签名和数字证书详解
  3. OpenFOAM流固耦合问题-FsiFoam(foam-extend-4.0)运行tutorials的bug修复
  4. 拼接大屏数据展示_可视化大屏的UI设计是根据哪几个方面来进行?
  5. codevs——1036 商务旅行
  6. 微信又添新表情,“我裂开了”!
  7. 致敬 HarmonyOS 不平凡的 2020,热情背后还有多少期待
  8. SQL SERVER中查询无主键的SQL
  9. qt中如何使用mysql_qt中如何使用mysql 以及静态编译qt中如何加上mysql(1)
  10. 移动办公平台忘记密码怎么办?移动办公平台下载
  11. 信用卡+购物商城+ATM管理练习
  12. 深度学习基础 - 余弦定理
  13. pla3d打印材料密度_最新研究:PLA在3D打印中产生的有害气体最少
  14. 2017安防民用市场现状及特点浅析
  15. 量化交易学习(10)均线交叉策略
  16. 宏基aspire 4920 win10录音没有声音解决方法
  17. Long Press(长按功能)
  18. 基于javaweb的旅游管理系统(java+jsp+html5+bootstrap+servlet+mysql)
  19. windows8 下载
  20. python少儿编程面试经验_编程猫少儿编程南京奥体中心

热门文章

  1. 图新地球加载倾斜模型看不清楚--一次Quadro显卡的问题排查记录
  2. 性能最强的linux,Quadro显卡多系统测试 Linux环境性能最强
  3. kettle javaScript组件字符串全替换
  4. 游戏产品在移动平台和pc平台研发选择问题
  5. 义教志愿服务系统c语言,[志愿服务]以己为师 东科学子义教传爱心
  6. Java 面试知识点解析——Web篇
  7. 【bzoj 2383】ballons(单调栈)
  8. Excel使用VBA批量插入Object
  9. JS 使用搜狐接口获取客户端IP地址
  10. 计算机视觉大牛代季峰从商汤离职,加入清华电子系