zoukankan      html  css  js  c++  java
  • vuex是干什么的

    vuex是干什么的

    一、总结

    一句话总结:

    【状态管理库】:vuex是基于vue框架的一个状态管理库。可以管理复杂应用的数据状态,比如兄弟组件的通信、多层嵌套的组件的传值等等。

    1、vuex是干什么的?

    【状态管理库】:vuex是基于vue框架的一个状态管理库。可以管理复杂应用的数据状态,比如兄弟组件的通信、多层嵌套的组件的传值等等。

    2、vuex有哪几个核心概念?

    vuex有这么几个核心概念——State、Getter、Mutation、Action、Module。

    3、为什么要有vuex?

    【数据状态在多个组件维护的困难性】:由于数据状态在多个组件维护的困难性,vuex在维护数据状态的时候,使用的方法就是对一个“容器”进行维护。这个容器是一个状态数,用对象的方式来表示。

    4、vuex核心概念中的State、Getter、Mutation、Action、Module中的 State、Getter 分别是做什么的?

    State:【单一状态树】:是一个单一状态树,这个state中维护着整个应用的数据管理的核心对象。
    Getter:【对state进行过滤】:如果说state通过计算属性获取的数据,我们要经过一定的操作(比如排序),那么在Getter中我们就可以提供这种操作。使得我们获取的state达到我们的需求。



    5、vuex核心概念中的State、Getter、Mutation、Action、Module中的 Mutation、Action、Module 分别是做什么的?

    Mutation:【更改store的属性】:这是vuex提供的唯一更改store的属性。
    Action:【提交的是mutation,而不是变更状态】:这个属性的作用类似于Mutation,但是它提交的是mutation,而不是变更状态。并且action可以包含任何异步状态。
    module模块组:【对状态进行模块划分】:随着项目越来越大,我们定义的状态会越来越多,这个时候,我们要对我们的状态进行模块划分。而module就是来干这样的事情的。

    二、vuex是干什么的?

    转自或参考:vuex是干什么的?_JavaScript_qq_36486737的博客-CSDN博客
    https://blog.csdn.net/qq_36486737/article/details/82706581

    1、vuex是干什么的?

    学习任何东西,必然绕不过去的一个话题,就是我们为什么要使用它,它解决了什么问题?

    vuex是基于vue框架的一个状态管理库。可以管理复杂应用的数据状态,比如兄弟组件的通信、多层嵌套的组件的传值等等。

    vuex有这么几个核心概念——State、Getter、Mutation、Action、Module。

    2、vuex的“hello world”示例

    由于数据状态在多个组件维护的困难性,vuex在维护数据状态的时候,使用的方法就是对一个“容器”进行维护。这个容器是一个状态数,用对象的方式来表示。

    (1)、store

    const store = new Vuex.Store({
            state: {
                count: 0
            },
            mutations: {
                increment (state) {
                    state.count++
                },
                decrement (state) {
                    state.count--
                }
            }
        })

    store是vuex的核心对象,它记录了整个vue应用的数据状态以及操作数据的方式。

    (2)、state

    state就是store操作的数据状态对象。

    (3)、mutation

    mutation提供了一种简单易用的同步的方式改变state的状态。

    完整示例

    <!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>vuex学习</title><scriptsrc="https://unpkg.com/vue/dist/vue.js"></script><scriptsrc="https://unpkg.com/vue-router/dist/vue-router.js"></script><scriptsrc="https://unpkg.com/vuex"></script></head><body><divid="app"><p>{{ count }}</p><p><button @click="increment">+</button><button @click="decrement">-</button></p></div></body><script>const store = new Vuex.Store({
            state: {
                count: 0
            },
            mutations: {
                increment (state) {
                    state.count++
                },
                decrement (state) {
                    state.count--
                }
            }
        })
    
        new Vue({
            el:'#app',
            store,
            computed:{
                count(){
                    return store.state.count;
                }
            },
            methods:{
                increment(){
                    store.commit('increment')
                },
                decrement () {
                    store.commit('decrement')
                }
            }
        })
    </script></html>

    3、State

    是一个单一状态树,这个state中维护着整个应用的数据管理的核心对象。

    (1)、通过计算属性获取state

    computed计算属性是获取vuex状态的最简单的方式。(store.state.count)
    state变化,计算属性会重新获取state中变化的值。

    const Counter = {
        template:"<span>{{count}}</span>",
        computed:{
            count(){ 
                return store.state.count//核心在这里。
            }
        }
    }

    (2)、把store的实例注入到每个子组件中

    我们的需求,很多情况下要在不同的组件中引用store,我们可以跟组件中直接注入,然后就能在不同的子组件中获取state。

    var app = new Vue({
        el:'#app',
        store:store//这里就是注入store的地方
    })

    (3)、mapState——获取多个state数据

    由于计算属性每次基本上只能获取一个state中的变化。如果获取多个,就要多个计算属性来解决。这样代码就显得冗余。mapState就是用来解决这个问题。

    mutations: mapState({
        //这是箭头函数的方式
        count: state => state.count,
        //这是传字符串的方式
        count: 'count',
        //如果要使用this,只能携程函数的方式。
        countAdd(state){ 
            return this.add + state.count
        }
    })

    (4)、获取多个state的混合写法(计算属性+mapState)

    mutations:{
        count(){
            return store.state.count
        },
        ...mapState({ 其他state })
    }

    4、Getter

    如果说state通过计算属性获取的数据,我们要经过一定的操作(比如排序),那么在Getter中我们就可以提供这种操作。使得我们获取的state达到我们的需求。

    它的本质就是对state进行过滤

    const store = new Vuex.Store({
        state:{ 
            todoList:[{ 
                id: 1,
                text: 'do something1',
                isDo: true
            },{ 
                id: 2,
                text: 'do something2',
                isDo: false
            }]
        },
        getters:{ 
            doneTodos: funciton(state){ 
                return state.todoList.map(item=>item.isDo == true)
            }
        }
    })

    (1)、获取getter——store.getters

    是getter对外暴露的数据读取方式
    如: store.getters.doneTodos获取了过滤后的state

    (2)、Getter 也可以接受其他 getter 作为第二个参数

    getters: {
      // ...
      doneTodosCount: (state, getters) => {
        return getters.doneTodos.length
      }
    }
    store.getters.doneTodosCount // -> 1

    (3)、mapGetters——获取多个getters的方式

    使用方式和mapState差不多

    5、Mutation

    这是vuex提供的唯一更改store的属性。

    (1)、定义一个带有Mutation的store

    const store = new Vuex.Store({
        state:{
            count: 0
        },
        mutations:{
            increment(state){ 
                state.count++
            }
        }
    })

    触发方式:store.commit(‘increment’)

    通过这样的方式,让state中的数据改变。

    (2)、提交载荷

    意思就是在commit的时候,传入额外的参数

    store.commit('increment',{
        num: 10
    })

    也可以是这样:

    store.commit({
        type:'increment',
        num: 10})

    (3)、应该遵守的相应规则

    第一、提前在你的 store 中初始化好所有所需属性。

    第二、当需要在对象上添加新属性时,你应该:
    Vue.set(obj, ‘newProp’, 123)
    state.obj = { …state.obj, newProp: 123 }
    //这两种方式都是把对象obj更新。

    6、Action

    这个属性的作用类似于Mutation,但是它提交的是mutation,而不是变更状态。并且action可以包含任何异步状态。

    (1)、注册action

    const store = new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
        increment (state) {
          state.count++
        }
      },
      actions: {
        increment (context) {
          context.commit('increment')
        }
      }
    })

    actions中的函数的参数是context,这个context有commit、getter、state等属性。

    (2)、分发 Action

    定义好了Action,就需要在JavaScript中触发这个Action。我们通过dispatch来触发。

    store.dispatch('increment')
    • 1
    // 以载荷形式分发
    store.dispatch('incrementAsync', {
      amount: 10
    })
    
    // 以对象形式分发
    store.dispatch({
      type: 'incrementAsync',
      amount: 10
    })

    (3)、异步操作

    actions: {
      incrementAsync ({ commit }) {
        setTimeout(() => {
          commit('increment')
        }, 1000)
      }
    }

    (4)、在组件中分发 Action

    this.$store.dispatch('xxx') //分发 action

    7、module模块组

    随着项目越来越大,我们定义的状态会越来越多,这个时候,我们要对我们的状态进行模块划分。而module就是来干这样的事情的。
    第一步、定义模块。

    const moduleA = {
        state:{},
        getters:{
        },
        mutations:{},
        actions:{}
    }

    第二步、改变 Vuex.Stroe 的写法。

    store = new Vuex.Store({
        modules:{ a: moduleA }
    })

    第三步、在页面中的使用方式

    <div>{{$store.state.a.count}}</div>

    如果想在页面中使用computed直接获取,可以这样写:

    computed:{
        count(){
            return this.$store.state.a.count;
        }
    }
     
     
     
  • 相关阅读:

    c#常用的基础概念
    Visual Studio2010+SOS.dll调试入门 摘自 http://www.cnblogs.com/luminji/archive/2011/01/27/1946217.html
    优化数据库之前的10个问题
    js数组清空的两种方式
    我的资源(网站, 工具)
    iis使用十大原则
    SQL2005分页存储过程
    温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件
    无法获得数据库 'model' 上的排他锁 网上搜索结果 IT
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12484453.html
Copyright © 2011-2022 走看看