zoukankan      html  css  js  c++  java
  • vuex 的简单使用

     以main.js 和App.vue为例

    main.js中添加

    const store = new Vuex.Store ({
        state: {
            count: 0
        }
    })
    new Vue({
        store,
        render: h => h(App)
    }).$mount("#app")

     

    如果App.vue中有子组件,也可以

    <script>
        import store from './store';
        import Todos from './components/Todos.vue';
        export default {
            store,
            components: {
                Todos
            }
        }
    </script>

    一、state  唯一数据源

    使用方式一:(App.vue中)

    <template>
            <h3>{{this.$store.state.count}}</h3>
    </template>

    方式二:

    <template>
            <h3>{{count}}</h3>
    </template>
    
    <script>
    export default {
        name: "app",
        computed: {
            count() {
                return this.$store.state.count;
            }
        }
    }
    </script>

     


     

    二、mutation  更改store 中的状态的唯一方法是提交 mutation,同步函数

    实现count++

    main.js中

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

    App.vue中

    <template>
        <div>
            <h3>{{count}}</h3>
            <input type="button" value="count自增" @click="countIncrease">
        </div>
    </template>
    <script>
    //......
        methods: {
            countIncrease() {
                this.$store.commit('countIncrease')
            }
        }
    };
    </script>

    commit 可传state参数, 也可传额外的参数

        mutations: {
            countIncrease (state,n) {
                state.count += n;
            }
        }
        methods: {
            countIncrease() {
                this.$store.commit('countIncrease',100)
            }
        }


    三、getter   有时候我们需要从 state 中派生出一些状态,例如对列表进行过滤并计数:

    const store = new Vuex.Store({
      state: {
        todos: [
          { id: 1, text: '...', done: true },
          { id: 2, text: '...', done: false }
        ]
      },
      getters: {
        doneTodos: state => {
          return state.todos.filter(todo => todo.done)
        }
      }
    })

    使用方式一:

    <template>
        <div>
            <h1>{{this.$store.getters.doneTodos}}</h1>
        </div>
    </template>

     如果有多个组件需要用到此属性,此方法不合适

     

    使用方式二:

    computed: {
      doneTodosCount () {
        return this.$store.state.todos.filter(todo => todo.done).length
      }
    }
    <template>
        <div>
            <h1>{{doneTodosCount}}</h1>
        </div>
    </template>

     使用方式三:

    mapGetters 辅助函数   仅仅是将 store 中的 getter 映射到局部计算属性:

    import { mapGetters } from 'vuex'
    
    export default {
      // ...
      computed: {
      // 使用对象展开运算符将 getter 混入 computed 对象中
        ...mapGetters([
          'doneTodosCount',
          'anotherGetter',
          // ...
        ])
      }
    }
    
    如果你想将一个 getter 属性另取一个名字,使用对象形式:
    
    mapGetters({
      // 把 `this.doneCount` 映射为 `this.$store.getters.doneTodosCount`
      doneCount: 'doneTodosCount'
    })

    四、action

    Action 提交的是 mutation,而不是直接变更状态,Action 可以包含任意异步操作

    Action 通过 store.dispatch 方法触发

    const store = new Vuex.Store({
      state: {
        count: 0
      },
      mutations: {
        increment (state) {
          state.count++
        }
      },
      actions: {
        increment (context) {
          context.commit('increment')
        }
      }
    })
    <template>
        <div>
            <h1>{{count}}</h1>
            <button @click="increment">按钮</button>
        </div>
    </template>
    
    <script>
        export default {
            name: "app",
            computed: {
                count() {
                    return this.$store.state.count
                }
            },
            methods: {
                increment(){
                    this.$store.dispatch('increment')
                }
            }
        };
    </script>

     五、module 

    由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

    Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块

    const moduleA = {
      state: { ... },
      mutations: { ... },
      actions: { ... },
      getters: { ... }
    }
    
    const moduleB = {
      state: { ... },
      mutations: { ... },
      actions: { ... }
    }
    
    const store = new Vuex.Store({
      modules: {
        a: moduleA,
        b: moduleB
      }
    })
    
    store.state.a // -> moduleA 的状态
    store.state.b // -> moduleB 的状态

     

  • 相关阅读:
    SharePoint 2007 Modal Window
    SharePoint XSLT Demo
    SPGraphviz SharePoint上创建图表,关系图
    ASP.NET 缓存学习
    使用 WSPBuilder 创建List Instance WSP 包
    JQuery 简单选择器
    SharePoint 2007 _spbodyonloadfunctionnames is undefined
    SharePoint 2007 List Template WSP
    css选择器:firstchild与:firstoftype的区别
    svn has stoped working
  • 原文地址:https://www.cnblogs.com/huangyuanning/p/11745841.html
Copyright © 2011-2022 走看看