##0. 今日目标
1.Vuex概述
2.Vuex基本使用
3.使用Vuex完成todo案例
问题

vuex介绍:更适合用于传递数据,包括大范围传递

好处

哪些数据适合存储

使用步骤


创建vuex项目
选择目录

创建项目

选择手动配置

选择依赖

eslint配置

创建成功之后,默认有store.js文件

在这个文件中,导入了vue和vuex
并且注册了vuex
然后暴露了vuex的store数据
大家在创建出来之后,没有store.js,而是store/index.js(跟router一样,版本导致的)

main文件

运行

默认界面

app界面修改,删除之前的所有内容,修改如下:

效果

删除HelloWorld

减法界面:components/Subtraction.vue

加法界面:components/Addition.vue

app界面导入俩界面:

效果

配置格式的语法处理:末尾分号,单引号(根目录新建.prettierrc)

提交本地仓库

核心

State介绍

定义共享数据count

访问count

效果

第二种用法

减法中使用第二种方式

导入mapState之后,就可以使用第二种用法:可以将store共享数据,映射为计算属性
mapState(['count'])找到store里的count数据
... 展开运算符,只有展开之后,才能映射成功为计算属性
最终相当于在computed中定义了一个count属性:
computed:{ count:0}效果

+1操作

效果:可以成功,并且没有报错

Mutation介绍:mutation:变化的意思

为啥只能通过mutation来操作store的数据呢?
为了统一管理,可以将修改store值的操作,统一在一起,可以方便监控数据的变化
比如:在Addition和Subtracion以及其他很多界面,都是直接修改count的值,那么后期发现count的值有问题,那么我们就需要找很多文件,一个一个文件排查才可能找出问题,不方便监控数据的变化

mutation中定义add方法,修改count

触发add方法

mutation传参

定义方法时,
第一个参数是固定接收state对象,参数名可以改,但是一般都是state
第二个参数step(自定义),就是我们在调用时传递的第一个参数
commit:调用方法时
定义带参数的mutations方法

调用带参数的mutations方法

效果

mutations第二种用法:映射函数

最终效果相当于:
xxxxxxxxxxmethods: { add(state) { state.count++ }, addN(state, step) { state.count += step },}定义sub方法

使用

带参数的方法

映射带参数的方法

效果:点击一次-1按钮,再点击一次-N按钮,如下:

先来看一个现象:通过vue调试工具中的第二个窗口,vuex数据窗口

我们来处理一个延迟逻辑

效果:

发现点击了+1之后,1s之后界面显示了count为1
但是vue调试工具中,count还是为0
虽然能够成功,但是调试工具出了问题,所以mutations中不能执行异步操作

Action介绍

异步操作都定义到actions中
actions中要操作数据,必须通过commit触发方法来修改
actions中不能直接修改store的数据,数据只能在mutations中修改
异步方法必须有一个参数,context,代表当前store实例对象
触发action
异步方法定义

触发异步方法

效果

异步参数

添加异步参数方法

Addition方法,添加按钮

定义方法

效果

Action第二种用法:映射

定义异步方法

定义按钮

导入

映射,调用

效果

这里映射的subAsync也可以直接使用

带参数的第二种用法

效果

getter介绍

getter使用介绍

定义getters方法,并使用

效果

第二种用法:映射

效果

介绍:案例Todos,跟jquery中的todolist类似

添加

选中某个任务,当前任务状态为已完成(右下角条数,为未完成任务数)

未完成:点击下方未完成按钮,切换未完成列表

已完成

清楚已完成(还有删除功能,不在截图)

初始化步骤

通过vue ui,创建项目

安装依赖


初始化代码(整个todo列表的代码):这些代码都在素材的vue-todos.txt中

修改main.js文件
代码:复制即可
ximport Vue from 'vue'import App from './App.vue'// 1. 导入 ant-design-vue 组件库import Antd from 'ant-design-vue'// 2. 导入组件库的样式表import 'ant-design-vue/dist/antd.css'Vue.config.productionTip = false// 3. 安装组件库Vue.use(Antd)new Vue({ render: h => h(App)}).$mount('#app')替换main.js中所有代码

