vuex那些事儿
vuex适用于大型单页应用。每一个Vuex应用的核心就是store(仓库),store中储存大量状态,Vuex的状态存储是响应式的。vuex使用单一状态树,一个对象包含了全部的应用层级状态,每个应用仅仅包含一个store实例。调试页面,有可能会用到dev-tools。
一、概念
1、state(共享的状态)
要get状态,需要在计算属性computed中返回状态。要get多个状态,可以借助mapState辅助函数生成计算属性。
state属性在store实例中设置,mapState函数在vue实例的computed属性中写。
state:{
a: ''
}
//实例中
computed: {
getStateA(){
return store.state.a
}
}
//组件中
import { mapState } from 'vuex' export default {
computed: {
...mapState(['a']),
getStateA(){
return this.a;
}
}
}
2、getters(共享的方法,该方法用于get状态)
实现多个组件共享同一个状态,getters属于store的计算属性,根据依赖缓存返回值,当依赖变化时,重新计算。
getters属性在store实例中设置,mapGetters函数在vue实例或组件的computed属性中写。
getters: {
getterA: state => {
return state.a
}
}
//实例中
computed: {
getGetterA() {
return store.getters.getterA
}
}
//组件中
import { mapGetters } from 'vuex' export default {
computed: {
...mapGetters(['getterA']),
getGetterA(){
return this.getterA;
}
}
}
3、mutations(修改状态)
mutation必须是同步函数,因为回调函数进行的状态改变不能被追踪,因为mutation触发的时候,回调函数还没有被调用。
mutations属性在store实例中设置,直接修改状态,mapMutations函数在vue实例或组件的methods属性中写。
mutations: {
mutationA: state => {
state.count++
}
}
//实例中
methods: {
eventA() {
this.$store.commit('mutationA');
}
}
//组件中
import { mapMutations } from 'vuex' export default {
methods: {
...mapMutations(['mutationA']),
eventA(){
this.mutationA();
}
}
}
4、actions(提交mutation)
store中的状态是响应式的,要set状态,不能直接改变数据,而是需要提交mutation。actions属性在store实例中设置,不会直接变更状态,而是提交mutation,可以包含异步操作。mapActions函数在vue实例或组件的methods属性中写。下面介绍4种提交mutaion的办法,仅供参考。
A、在组件中提交mutation
mutations:{
//改变状态
mutationA(state, { adata }) {
state.awords = adata;
}
}
//全局定义store,在组件中提交mutation
methods:{
eventF(adata){
// 以载荷形式提交mutation
store.commit('mutationA',{ adata });
}
}
//在组件内提交mutation
methods:{
eventF(adata){
// 以载荷形式提交mutation
this.$store.commit('mutationA',{ adata });
}
}
B、在组件中提交mutation之mapMutations
import { mutationA, mutationB } from './mutation-types' export default {
[mutationA](state,payload){
state.dataA = payload;
},
[mutationB](state,payload){
state.dataB = payload;
}
}
import { mapMutations } from 'vuex'
export default {
methods: {
...mapMutations([
'mutationA',
'mutationB'
]),
...mapMutations({
add: 'mutationA'
}),
eventA(){
this.mutationA();
},
eventB(bdata){
this.mutationB(bdata);
},
eventC(cdata){
this.add(cdata);
}
}
}
C、在actions中提交mutation
mutations:{
//改变状态
mutationA(state, payload) {
state.awords = payload;
},
//改变状态
mutationB(state, payload) {
state.bwords = payload;
}
},
//在actions中提交mutation,同步,异步
actions:{
actionA({commit,state},payload){
commit('mutationA',payload);
},
actionB({commit},payload){
new Promise((resolve,reject)=>{
setTimeout(()=>{
commit('mutationB',payload);
resolve();
},1000)
})
}
}
//在组件中分发action
methods:{
eventA(){
store.dispatch('actionA','我是老大');
}
}
D、在actions中提交mutation之mapActions
import { mutationA, mutationB } from './mutation-types' export default {
[mutationA](state,payload){
state.dataA = payload;
},
[mutationB](state,payload){
state.dataB = payload;
}
}
//actions.js,提交mutation
import { mutationA, mutationB } from './mutation-types' export default {
actionA({commit,state}, payload){
commit(mutationA, payload);
},
actionB({commit,state}, payload){
commit(mutationB, payload);
}
}
import { mapActions } from 'vuex' //在组件中分发action
methods:{
...mapActions(['actionA', 'actionB']),
eventA(){
this.actionA('我是老大');
},
eventB(){
this.actionB('我是老二');
}
}
5、modules
解决状态多导致store对象臃肿,将store分割成模块,每个模块拥有自己state,getters,mutations,actions。
二、vuex的引用方法
1、用script标签
<script src="https://unpkg.com/vuex"></script>
2、npm安装
cnpm install vuex
//在js文件引入
var Vue = require('vue')
var Vuex = require('vuex') Vue.use(Vuex)
三、参考案例
const store = new Vuex.Store({
state:{
fwords: '一朵红花',
awords: '我是老大'
},
getters:{
getAwords(state){
return state.awords
}
},
mutations:{
//改变状态
listenA(state, { adata }) {
state.awords = adata;
}
}
})
1、父组件给子组件传递消息
//父组件
<com-a :apropVal="getFwords"></com-a> computed:{
getFwords(){
return store.state.fwords
}
}
//子组件
<h3>父亲给我了,{{ apropVal }}</h3> props:['apropVal']
2、子组件给父组件传递事件
//子组件
<input type="button" value="A和父亲说话" @click="eventAf"> methods:{
eventAf(){
this.$emit('a-f-msg',`谢谢父亲`);
}
}
//父组件
<com-a @a-f-msg="eventFa"></com-a> methods:{
eventFa(adata){
// 以载荷形式提交mutation
store.commit('listenA',{ adata });
}
}
const store = new Vuex.Store({
state:{
awords: '',
bwords: ''
},
getters:{
getAwords(state){
return state.awords
},
getBwords(state){
return state.bwords
}
},
mutations:{
//改变状态
mutationA(state, payload) {
state.awords = payload;
},
//改变状态
mutationB(state, payload) {
state.bwords = payload;
}
},
actions:{
actionA({commit,state},payload){
commit('mutationA',payload);
},
actionB({commit},payload){
new Promise((resolve,reject)=>{
setTimeout(()=>{
commit('mutationB',payload);
resolve();
},1000)
})
}
}
})
//子组件A
<h4>B传过来的数据是:{{ store.getters.getBwords }}</h4>
<input type="button" value="把值传给B" @click="eventAb"> methods:{
eventAb(){
store.dispatch('actionA','我是老大');
}
}
//子组件B
<h4>A传过来的数据是:{{ store.getters.getAwords }}</h4>
<input type="button" value="把值传给A" @click="eventBa"> methods:{
eventBa(){
store.dispatch('actionB','我是老二');
}
}
1、语法基础
A、引入和输出模块
//store.js,默认输出
export default store;
//main.js
import store from 'store.js';
// constants.js
export const A = 1;
export const B = 3;
//main.js
import { A, B } from './constants.js';
// constants.js,跨模块常量
export const A = 1;
export const B = 3;
export const C = 4;
// main.js
import * as constants from './constants';
console.log(constants.A); //
console.log(constants.B); //
B、对象扩展运算符
将多个对象合并为一个,传给computed属性。
# 安装插件
npm i -D babel-plugin-transform-object-rest-spread
#配置文件babelrc
{
"presets": ["env"],
"plugins": ["transform-runtime","transform-object-rest-spread"]
}
//组件内
computed:{
...mapGetters(['getterA','getterB','getterC'])
}
//mutation-types.js
export const MUTATION_A = 'MUTATION_A';
//mutations.js
import { MUTATION_A } from './mutation-types'; export default {
[MUTATION_A](state,payload){
state.dataA = payload;
}
}
//actions.js
import { MUTATION_A } from './mutation-types';
//解构赋值前,context是一个对象
export default {
actionA(context, payload){
context.commit(MUTATION_A, payload);
}
}
//解构赋值后
export default {
actionA({commit, state}, payload){
commit(MUTATION_A, payload);
}
}
commit = context.commit,为什么这样解构赋值?查看原理。
2、父组件给子组件传递
3、子组件给父组件传递
4、兄弟组件相互传递
vuex那些事儿的更多相关文章
- 关于Vuex的那些事儿
vuex vuex是一个专门为Vue.js应用程序开发的状态管理模式,集中式的存储应用的所有组件的状态 以相应的规则保证状态以一种可预测的方式发生变化 单向数据流 State:驱动应用的数据源(单向数 ...
- Vue2.0 探索之路——生命周期和钩子函数的一些理解 - JS那些事儿
在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这 ...
- 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...
- Vuex、Flux、Redux、Redux-saga、Dva、MobX
https://www.jqhtml.com/23003.html 这篇文章试着聊明白这一堆看起来挺复杂的东西.在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 Reac ...
- vuex存取token,http简单封装、模拟登入权限校验操作、路由懒加载的几种方式、vue单页设置title
1.config index.js下面的跨域代理设置: proxyTable: { '/api': { target: 'http://xxxx', //要访问的后端接口 changeOrigin: ...
- vuex分模块3
nuxt 踩坑之 -- Vuex状态树的模块方式使用 原创 2017年12月20日 11:24:14 标签: vue / nuxt / vuex / 模块化 / 状态管理 874 初次看到这个模块方式 ...
- Vuex,从入门到...
Vuex 是什么? 官方是这么说的:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 不懂? ...
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库
应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...
随机推荐
- Python实操二
实操一: 1.用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao'] name=['alex','wupeiqi' ...
- Kali安装问题解决方案
一.对今天安装Kalilinux 失败的原因做一个简单的总结, 1.安装之前的电脑状况,电脑配置Windows7 64位旗舰版配置,虚拟版本是VMware Workstation Pro14 ver ...
- XSS-HTML&javaSkcript&CSS&jQuery&ajax
1.设置不同的样式列表 <style> ul.a{list-style-tyrp:circle;} ul.b{list-style-type:square;} ul.c{list ...
- Jmeter 获取CSV行数
import java.io.BufferedReader; import java.io.FileInputStream; String str = "E:\\Desktop\\WOS接口 ...
- spring cloud 容错之zuul回退和Zuul过滤器
一.容错:Zuul回退 如果微服务下线了,针对每个微服务,都需要回复一个中文提示,而不是报异常 1.新建ConsumerFallbackProvider.java package com.pupeiy ...
- Linux系统下目录的权限意义
访问者及其基本权限 Linux系统内的文件访问者有三种身份,分别是: a) 文件和文件目录的所有者: u---User(所有权);b) 文件和文件目录的所有者所在的组的用户: g---Group;c) ...
- python杂写
一:用户交互 与用户交互主要使用input,这里需要说明三点: 1:input会等待用户输入 2:会将输入的内容赋值给变量 3:input出的变量都是字符串类型(str) 例子1:注意,因为input ...
- 011-Python-进程、线程于协程
1.进程与线程 进程: 一个程序要运行时所需的所有资源的集合: 一个进程至少需要一个线程,这个线程称为主线程,一个进程里可以包含多个线程: cpu 核数越多,代表着你可以真正并发的线程越多2个进程之间 ...
- 完美解决gradle下载慢的问题
修改项目根目录下的文件 build.gradle ,使用国内阿里云镜像仓库地址. buildscript { repositories { maven{ url 'http://maven.aliyu ...
- idea格式化代码无效Ctrl+Alt+L
1.Idea格式化代码,无效,我的原因是热键冲突,我按Ctrl+Alt+L的时候,竟然弹出了锁QQ,果断关了QQ的热键,百度有的是网易啥的,具体情况具体分析吧.