学习不一样的vue5:vuex(完结)
学习不一样的vue5:vuex(完结)
首先
今天的任务
- 利用vuex改造项目
- 完成余下的交互代码
vuex基础
新增知识点(必读)
为什么用vuex?
读了上面的知识点,您应该了解了vuex是干什么的,那我们这个项目为什么用vuex,做到这一步的小伙伴应该知道,我们所有组件,不管是菜单,还是详情都是同一组数据,但是它们的关系并不是父子组件,而我们想让他们共享一组数据并且互相通信,该怎么做呢?这里就要用到我们的主角vuex。
安装
1
|
npm install vuex --save
|
State,Mutation
新建src/vuex/store.js
新增知识点(必读)
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
新增知识点(必读)
1
2
3
4
|
export const getTodoList = state => {
return state.todoList; // 派生状态todoList
};
|
Action
创建src/vuex/action.js
新增知识点(必读)
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: '<App/>',
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
|
<template>
+ <section class="container" :class="{'menu-open': menuOpen}">
<!-- 根据menuOpen的值来判断是否使用menu-open样式 -->
<section class="menu">
<menus></menus>
</section>
+ <div class="content-overlay" @click="$store.dispatch('updateMenu')"></div>
<!-- 这个是当页面收缩覆盖在内容上面的模糊层,点击后复原 他可以直接调用vuex actions.js里面的updateMenu方法-->
<div class="content-container">
<router-view></router-view>
</div>
</section>
</template>
<script>
...
computed: {
menuOpen() {
return this.$store.state.menuOpen;
}
};
...
</script>
|
打开 src/components/todo.vue
1
2
3
4
5
6
|
<template>
...
+ <div class="nav-group" @click="$store.dispatch('updateMenu')" v-show="!isUpdate">
<!-- 在菜单的图标下面添加updateMenu时间,他可以直接调用vuex actions.js里面的updateMenu方法 -->
...
<template>
|
结果
菜单改造
打开src/components/menus.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
|
<template>
...
+ <a @click="goList(item.id)" class="list-todo list activeListClass" :class="
{'active': item.id === todoId}" v-for="(item,index) in todoList" :key="index">
<!-- 把以前的item换成todoList -->
...
</template>
<script>
...
export default {
...
computed: {
+ todoList() {
return this.$store.getters.getTodoList; // 返回vuex getters.js 定义的getTodoList数据
}
},
+ created() {
this.$store.dispatch('getTodo').then(() => { //调用vuex actions.js 里面的 getTodo函数
this.$nextTick(() => {
this.goList(this.todoList[0].id);
});
});
},
methods: {
+ addTodoList() { // 点击新增按钮时候
//调用vuex actions.js 里面的 getTodo函数
addTodo({}).then(data => {
this.$store.dispatch('getTodo').then(() => {
this.$nextTick(() => {
setTimeout(() => {
this.goList(this.todoList[this.todoList.length - 1].id);
}, 100);
});
});
});
}
}
};
...
</script>
...
|
结果
如果是以下情况,那么改造就成功了
###代办项修改,锁定,删除
修改
打开 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
|
<template>
...
+ <div class="form list-edit-form" v-show="isUpdate">
<!-- 当用户点击标题进入修改状态,就显示当前内容可以修改 -->
+ <input type="text" v-model="todo.title" @keyup.enter="updateTitle" :disabled="todo.locked">
+ <div class="nav-group right">
+ <a class="nav-item" @click="isUpdate = false">
+ <span class="icon-close">
+ </span>
+ </a>
+ </div>
+ </div>
...
+ <div class="nav-group" @click="$store.dispatch('updateMenu')" v-show="!isUpdate">
...
+ <h1 class="title-page" v-show="!isUpdate" @click="isUpdate = true">
...
+ <div class="nav-group right" v-show="!isUpdate">
</template>
<script>
...
export default {
data() {
return {
+ isUpdate: false // 新增修改状态
}
}
methods: {
+ updateTodo() {
+ let _this = this;
+ editTodo({
+ todo: this.todo
+ }).then(data => {
// _this.init();
+ _this.$store.dispatch('getTodo');
});
},
+ updateTitle() {
+ this.updateTodo();
+ this.isUpdate = false;
},
}
}
</script>
|
结果
锁定
打开 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
|
<template>
...
+ <a class=" nav-item" @click="onlock">
<!-- cicon-lock锁定的图标icon-unlock:非锁定的图标 -->
<span class="icon-lock" v-if="todo.locked"></span>
<span class="icon-unlock" v-else>
</span>
</a>
....
</template>
<script>
...
methods: {
+ onlock() {
+ this.todo.locked = !this.todo.locked;
+ this.updateTodo();
+ }
}
...
</script>
|
结果
删除
打开 src/components/todo.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<template>
...
<a class="nav-item">
+ <span class="icon-trash" @click="onDelete">
</span>
</a>
....
</template>
<script>
...
methods: {
+ onDelete() {
+ this.todo.isDelete = true;
+ this.updateTodo();
+ },
}
...
</script>
|
结果
代办项单项修改,锁定,删除
打开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
|
<template>
<transition name="slide-fade">
<div class="list-item editingClass editing " :class="{checked: item.checked}" v-show="!item.isDelete">
<label class="checkbox">
<input type="checkbox" v-model="item.checked" name="checked" @change="onChange" :disabled="locked">
<span class="checkbox-custom"></span>
</label>
<input type="text" v-model="item.text" placeholder='写点什么。。。' :disabled=" item.checked || locked" @keyup.enter="onChange">
<a class="delete-item" v-if="item.checked && !locked" @click="item.isDelete = true;onChange()">
<span class="icon-trash"></span>
</a>
</div>
</transition>
</template>
<script>
// item 是todo的子组件,他接受一个对象item,来进行处理
import { editRecord } from '../api/api';
export default {
props: {
item: {
type: Object,
default: () => {
return {
checked: false,
text: '你好,世界'
}
}
},
'index': {
},
'id': {
},
'init': {
},
'locked': {
},
},
methods: {
// 用户无论删除,修改,锁定都可以利用这个方法。
onChange() {
editRecord({
id: this.id, record: this.item, index: this.index
}).then(data => {
this.init();
this.$store.dispatch('getTodo');
});
}
}
};
</script>
<style lang="less">
@import '../common/style/list-items.less';
.slide-fade-enter-active {
transition: all .3s ease;
}
.slide-fade-leave-active {
transition: all .3s cubic-bezier(1.0, 0.5, 0.8, 1.0);
}
.slide-fade-enter, .slide-fade-leave-active {
transform: translateX(10px);
opacity: 0;
}
</style>
|
结果
学习不一样的vue5:vuex(完结)的更多相关文章
- day 84 Vue学习六之axios、vuex、脚手架中组件传值
Vue学习六之axios.vuex.脚手架中组件传值 本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的 ...
- day 87 Vue学习六之axios、vuex、脚手架中组件传值
本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的使用 Axios 是一个基于 promise 的 HT ...
- [Prodinner项目]学习分享_第四部分(完结篇)_Controller层(控制器)
Controller作用: 数据从数据库查询出来后,通过一定的业务逻辑,筛选出来一个结果集,我们最终的目的是要将这个结果集在页面中显示的. Controller就是起到这个作用,将业务逻辑层的结果集调 ...
- Vuex学习笔记(-)安装vuex
什么是Vuex? vuex是一个专门为vue.js应用程序开发的状态管理模式.即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. 安装vuex(前提是已经安装好vue-cli脚手 ...
- vue学习笔记(五):对于vuex的理解 + 简单实例
优点:通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护.使用vuex来引入外部状态管理,将业务逻辑切分到组件外,可以避免重复的从服务端抓取数据. 详情请参考官 ...
- 前端MVC Vue2学习总结(九)——Vuex状态管理插件
一.概要 1.1.Vuex定义与注意事项 Vuex是为vue.js框架更好的管理状态而设计一个插件.Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的 ...
- 【Vue】Vue学习(四)-状态管理中心Vuex的简单使用
一.vuex的简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.Vuex背后的基本思想,就是前面所说的单向数据流.图4就是Vuex实现单向数据流的示意图. Store ...
- TypeScript学习文档-基础篇(完结)
目录 TypeScript学习第一章:TypeScript初识 1.1 TypeScript学习初见 1.2 TypeScript介绍 1.3 JS .TS 和 ES之间的关系 1.4 TS的竞争者有 ...
- 设计模式C++学习笔记之二十(完结篇 & 面向对象原则)设计模式C++实例下载
Prototype(原型模式) 20.1.解释 概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. main(),客户 ICloneableNow,只有一个接口Clone CM ...
随机推荐
- 将linux上的项目传到github上
在网友的帮助下,终于学会了这一招. 1.首先要确定你的linux上有安装了git. 2.到你的网页github上新建一个仓库,将其clone到linux上. 3.将你的项目放进这个空的仓库(文件夹). ...
- python日常题目小练习
1.使用while循环输出1 2 3 4 5 6 8 9 10 i=0 while i<10: i+=1 if i==7: continue print(i) 结果: 2.求1-100的所有数的 ...
- 浅析PHP页面局部刷新功能的实现小结(转)
转载地址 https://www.jb51.net/article/38901.htm 方法其实挺多的.以前比较常用的是iframe这样来做.现在多了个ajax,所以一般情况下都是用的ajax.第一种 ...
- 2020年英特尔CPU供应短缺将持续
导读 有着相当靠谱的爆料历史的台媒 DigiTimes 报道称,其预计英特尔的 CPU 供应短缺问题,将持续到 2020 年末.对于这样的预测,我们其实早已见怪不怪,毕竟该公司首席执行官 Bob Sw ...
- python正则表达式中括号的作用,形如 "(\w+)\s+\w+"
先看一个例子: import re string="abcdefg acbdgef abcdgfe cadbgfe" #带括号与不带括号的区别 regex=re.compile(& ...
- pycharm连接数据库报错Access denied for user 'root'@'localhost' (using password:YES),以及wampserver 2/3个服务器正在运行 问题
使用mysql版本为mysql5.7,参考下列 https://blog.csdn.net/qq_32969455/article/details/79051932 https://blog.csdn ...
- 「CF859E」Desk Disorder
传送门 Luogu 解题思路 一眼想到二分图:但是求不了最大匹配方案数 oho. 于是考虑这么建图: 直接将一个人可以去的两把椅子连边,然后原图中的2n个点就会形成许多联通块,这个可以分步计数. 又因 ...
- Linux - Zip乱码问题
1. 可以通过解压后使用convmv来解决文件名乱码问题,通过iconv来解决文件内容的乱码问题 2. 用unar命令
- Linux - 命令 - top命令
负载检查:https://blog.csdn.net/HANLIPENGHANLIPENG/article/details/79172053 参考:https://blog.csdn.net/gxia ...
- 安装树莓派实验的Pi 仪表盘
1.简介 树莓派仪表盘网址:Pi Dashboard (Pi 仪表盘) - MAKER 趣无尽 http://maker.quwj.com/project/10 Pi Dashboard (Pi 仪 ...