Vue.js 2.x笔记:状态管理Vuex(7)
1. Vuex简介
Vuex是为vue.js应用程序开发的状态管理模式,解决的问题:
◊ 组件之间的传参,多层嵌套组件之间的传参以及各组件之间耦合度过高问题
◊ 不同状态中的行为需要多份复制的问题
Vuex采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
核心思想:抽取组件的共享状态,以一个全局单例的模式进行管理。
核心:store(仓库)
核心组成:
◊ state:存放项目中需要多组件共享的状态变量
◊ getters:读取器,从state中派生出状态,如:将state中的某个状态进行过滤然后获取新的状态。
◊ mutations:修改器,存放更改state里状态的方法。
◊ actions:动作,mutation的加强版,可以通过commit mutations中的方法来改变状态,最重要的是可以进行异步操作。
◊ modules:模块化,将状态和管理规则模块化封装。
Vuex文档:https://vuex.vuejs.org/zh/
2. Vuex基本使用
2.1 State
npm安装:
npm install vuex -S
基础示例:
<!DOCTYPE html>
<html> <head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>libing.vue</title> <script src="node_modules/vue/dist/vue.min.js"></script>
<script src="node_modules/vuex/dist/vuex.min.js"></script>
</head> <body>
<div id="app">
Copyright © {{ author }} - 2018 All rights reserved
</div> <script>
Vue.use(Vuex); const store = new Vuex.Store({
// 定义状态
state: {
//key: value
author: 'Libing'
}
}); new Vue({
el: "#app",
store: store,
computed: {
author: function () {
return this.$store.state.author
}
}
});
</script>
</body> </html>
vue-cli示例:
/store/index.js
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({
// 定义状态
state: {
//key: value
author: 'libing'
}
})
HelloWorld.vue
<template>
<div>Copyright © {{ author }} - 2018 All rights reserved</div>
</template> <script>
export default {
name: "HelloWorld",
computed: {
author: function() {
return this.$store.state.author;
}
}
};
</script>
<template>
<div id="app">
<HelloWorld/>
</div>
</template> <script>
import HelloWorld from "./components/HelloWorld"; export default {
name: "App",
components: {
HelloWorld
}
};
</script>
App.vue
main.js
import Vue from 'vue'
import App from './App' import store from './store/index' Vue.config.productionTip = false new Vue({
el: '#app',
store,
components: {
App
},
template: '<App/>'
})
mapState:当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,可以使用 mapState 辅助函数帮助生成计算属性。
store/index.js
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({
state: {
count: 1,
todos: [{
id: 1,
text: 'ToDo',
status: false
},
{
id: 2,
text: 'Doing',
status: false
},
{
id: 3,
text: 'Done',
status: true
}
]
}
})
Home.vue
<template>
<div class="home">
<ul>
<li v-for="todo in todos" :key="todo.id">{{ todo.text }}</li>
</ul>
</div>
</template>
<script>
import { mapState } from "vuex" export default {
computed: mapState({
count: state => state.count,
todos: state => state.todos,
dones(state) {
return state.todos.filter(todo => todo.status);
}
})
};
</script>
2.2 Getter
Vuex 允许在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
Getter 接受 state 作为其第一个参数:
store/index.js
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({
state: {
count: 1,
todos: [{
id: 1,
text: 'ToDo',
status: false
},
{
id: 2,
text: 'Doing',
status: false
},
{
id: 3,
text: 'Done',
status: true
}
]
},
getters: {
dones: state => {
return state.todos.filter(todo => todo.status);
}
}
})
Getter 会暴露为 store.getters
对象,以属性的形式访问这些值:
Home.vue
<template>
<div class="home">
<ul>
<li v-for="todo in dones" :key="todo.id">{{ todo.text }}</li>
</ul>
</div>
</template>
<script>
export default {
computed: {
dones() {
return this.$store.getters.dones;
}
}
};
</script>
通过方法访问,让 getter 返回一个函数,来实现给 getter 传参。
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({
state: {
count: 1,
todos: [{
id: 1,
text: 'ToDo',
status: false
},
{
id: 2,
text: 'Doing',
status: false
},
{
id: 3,
text: 'Done',
status: true
}
]
},
getters: {
dones: state => {
return state.todos.filter(todo => todo.status);
},
getTodoById: (state) => (id) => {
return state.todos.find(todo => todo.id === id);
}
}
})
Getter 也可以接受其他 getter 作为第二个参数:
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({
state: {
count: 1,
todos: [{
id: 1,
text: 'ToDo',
status: false
},
{
id: 2,
text: 'Doing',
status: false
},
{
id: 3,
text: 'Done',
status: true
}
]
},
getters: {
dones: state => {
return state.todos.filter(todo => todo.status);
},
donesCount(state, getters) {
return getters.dones.length;
}
}
})
2.3 Mutation
更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是实际进行状态更改的地方,并且它会接受 state 作为第一个参数。
不能直接调用一个 mutation handler,要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit()。
store/index.js
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++;
}
}
})
Home.vue
<template>
<div class="home">
{{ count }}
<input type="button" value="添加" @click='handleIncrement'>
</div>
</template>
<script>
export default {
data() {
return {
count: this.$store.state.count
};
},
methods: {
handleIncrement() {
this.$store.commit("increment");
console.log(this.$store.state.count)
}
}
};
</script>
2.4 Action
Action 类似于 mutation,不同在于:
◊ Action 提交的是 mutation,而不是直接变更状态。
◊ Action 可以包含任意异步操作。
store/index.js
import Vue from 'vue'
import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({
state: {
count: 0
},
mutations:{
increment(state) {
state.count++;
}
},
actions:{
plus(context){
context.commit('increment')
}
}
})
Home.vue
<template>
<div class="home">
{{ count }}
<input type="button" value="添加" @click='add'>
</div>
</template>
<script>
export default {
computed: {
count() {
return this.$store.state.count;
}
},
methods: {
add() {
this.$store.dispatch('plus');
}
}
};
</script>
3. Vuex插件
3.1 vuex-persist状态持久化
3.2 vuex-i18n语言本地化
Vue.js 2.x笔记:状态管理Vuex(7)的更多相关文章
- Vue状态管理vuex
前面的话 由于多个状态分散的跨越在许多组件和交互间各个角落,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue提供了vuex.本文将详细介绍Vue状态管理vuex 引入 当访问数据对象时,一个 V ...
- Vue之状态管理(vuex)与接口调用
Vue之状态管理(vuex)与接口调用 一,介绍与需求 1.1,介绍 1,状态管理(vuex) Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态 ...
- vue.js应用开发笔记
看vue.js有几天了,之前也零零散散的瞅过,不过一直没有动手去写过demo,这几天后台事比较少,一直在讨论各种需求(其实公司对需求还是比较重视与严谨的,一个项目需求讨论就差不多一周了,这要搁之前,天 ...
- Vue.js实战学习笔记(中)
1.递归组件给组件设置name属性,组件就可以在它的模板内调用自己,但必须给一个条件来限制递归数量.<div id="app"> <child-component ...
- 状态管理Vuex
路由Router 配置 {path:'/login',component:Login} 路由出口 router-view 传参 {path:'/login/:id',component:Login} ...
- vue创建状态管理(vuex的store机制)
1:为什么说要是永远状态管理 在使用 Vue 框架做单页面应用时,我们时常会遇到传值,组件公用状态的问题.(子父间传值文章传送门) ,如果是简单的应用,兄弟组件之间通信还能使用 eventBus 来作 ...
- vue中状态管理vuex的使用分享
一.main.js中引入 store import store from './store' window.HMO_APP = new Vue({ router, store, render: h = ...
- Vue学习日记(四)——Vue状态管理vuex
前言 先说句前话,如果不是接触大型项目,不需要有多个子页面,不使用vuex也是完全可以的. 说实在话,我在阅读vuex文档的时候,也很难以去理解vuex,甚至觉得没有使用它我也可以.但是直到我在项目碰 ...
- vue状态管理vuex从浅入深详细讲解
1.vuex简介以及创建一个简单的仓库 vuex是专门为vue框架而设计出的一个公共数据管理框架,任何组件都可以通过状态管理仓库数据沟通,也可以统一从仓库获取数据,在比较大型的应用中,数据交互庞大的情 ...
随机推荐
- ABP框架连接Mysql数据库
开始想用Abp框架来搭建公司的新项目,虽然一切还没有定数,但是兵马未动,粮草先行,我先尝试一下整个过程,才能够更好的去争取机会. 此次技术选型:Abp(Asp.Net core mvc)+mysql( ...
- LVS(五)LVS的持久连接
什么是持久链接 把某个客户端的请求始终定向到同一应用服务器上.对于LVS来说持久连接和算法没有关系.也就是使用任何算法LVS都可以实现同一客户端的请求转发到之前选定的应用服务器,以保持会话.而且还能实 ...
- kubernetes系列09—Ingress控制器详解
本文收录在容器技术学习系列文章总目录 1.认识Ingress 1.1 什么是Ingress? 通常情况下,service和pod仅可在集群内部网络中通过IP地址访问.所有到达边界路由器的流量或被丢弃或 ...
- spring transaction源码分析--事务架构
1. 引言 事务特性 事务是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务将逻辑相关的一组操作绑定在一起,以便服务器 保持数据的完整性.事 ...
- netstat命令总结
nestat介绍 netstat是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字. 使用 ...
- HTTP协议及其相关
URI.URL.URN URL,统一资源定位符,用来标识某一处资源的地址,必须包含协议和域名,协议指的是HTTP.FTP.WS.file等协议,域名就是常说的网址,比如www.baidu.com ,其 ...
- 怎么从Linux服务器上下载超过4G的文件?
使用sz命令下载文件时,超过4G下载不了,如何下载呢? 本文介绍的方法是先对该文件进行拆分,拆分成多个小于4G的文件,然后分别下载,下载到本地后再进行合并或直接解压,具体操作如下: 1.分拆为多个文件 ...
- .net开源工作流ccflow从表数据数据源导入设置
第1节. 关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow .net开源工作流 第2节. 从表数据导入设置 1.1.1: 概要说明 在从表的使用中我一般都会用到从 ...
- Android-蓝牙自动配对与隐藏对话框
一.概述 本次分析是基于Android7.0的源码. 二.自动配对分析过程 首先,我们分析一下源码的自动配对过程,packages/apps/Settings/src/com/android/sett ...
- WordCount结对编程
合作者:201631062602,201631062114 代码地址:https://gitee.com/Changyu-Guo/pairing_project 作业链接:https://www.cn ...