vuex

vuex

  • vuex
  • 全局状态管理
    • 多组件共享状态
      • 多个组件使用同一数据 (state)
      • 任何组件发生改变 其他组件也要跟着发生相应的改变

核心概念

vuex

State

  • /steɪt/ z状态

  • 在这里是全局状态值

  • 在此配置项中可以放入数据.在任意组件里打印this.$store.state.属性名..都能取到该数据

    state:{
    name:'韩杰'
    },
    
  • 在任意组件中都可以使用.

     mounted () {
            console.log(this.$store.state.name)
        }
    
    • 也可直接渲染

      {{this.$store.state.name}}
      

Mutation

  • /mjuːˈteɪʃn/ 突变

  • 修改全局状态值的方法必须写在这里

    • 两个参数
      • state中的数据
      • 接受的参数
    mutations: {
        changeName(state,params){
            console.log('修改的名字',state,params)
            //修改state数据的操作
            state.name  = params.name
        }
    },
    
  • 触发此函数

    • 直接使用$store.commit()触发

      • 两个参数

        • mutations里事件名

        • 传递的参数

           methods: {
                  but(){
                      this.$store.commit('changeName',{name:1223,pa:456})
                  }
              }
          
    • 组件先触发Action里的方法.再在Action里触发mutations里的方法

      • 触发Action里的方法
      methods: {
              changeAge(){
                  this.$store.dispatch('changeAgeAction', {age:666})
              }
          }
      
      • 再在Action里触发mutations里的方法

        actions: {
            changeAgeAction(context,params){
                console.log('触发',context,params)
                //结构去除commit属性
                let {commit} = context
                commit('changeAge',params)
            }
        }
        

Action

  • /ˈækʃn/ 行动

  • 要求网络请求放到Action里

  • 通过dispatch方法触发到action

  • action 在通过commit方法触发mutations里的方法

  • 组件先触发Action里的方法.再在Action里触发mutations里的方法

    • 触发Action里的方法
    methods: {
            changeAge(){
                this.$store.dispatch('changeAgeAction', {age:666})
            }
        }
    
    • 再在Action里触发mutations里的方法

      actions: {
          changeAgeAction(context,params){
              console.log('触发',context,params)
              //结构去除commit属性
              let {commit} = context
              commit('changeAge',params)
          }
      }
      
  • 统一异步管理.减少代码量.

    • actions代码
    actions: {
        changeNameActions({commit},params){
            console.log(params)
            setTimeout(()=>{
                commit('changeName',params)
            },1000)
            
        }
    }
    
  • 组件调用

      methods: {
           change(){
              this.$store.dispatch('changeNameActions', {name:'韩杰123'})
               
           }
       }
    
  • 时间旅行

    • 是为了.有更准确的时间旅行时间

Getter

  • /'gɛtɚ/

  • 类似于vuex里的computed计算器

  • 用来处理数据的.

  • 可以接受state数据,然后对数据进行处理并返回

    getters: {
        double(state){
            return  state.age*2
        }
    },
    
  • 在任意组件中的this.$store.getters.方法名来取到getters 里面方法return返回的数据.也可直接渲染

    {{this.$store.getters.double}}
    

Module

  • 可以区分不同的模块

  • 下面代码就是区分了hehe,xixi两个模块

     modules:{
      //  呵呵模块
       hehe:{
         namespaced:true, //开启命名空间,打印出来的方法前面会显示是属于哪一个模块
         state:{name:'韩梅梅'},
         mutations:{
           changeName(state){
             state.name='李雷雷'
           }
         },
         getters:{},
         actions:{}
       },
      //  嘻嘻模块
       xixi:{
         state:{age:16},
         mutations:{
           changeAge(state){
             state.age=99
           }
         },
         actions:{},
         getters:{}
       }
     }
    })
    
  • 注意state的使用会有所不同

    • 前面需要加上模块名
      computed:{
        ...mapState({
          name:state=>state.hehe.name,
          age:state=>state.xixi.age
        })
      },
    

基本使用

  • 下载/安装 npm install vuex

  • src下新建文件夹下js文件里创建全局状态管理实例并抛出

    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    
    let store = new Vuex.Store({
    
    })
    
    export default store;
    
  • 在main.js引入和注册

    import store from './store/index'
    new Vue({
      store,
      render: h => h(App),
    }).$mount('#app')
    
    
  • 在组件中使用全局状态值

    • 获取渲染全局状态值
      • 在配置项state里
    • 修改全局状态值
      • 如果想修改全局状态值必须在mutations

辅助函数

值类型向计算属性里映射

  • 帮助我们减少代码量

  • mapState

    • 将state映射到计算属性上,,相当于取代this.$store.state这串代码
  • mapGetters

    • 将getters映射到计算属性上,,相当于取代this.$store.getters这串代码

    • 注意要写到computed计算属性内

      <template>
          <div>
             name:{{this.$store.state.name}}
             <button @click="change">组件1</button>
          //使用方式
             mapstate:{{name}}
             {{double}}
          </div>
      </template>
      
      <script>
      import {mapState,mapGetters} from 'vuex'
      export default {
         computed: {
            ...mapState(['name']),
            ...mapGetters(['double'])
      
         },
      
  • 其实上面的是简写..完整写法是如下

    • 简写不能改名
    • 对象能自定义名字
    computed:{
    ...mapState(['name'])//使用的话使用{{name}}
    //等同于
    ...mapState({hehe:(state)=>{//使用的话就使用{{hehe}}了
    return state.name
    }})
      //在es6中.如果箭头函数后面直接return的话可以简写为
      ...mapState({hehe:state=>state.name})
      //如果属性和属性值一直可以省略属性值
        ...mapState({name:state=>state.name})
        //等同于
         ...mapState({name})
        //在vuex要求写成这样
        ...mapState(['name'])
    }
    
  • mapGetters的完整写法

    • 也是简写不能自定义名字
    //简写
    ...mapGetters(['double'])
    //完整写法
    ...mapGetters({hehe:"double}")
    

函数类型向methods进行映射

  • mapMutations

    • 将mutation的值映射到 方法里
  • mapActions

    • 将actions里的值映射到方法里
  • 完整写法和mapGetters一样

    import {mapActions,mapMutations} from 'vuex'
    export default {
       
       methods: {
          ...mapActions(['changeNameActions']),
           //完整写法,只是如果属性和属性值一样的话可以简写
           ...mapActions({hehe:'changeNameActions'}),
           
           //和上面完整写法一样
          ...mapMutations(['changeName']),
           change(){
              //this.changeNameActions({name:'赵四'})
              this.changeName({name:'王五'})
               
           }
           //如果如上代码所示.change这个点击事件的名字如果也叫changeName的话可以简写
           ...mapMutations({changeName:'changeName'})
        //接着简写就是
        ...mapMutations(['changeName'])
        //也可以改名字
           ...mapMutations({hehe:'changeName'})
        //在页面上添加点击事件就叫hehe就行了.
        <button @click = 'hehe'></button>
           
       }
    }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352