学习不一样的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 ...
随机推荐
- vue 路由传参 以及获取参数
1.通过query实现: <router-link :to="{ name:'home',query:{id:1} }">跳转页面</router-link> ...
- C语言与汇编的嵌入式编程:求100以内素数
写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include <stdio.h> void main(){ int i,j; ; ;i<=;i+ ...
- netty笔记-:EpollEventLoopGroup:Caused by: java.lang.ExceptionInInitializerError:Caused by: java.lang.IllegalStateException: Only supported on Linux
今天在翻看netty的源码的时候发现netty对EventLoopGroup的实现有不止常用的NIOEventLoopGroup ,一共有以下几种. EpollEventLoopGroup NioEv ...
- nginx+keepalived+tomcat实现主从高可用负载均衡
设备: 1.准备四台虚拟机,两台tomcat,两台nginx 2.两台tomcat配置相同,测试页不同 两台Tomcat配置完全相同.只有测试页面不同 安装jdk和tomcat [root@local ...
- 使用python实现归并排序、快速排序、堆排序
归并排序 使用分治法:分而治之 分: 递归地拆分数组,直到它被分成两对单个元素数组为止. 然后,将这些单个元素中的每一个与它的对合并,然后将这些对与它们的对等合并,直到整个列表按照排序顺序合并为止. ...
- git合并分支到master上面
转自:https://www.cnblogs.com/mafeng/p/10173919.html 假如我们现在在dev分支上,刚开发完项目,执行了下列命令 git add .git commit - ...
- ubuntu循环登录
ubuntu12.04管理员账户登录不了桌面,只能客人会话登录 登录管理员账户时,输入密码后,一直在登录界面循环 费了好大劲啊,一上午的时间,终于搞定了,哈哈哈 ctrl+alt+f1 ,切换到tty ...
- 【原】jenkins知识点_凭据(一)
一:凭据 1.目的: 与第三方网站或应用程序进行交互,如代码仓库.云存储系统和服务等 2.操作路径: Jenkins-凭据-系统-全局凭据 3.权限 Jenkins 中保存的凭证可以用于: 任何适用于 ...
- 20200213springboot日记
------------恢复内容开始------------ ------------恢复内容开始------------ ------------恢复内容开始------------ 数据库管理 L ...
- navicat for mysql 中文破解版(无需激活码)
1.下载破解版Navicat for MySQ中文破解版 链接: https://pan.baidu.com/s/19BlJRx7tLnDPIM4U6DNWvA 提取码: d9ci 2.解压下载后的文 ...