zoukankan      html  css  js  c++  java
  • Vuex

     Vuex 是一个专门为Vue.js应用程序开发的状态管理模式,就是为Vue管理状态的,状态可看做数据

    Vuex作为Vue配套的公共数据管理工具,可以把一些共享的数据保存到vuex中,方便整个程序中的任何组件直接获取或修改我们的公共数据

     

    为什么要使用vuex

    父组件向子组件传值要使用属性绑定,子组件向父组件传值要使用事件调用的方式,这是父子两个组件间传值的方式

    但如果组件A中有组件B,组件B中有组件C,A想获取C的数据,是不能直接获取的,需要通过B,那事件调用就要使用两次,这是挺麻烦的,而且B并不需要C的数据但还是要被牵扯进来,加上如果组件嵌套更多层,那这种数据层层传递的方式更是繁杂

    另外还有种情况是,一个页面中有两个组件,这两个兄弟组件如果想获取对方的数据,需要vm实例来进行中转,一个组件通过事件调用传值给vm,vm再通过属性绑定传值给另一组件

    vuex是为了保存组件间共享数据而诞生的,如果组件间有要共享的数据,可以直接挂载到vuex中-,没有"中间商赚差价"

     

    data用来存放组件自身的数据,props存放父组件传来的数据,而vuex是一个全局的共享数据存储区域,一个仓库

     

    安装

    两种方式,网页中使用<script>标签引入,在vue之后引入vuex会自动进行安装

    另一种方式是npm

     

    示例

    ❶ 安装 npm i vuex

    ❷ 导包

    ❸ 使用Vue.use()注册

    ❹ 创建store实例

    ❺ 将store挂载到vm实例上

    //导包
    import Vue from 'vue'
    import Vuex from 'vuex'
    
    //注册vuex到vue中
    Vue.use(Vuex)
    
    //new Vuex.Store() 得到一个数据仓储对象
    var store = new Vuex.Store({
        //state就相当于组件中的data,专门用来存储数据
        state:{
            count:0
        },
        mutations:{
    
        }
    })
    
    import App from './App.vue'
    new Vue({
        el:'#app',
        render: c => c(App),
        //将vuex创建的store挂载到vm实例上
        store:store
    })

    只要将store挂载到vm实例上,任何组件都能使用store来存取数据

    组件中想要访问或修改store中的数据可以通过 this.$store.state.*** 的方式

    但修改数据是不推荐使用此方式,因为不符合vuex的设计理念,如果有几个组件操作了store的数据,万一数据紊乱就很难查出问题是哪个组件引起的

    所以如果要操作store中的数据,只能通过调用mutations中的方法,才能操作对应的数据,不推荐直接操作state中的数据

    mutations就好比仓库管理员,如果货物乱了出了问题,直接找管理员就行了,因为只有它接触过货物

     

    如果组件想要调用mutations中的方法,只能使用 this.$store.commit('方法名')

    这种调用mutatios方式,类似子组件的 this.$emit('父组件方法名') ,传参的话第二个是要传递的参数,但$emit()可传多个参数,而$commit()只能传一个参数

    var store = new Vuex.Store({
        //state就相当于组件中的data,专门用来存储数据
        state:{
            count:0
        },
        mutations:{
           //自定义add()方法,然后在子组件中调用此方法即可操作store中的count数据
            add(state){
                state.count++                  
            }
        }
    })    

     

    在store实例中还有个getters属性,此属性值负责对外提供数据,不负责修改数据,若想修改state中的数据,要去mutations

    getters中的方法跟组件过滤器比较类似,因为两者都没有修改原数据,都是把原数据做了一层包装,提供给了调用者

    其次getters也和computed比较像,只要state中的数据发生变化,如果getters正好引用了此数据,就会立即出发getters的重新求值

    var store = new Vuex.Store({
        state:{
            count:0
        },
        mutations:{ },
        getters:{
            optCount: function(state) {
                return '当前最新的count值是:' + state.count      
            }
        }
    })   

    总结

    ① state中的数据,不能直接修改,想要修改,必须通过mutations

    ② 如果组件想要直接从state上获取数据,需要 this.$store.state.***

    ③ 如果组件想要修改数据,必须使用mutations提供的方法,需要通过 this.$store.commit('方法名',按需求传递的唯一的一个参数)

    ④ 如果store中的state上的数据,在对外提供时候,需要做层包装,那推荐使用getters,若需要使用getters,则调用 this.$store.getters.***

  • 相关阅读:
    小记2_finddata_t结构体
    小记1
    2014-1-2 笔记
    _RecordsetPtr的 open函数
    SAFEARRAY
    用VC实现特定编辑框上对回车键响应
    常用控件的常用消息
    单文档与多文档
    java中得到json格式的数据
    form表单验证时的onsubmit事件
  • 原文地址:https://www.cnblogs.com/Grani/p/9693651.html
Copyright © 2011-2022 走看看