学习不一样的vue5:vuex(完结)

 发表于 2017-09-10 |  分类于 web前端|  |  阅读次数 4029

首先

今天的任务

  • 利用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(完结)的更多相关文章

  1. day 84 Vue学习六之axios、vuex、脚手架中组件传值

    Vue学习六之axios.vuex.脚手架中组件传值   本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的 ...

  2. day 87 Vue学习六之axios、vuex、脚手架中组件传值

      本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的使用 Axios 是一个基于 promise 的 HT ...

  3. [Prodinner项目]学习分享_第四部分(完结篇)_Controller层(控制器)

    Controller作用: 数据从数据库查询出来后,通过一定的业务逻辑,筛选出来一个结果集,我们最终的目的是要将这个结果集在页面中显示的. Controller就是起到这个作用,将业务逻辑层的结果集调 ...

  4. Vuex学习笔记(-)安装vuex

    什么是Vuex? vuex是一个专门为vue.js应用程序开发的状态管理模式.即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. 安装vuex(前提是已经安装好vue-cli脚手 ...

  5. vue学习笔记(五):对于vuex的理解 + 简单实例

    优点:通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,我们的代码将会变得更结构化且易维护.使用vuex来引入外部状态管理,将业务逻辑切分到组件外,可以避免重复的从服务端抓取数据. 详情请参考官 ...

  6. 前端MVC Vue2学习总结(九)——Vuex状态管理插件

    一.概要 1.1.Vuex定义与注意事项 Vuex是为vue.js框架更好的管理状态而设计一个插件.Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的 ...

  7. 【Vue】Vue学习(四)-状态管理中心Vuex的简单使用

    一.vuex的简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.Vuex背后的基本思想,就是前面所说的单向数据流.图4就是Vuex实现单向数据流的示意图.    Store     ...

  8. TypeScript学习文档-基础篇(完结)

    目录 TypeScript学习第一章:TypeScript初识 1.1 TypeScript学习初见 1.2 TypeScript介绍 1.3 JS .TS 和 ES之间的关系 1.4 TS的竞争者有 ...

  9. 设计模式C++学习笔记之二十(完结篇 & 面向对象原则)设计模式C++实例下载

      Prototype(原型模式) 20.1.解释 概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. main(),客户 ICloneableNow,只有一个接口Clone CM ...

随机推荐

  1. pwnable.kr-flag-Writeup

    MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  2. jsTree的checkbox默认选中和隐藏

    jstree复选框自定义显示隐藏和初始化默认选中 首先需要配置 Checkbox plugin "plugins" : ['checkbox'] 设置默认选中状态(checkbox ...

  3. python自动更新升级失败解决方案

    1,使用python -m pip install --upgrade pip升级失败 2,使用python -m pip install -U --force-reinstall pip依然失败 3 ...

  4. ubuntu 先安装php再安装apache后,php不解析

    本来服务器是nginx ,把他改成了apache, 安装apache, sudo apt-get updatesudo apt-get install apache2 然后访问ip,不成功 vim / ...

  5. js的split() 方法和join()方法

    定义和用法 split() 方法用于把一个字符串分割成字符串数组. String.split() 执行的操作与 Array.join 执行的操作是相反的. join() 方法用于把数组中的所有元素放入 ...

  6. ztree-可拖拽可编辑的树

    <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - addNodes / editName / rem ...

  7. Blockchain资源

    程序源码: https://github.com/HuangFJ/pyeth https://www.jianshu.com/p/b72b4eb259b8

  8. 外置ADC

    美信关于如何简化微控制器与温度传感器的接口设计?: 一般外置ADC与单片机UC之间通过SPI或SMBUS接口通信 当IO口比较紧张时可以选择脉冲或频率方波正比与测量值输出的外置ADC,此时也可以实现光 ...

  9. jmeter beanshell 使用参数引用

    1.直接使用beanshell 写代码引用: 2. beanshell  引用.java 文件 3.beanshell 引用jar 包

  10. 健壮的I/O(RIO)

    在上篇Unix系统级I/O中,我们介绍了有关在Unix环境下读取和写入文件的函数read和write,也提到了标准I/O在进行网络I/O时的局限性.但是在某些地方,直接使用read和write往往会出 ...