学习不一样的vue5:vuex(完结)
首先
- 首发博客: 我的博客
- 项目源码: 源码(喜欢请star)
- 项目预览: 预览
- 上一章: 《学习不一样的vue4:mock与axios实战2》
- 我的Q群: meteor高手群 vue学习交流群
今天的任务
- 利用vuex改造项目
- 完成余下的交互代码
vuex基础
新增知识点(必读)
- 组件通信
- Vuex 是什么?
为什么用vuex?
读了上面的知识点,您应该了解了vuex是干什么的,那我们这个项目为什么用vuex,做到这一步的小伙伴应该知道,我们所有组件,不管是菜单,还是详情都是同一组数据,但是它们的关系并不是父子组件,而我们想让他们共享一组数据并且互相通信,该怎么做呢?这里就要用到我们的主角vuex。
安装
1
|
npm install vuex --save
|
State,Mutation
新建src/vuex/store.js
新增知识点(必读)
- State
- mutations
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import Vue from 'vue';
import Vuex from 'vuex';
import * as actions from './actions';
import * as getters from './getters';
Vue.use(Vuex); //安装 Vuex 插件
// 创建初始应用全局状态变量
const state = {
todoList: [], //指我们的待办事项列表数据
menuOpen: false //移动端的时候菜单是否开启
};
// 定义所需的 mutations
const mutations = {
EDITTODE(state, data) { // 定义名为 EDITTODE函数用作改变todoList的值
state.todoList = data;
},
MENUOPEN(state) { // 定义名为 MENUOPEN函数用作改变menuOpen的值
state.menuOpen = !state.menuOpen;
}
};
// 创建 store 实例并且导出
export default new Vuex.Store({
actions,
getters,
state,
mutations
});
|
Getter
创建src/vuex/getters.js
新增知识点(必读)
- Getter
1
2
3
4
|
export const getTodoList = state => {
return state.todoList; // 派生状态todoList
};
|
Action
创建src/vuex/action.js
新增知识点(必读)
- Action
- promise
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import {
getTodoList
} from '../api/api';
// 引入api接口函数getTodoList,请求最新的代办事项列表数据
export const getTodo = ({ //定义一个名字为getTodo的事件
commit
}) => {
return new Promise((resolve) => {
/**
*调用 getTodo这个函数的时候
会调用getTodoList这个ajax请求函数,
函数返回值后,在调用store.js里面的EDITTODE方法,并且把值传给它。
*/
getTodoList().then( res => {
commit( 'EDITTODE', res.data.todos);
resolve();
});
});
};
export const updateMenu = ({ //定义一个名字为updateMenu的事件
commit
}) => {
commit( 'MENUOPEN'); // 调用store.js里面的MENUOPEN方法
};
|
注入实例
回到 src/main.js
1
2
3
4
5
6
7
8
9
10
|
import store from './vuex/store'; // 引入vuex实例
new Vue({
el: '#app',
router,
store, //注入
template: '
components: {
App //
}
});
|
项目改造vuex
移动端菜单
打开src/components/layouts.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
+ <section class="container" :class="{'menu-open': menuOpen}">
<section class="menu">
<menus>menus>
section>
+ <div class="content-overlay" @click="$store.dispatch('updateMenu')">div>
<div class="content-container">
<router-view>router-view>
div>
section>
template>
...
|
结果
如果是以下情况,那么改造就成功了
###代办项修改,锁定,删除
修改
打开 src/components/todo.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
...
...
+
...
+
...
+
|
结果
锁定
打开 src/components/todo.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
...
....
|
结果
删除
打开 src/components/todo.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
...
+
....
|
结果
代办项单项修改,锁定,删除
打开src/components/Item.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
|