修改App.vue
代码:直接复制
xxxxxxxxxx<template> <div id="app"> <a-input placeholder="请输入任务" class="my_ipt" /> <a-button type="primary">添加事项</a-button> <a-list bordered :dataSource="list" class="dt_list"> <a-list-item slot="renderItem" slot-scope="item"> <!-- 复选框 --> <a-checkbox>{{item.info}}</a-checkbox> <!-- 删除链接 --> <a slot="actions">删除</a> </a-list-item> <!-- footer区域 --> <div slot="footer" class="footer"> <!-- 未完成的任务个数 --> <span>0条剩余</span> <!-- 操作按钮 --> <a-button-group> <a-button type="primary">全部</a-button> <a-button>未完成</a-button> <a-button>已完成</a-button> </a-button-group> <!-- 把已经完成的任务清空 --> <a>清除已完成</a> </div> </a-list> </div></template><script>export default { name: 'app', data() { return { list: [ { id: 0, info: 'Racing car sprays burning fuel into crowd.', done: false }, { id: 1, info: 'Japanese princess to wed commoner.', done: false }, { id: 2, info: 'Australian walks 100km after outback crash.', done: false }, { id: 3, info: 'Man charged over missing wedding girl.', done: false }, { id: 4, info: 'Los Angeles battles huge wildfires.', done: false } ] } }}</script><style scoped>#app { padding: 10px;}.my_ipt { width: 500px; margin-right: 10px;}.dt_list { width: 500px; margin-top: 10px;}.footer { display: flex; justify-content: space-between; align-items: center;}</style>
替换App.vue中所有代码

效果(如果这一步出现不了,就处理下一步eslint)

eslint校验

eslintrc.js中增加:

去除末尾分号,单引号:新建.prettierrc文件,增加如下

挂载store
我们创建的项目 会多个 store 文件夹 所以引入的路径也要做出相应调整 (./store/index.js)

查看原有结构:
数据list

a-list列表组件,显示list数据

list数据剪切到list.json中

新建list.json,粘贴list数组数据

目前还没有获取list.json数据,所以是空列表

通过axios异步获取list.json数据

调用

数据打印

刚刚的数据,只是打印出来了,我们需要将这个数据交由store处理

使用异步方法:映射方式使用

效果

####
store.js中定义inputValue数据,App.vue中映射inputValue

input控件绑定value属性与inputValue进行绑定

效果:inputValue的值,显示到input控件中

input控件添加change事件

定义修改inputValue的mutations方法setInputValue,然后在handle中调用此方法

效果:修改文本框的值,inputValue的值也会修改

添加点击事件

事件方法
在app.vue中定义addItemToList方法
在store.js中定义addItem方法

addItem中组件了一个obj对象,这个对象为啥有id,info,done属性呢?如下图:

nextId:这个值为5,这是因为list.json中最大是4,所以我们这里定义一个5。然后在添加完之后自增+1即可

效果

删除事件

删除逻辑
store.js中增加removeItem方法
app.vue中增加removeItemById方法

这里在splice之前,增加了一个索引i是否等于-1的判断,为啥之前类似的逻辑并没有添加过?
其实之前的逻辑也应该添加的,如果是-1的话,就会从末尾开始删除

效果

复选框选中状态,跟数据中的done完成数据是相关的,我们现在改变俩值

在界面上,通过vue调试工具,可以看见刚刚改的数据,已经生效:

增加checkbox的属性checked,绑定item的done属性即可

效果:

checkbox添加改变事件

注意:这里其实可以简单点,直接写事件函数,通过$event代表当前事件对象

改变状态逻辑
store.js中增加changeStatus方法
app.vue中增加cbStatusChanged方法

修改前

修改后:

开始处理未完成任务数

添加getters
store.js中增加getters方法,unDoneLength,统计未完成数量
app.vue中映射getters

效果

处理清除功能

添加点击事件

增加清除逻辑
store.js的mutations中增加方法cleanDone
app.vue中增加clean方法

清除前

清除后

底部切换按钮,切换之后高亮随之改变

按钮的点击事件

改变viewkey值

viewKey定义:这个值就代表当前高亮显示的按钮,默认all,代表全部这个按钮高亮

映射viewkey

根据viewKey的值,判断按钮显示primary还是default

未完成点击时,viewKey为undone,并且按钮高亮

已完成点击时,viewKey为done,并且按钮高亮

全部点击时,viewKey为all,并且按钮高亮

增加getters方法:infolist

映射infolist

修改a-list绑定额数据源为infolist

效果:
