谈谈对vuex的理解

首先我们先抛出三个问题
(1)有了vuex我们是不是就不需要组件之间传参?
(2)vuex和localstorage啥区别?
(3)vuex里面直接修改state为什么还要有专门的修改方法mutation?
先把3个问题的答案放出来:
(1)vuex是多个组件,共享同一个数据的状态管理工具。只是父子之间的数据传递没必要使用vuex,小型项目官方都不推荐使用vuex,只会增加项目的负担,大型的项目并且是多个组件共享的用vuex更好
(2)vuex和localstorage两者应用场景不同。vuex是当前vue项目的全局状态对象,存放在内存中,一旦当前vue项目刷新,vuex的数据也将恢复默认值;而localstorage是存放在浏览器中的对象,即使刷新数据也仍然存在。
(3)对于这个问题,在创建 store 的时候传入 strict: true, 开启严格模式,那么任何修改state的操作,只要不经过mutation的函数,vue就会 throw error

const store = new Vuex.Store({
   state,
   strict:true
   //开启严格模式后,只能通过mutation来改变状态(不支持异步)否则会报错
})
//下面的开启严格模式就会报错,不开启是可行的
  console.log(store.state.count) //0
  store.state.count = 3;
  console.log(store.state.count)  //3

注意:发布环境下不要开启严格模式,严格模式会深度监测状态树来检测不合规的状态变化,造成不必要的性能损失
但是真正原因是:
Vuex的state是响应式的,响应式就是状态改变页面组件也实时更新。但是要实现响应式必须通过提交mutation去改变state,并且还需要遵守一定的规则

image.png

下面从是什么,为什么,怎么用的角度来谈对vuex的理解

【1】vuex是什么

多个组件,共享,同一个数据的状态管理工具
vuex适用于大型单页应用,简单的应用使用 Vuex 可能是繁琐冗余的

【2】为什么

当在开发大型单页应用时,会出现多个视图组件依赖同一个状态,来自不同视图的行为需要变更同一个状态。如登录状态、加入购物车、音乐播放等。
或许你认为可以用传参的方法解决组件之间互相传值的问题。但是传参的方法对于多层嵌套的组件将会变得很繁琐,并且对于兄弟组件间的传递无能为力。所以vuex出现了,相当于一个“前端的数据库”。
Vuex主要用于解决组件之间同一状态的共享问题,它能把组件的共享状态抽取出来,当做一个全局单例模式进行管理。 这样不管你在何处改变状态,都会通知使用该状态的组件做出相应修改。即Vuex采用集中式存储管理应用的所有组件的状态 这里的关键在于集中式存储管理。 这意味着本来需要共享状态的更新是需要组件之间的通讯,而现在有了Vuex,组件就都和store通讯了

【3】怎么用

安装使用步骤
1.安装
sudo cnpm install vuex -S
2.引入状态管理工具vuex
import vuex from 'vuex'
import store from './vuex/store'
3.main.js里面实例化
new Vue({
  el: '#app',
  router, :style="{ 'left': leftnum + 'px' }"  
  store,
  components: { App },
  template: '<App/>'
})
4.在src里面和views同级创建vuex文件里面store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
  // 定义状态
  state: {
    //动态路由的数组
    keepAlive:[],
    //全局域名
    domainName:"",
  }
})
export default store

5.使用:this.$store.state.名字

使用方法核心内容

(1)state 存放状态
(2)mutations 美[mjuːˈtion] 同步的,唯一更改state的方法是提交 mutation。
(3)getters 加工state成员给外界类似于计算属性
(4)actions 异步的,然后提交mutation去操作state
(5)modules 模块化状态管理


image.png
(1)state 存放状态
const store = new Vuex.store({
    state:{
        name:'jack'
    },
})
//页面调用
this.$store.state
(2)mutations同步的对state操作的集合,比如对该数据的修改、增加、删除等等。里面的函数有两个默认形参([state] [payload])

state是当前VueX对象中的state
payload是该方法在被调用时传递参数使用的

