学习不一样的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. 03hive_DDL数据定义

    一. DDL数据定义 创建数据库 1)create database db_hive; 2)避免要创建的数据库已经存在错误,增加 if not exists 判断. create database i ...

  2. HDU4081 Qin Shi Huang's National Road System

    先求最小生成树 再遍历每一对顶点,如果该顶点之间的边属于最小生成树,则剪掉这对顶点在最小生成树里的最长路径 否则直接剪掉连接这对顶点的边~ 用prim算法求最小生成树最长路径的模板~ #include ...

  3. NOIP-- 模拟-----机器

    机器翻译 题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  4. 浅谈hover用法

    在前端页面制作中,我们时常要用到移动显示.隐藏的动态效果,我们一般采用js来实现此效果.不过在大部分情况下,我们也可以使用hover来实现此动态效果. 在此,我谈一谈我对hover的用法,请看以下代码 ...

  5. 【Hibernate QBC】

    HibernateQBC public class HibernateQBC { //演示离线查询 @Test public void testSelect6() { SessionFactory s ...

  6. spring+mybatis报Cannot load JDBC driver

    今天做用maven搭建ssm框架的例子,在测试的时候一直报ava.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 这个异常,找 ...

  7. combotree(组合树)的使用

    一.前言: 组合树(combotree)把选择控件和下拉树结合起来.它与组合框(combobox)相似,不同的是把列表替换成树组件.组合树(combotree)支持带有用于多选的树状态复选框的树. 二 ...

  8. js中的跨域

    因为javascript的同源策略,导致它普通情况下不能跨域,直到现在,我还是不能完全理解js跨域的几种方法,没办法,只能慢慢学习,慢慢积累,这不,几天又在园里看到一篇博文,有所收获,贴上来看看; 原 ...

  9. Python的 REPL 模式

    REPL Read Eval Print Loop读取,执行,输出,循环 在REPL环境中,你输入一句话,他就读取,执行,输出一个结果,所以也称为 交互式提示模式这是python代码最简单的方式,也揭 ...

  10. Android系统架构(图解)

    下图是 Android 操作系统的架构,架构包括 4 层,由上到下依次是应用程序层.应用程序框架层.核心类库和 Linux 内核.其中,核心类库中包含系统库及 Android 运行环境. 图1  An ...