vue之vuex(十)

一、vuex是什么?

Vuex 是一个专为 Vue.js 应用程序开发的**状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。


vuex.png

二、什么情况下我应该使用 Vuex?

  1. 不适用:小型简单应用,用 Vuex 是繁琐冗余的,更适合使用简单的 store 模式
  2. 适用于:中大型单页应用,你可能会考虑如何把组件的共享状态抽取出来,以一个全局单例模式管理,不管在哪个组件,都能获取状态/触发行为,解决问题如下:
    ① 多个视图使用于同一状态:
    传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力
    ② 不同视图需要变更同一状态:
    采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝,通常会导致无法维护的代码

三、Vuex 和单纯的全局对象有何不同?

1.Vuex 的状态存储是响应式的
当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
2.你不能直接改变 store 中的状态
改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation,方便我们跟踪每一个状态的变化。

四、Vuex核心概念

1、store:类似容器,包含应用的大部分状态
一个页面只能有一个容器
状态存储是响应式的
不能直接改变store中的状态,唯一途径显示地提交mutations
在actions里面,也不能直接更改state里面的状态值,必须先定义一个mutations,然后在actions里面commit这个mutations,从而来更改state的状态值;如果要再次请求异步,那么就是dispatch一个actions
2、State:包含所有应用级别状态的对象
3、Getters:在组件内部获取store中状态的函数,类似组件的计算属性computed
4、Mutations:唯一修改状态的事件回调函数,默认是同步的,如果要异步就使用Actions
5、Actions:包含异步操作、提交mutations改变状态
6、Modules:将store分割成不同的模块

五、下载安装vuex

//下载
npm install vuex --save
//使用
2、作为插件使用
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
3、定义容器
 new Vuex.Store({
    state:{
        num:0
    },
    mutations:{  //对象,里面是各种更改state状态值的函数,同步立即更改状态
        add( state,payload ){  //参数state就是上面的state,payload是要传递的值
            state.num+=payload.n;
        }
        reduce(state){
          state.num--
       }
    },  
   actions:{  
        //异步更改状态,可以是ajax请求成功之后改变状态,这里用定时器模拟,1秒钟之后提交mutations改变状态
        //异步的更改状态是直接在index.js里面的actions里面定义action然后commit的(附带参数),而不是在组件内提交,注意区别,异步是在组件内dispatch这个actions(actions里面已经包含了mutations),同步是在组件内commit这个mutations(附带参数)
        //异步也可以在index.js里面直接dispatch这个actions(附带参数)
        addAction( context ){ 
              context.commit("add")
        }
        reduceAction( {commit}){  
             commit("reduce")
        }
        //利用es6解构赋值改写上面的代码,因为context对象下面有commit和dispatch方法
        addAction( {commit,dispatch} ){
            setTimeout(function(){
                commit('add',{n:200});   //直接可以获取到commit方法,不用是context.commit
                dispatch('textAction',{test:'测试'}) 
            },1000)
        }
        reduceAction( context,obj ){  //ajax2
            console.log(obj)
        }

    },
//异步更改状态,一段时间之后再改变状态,只要是异步的改变都写在actions里面
    getters:{ //类似计算属性,对状态做进一步的处理
        filternum(state){
            return state.num>=120?120:state.num++;
        }
    }  
})
export default store
4、注入根实例
import store from './store'
new Vue({
    store
})

5、在state里面定义的是状态,如果在组件内部要使用这个状态,那么一般在组件内部通过计算属性来得到它

//vuex.vue
<template>
<button @click="add()">+</button>
<p>{{num}}</p>
//通过getter进行计算后的值
<p>{{num1}}</p>
<button @click="reduce">-</button>
</template>
<script>
export default{
      computed:{
            num(){
                  return this.$store.state.num
            },
            num1(){
                return this.$store.getters.filternum  //被getters进一步处理过的状态
            }
      },
    methods:{
          add(){  
              //要动态的改变状态,就需要显示的提交一个mutations —> add
             //同步,写法一
            this.$store.commit('add',{n:10})
           //同步,写法二
            this.$store.commit({
                  type:'add',
                  n:5
              })
              //异步,写法
             this.$store.dispatch('addAction')
             },
         reduce(){  
           //要动态的改变状态,就需要显示的提交一个mutations —> add
          //同步,写法一
            this.$store.commit('reduce',{n:10})
         }
   }
</script>

六、辅助函数

//vuextwo.vue
<template>
    <div>
        <button @click="addAction">+</button>
        {{num}} 
        <button @click="reduceAction">-</button>
    </div>
</template>
<script>
// mapstate  辅助函数
import {mapState,mapMutations,mapGetters,mapActions} from "vuex"
export default {
     data(){
         return{
        
         }
     },
    //  计算属性   setter   getter
         //第一种写法
    //  computed: {
    //   num(){
    //       return this.$store.state.num
    //   }
    //  },
        // 第二种写法
    // computed: {
    //  ...mapState(["num"])
    // },
       //第三种写法
    // computed:mapState(["num","list"]),
       //采用getters进行计算
    computed: {
        ...mapGetters(["num"])
    },
    //  methods:{
    //  ...mapMutations(["add","reduce"])
    //  },
    // methods:mapMutations(["add","reduce"])
    methods:mapActions(["addAction","reduceAction"])
    
}
</script>

<style scoped>

</style>

如果感觉有帮助,给予一个宝贵的赞!!!!

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

推荐阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,924评论 0 7
  • Vuex是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件...
    萧玄辞阅读 3,102评论 0 6
  • 目录 - 1.什么是vuex? - 2.为什么要使用Vuex? - 3.vuex的核心概念?||如何在组件中去使用...
    我跟你蒋阅读 4,110评论 4 51
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 8,006评论 4 111
  • 问题:本周末去南昌学习会怎样?左边是去,右边是不去。 背景:这是一个八卦数理方面的学习,犹豫是因为忙时间安排不宽裕...
    橘子黄cups阅读 190评论 0 0