//index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.store({
    state:{
        name:'jack'
    },
    mutations:{
        //es6语法,等同edit:funcion(){...}
        //编辑
        edit(state,payload){
            //(1)直接调用
            state.name = 'wayne'
            //(2)传值调用
            state.name = payload
            //(3)传值对象调用
            state.name = payload.name
        },
        //新增
        myadd(state,payload){
            //新增逻辑
            Vue.set(state,"name1","dawei")
        },
        //删除  
        mydel(state,payload){
            //删除逻辑
            Vue.delete(state,"name1")
        },
    }
})
export default store
//页面通过this.$store.commit调用
//(1)直接调用
this.$store.commit('edit')
//(2)传值调用
this.$store.commit('edit','wayne')
//(3)传值对象调用
this.$store.commit('edit',{name:'wayne',sex:'男'})
//还可以这么写
this.$store.commit({
    type:'edit',
    payload:{
        name:'wayne',
        sex:'男'
    }
})
image.png

新增和删除不能使用xx.xx = xx,delete state.info.age这种原来的模式因为不是响应式的,响应式规定新增和删除有自己的方法,这样才能自动更新到组件上面去;
新增用Vue.set(state,"name1","dawei"),
删除用Vue.delete(state,"name1")

(3)getters 加工state成员给外界类似于计算属性

可以对state中的成员加工后传递给外界,Getters中的方法有两个默认参数
state 当前VueX对象中的状态对象
getters 当前getters对象

//index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.store({
    state:{
        name:'jack',
        age:'15'
    },
    mutations:{
        //编辑
        edit(state,payload){
        }
    },
    getters:{
       nameInfo(state){
           return "姓名:"+state.name
       },
       fullInfo(state,getters){
           return getters.nameInfo+'年龄:'+state.age
        }  
  }
})
export default store
// 调用
this.$store.getters.fullInfo//姓名:jack 年龄:15
(4)actions 专门放置异步操作,然后提交mutation去操作state

注意:Action 提交的是 mutation,而不是直接改变state,只有mutation能改变state。
至于是在页面组件中等异步操作(如axious请求接口改变state)完成后去commit调用mutation;还是直接action去做异步axious,根据不同的业务场景有不同的选择,也有不同的好处体现出来。
比如多次遇到的异步(如axious请求接口改变state)那就直接放在action里面,需要的时候页面组件直接使用this.$store.dispatch就可以不用重复写axious,所以vuex只是为了更灵活使开发者多一个选择,让代码尽可能的变动优雅。
Actions中的方法有两个默认参数
context 上下文(相当于箭头函数中的this)对象
payload 挂载参数

//index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.store({
    state:{
        name:'jack'
    },
    mutations:{
        //es6语法,等同edit:funcion(){...}
        //编辑
        edit(state,payload){
            //(2)传值调用
            state.name = payload
        }
    },
    actions:{
        Edit(context,payload){
            //异步操作
            setTimeout(()=>{
                //提交mutations方法,修改state
                context.commit('edit',payload)
            },2000)
        }
      }
})
export default store

//在页面组件中调用:
this.$store.dispatch('Edit','wayne')
(5)modules 模块化状态管理

当项目庞大,状态非常多时,可以采用模块化管理模式。Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。

const store = new Vuex.Store({
models:{
    a:{
        state:{},
        getters:{},
        ....
    },
     b:{
        state:{},
        getters:{},
        ....
    },
}
})
//调用
this.$store.state.a
//而提交或者dispatch某个方法和以前一样,会自动执行所有模块内的对应type的方法:
this.$store.commit('editKey')
this.$store.dispatch('aEditKey')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Vuex五个概念的简单理解。 1.State 保存共享状态信息的地方。2.Getters 类似我们单个组件中的计算...
    似朝朝我心阅读 845评论 0 6
  • 为什么需要Vuex 通常 Vue 项目中的数据通信,我们通过以下三种方式就可以解决,但是随着项目多层嵌套的组件增加...
    尤小小阅读 1,068评论 1 5
  • vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件...
    为光pig阅读 274评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,474评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,548评论 0 11