vue.js actions和getters

在Vue.js中,使用vuex状态管理库来管理全局状态。其中,actions和getters是vuex中的两个重要概念。

actions用于处理异步操作,例如发送HTTP请求或者其他需要等待结果的操作。它可以包含任意异步操作,并且可以通过commit方法来触发mutations的方法来改变state,也可以通过dispatch方法来触发其他action。

getters用于从state中派生出一些状态,类似于计算属性。它们可以帮助我们根据现有的状态计算出新的状态,并且可以在多个组件中共享和重用。

下面是一个示例,展示了如何在Vue.js应用中使用actions和getters:

// store.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    count: 0,
    todos: []
  },
  mutations: {
    increment(state) {
      state.count++;
    },
    addTodo(state, todo) {
      state.todos.push(todo);
    }
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment');
      }, 1000);
    },
    addTodoAsync({ commit }, todo) {
      setTimeout(() => {
        commit('addTodo', todo);
      }, 1000);
    }
  },
  getters: {
    completedTodos(state) {
      return state.todos.filter(todo => todo.completed);
    },
    incompleteTodos(state) {
      return state.todos.filter(todo => !todo.completed);
    }
  }
});

export default store;

在上面的代码中,我们创建了一个名为store的vuex实例,并定义了state,mutations,actions和getters。

在mutations中,我们定义了两个方法:increment和addTodo。这些方法用于更新state中的数据。

在actions中,我们定义了两个方法:incrementAsync和addTodoAsync。这些方法可以执行异步操作,并通过commit方法触发mutations中的方法来更新state中的数据。

在getters中,我们定义了两个方法:completedTodos和incompleteTodos。这些方法可以根据现有的state派生出新的状态,并且可以在组件中使用。

现在我们可以在Vue组件中使用actions和getters:

<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Completed Todos: {{ completedTodos.length }}</p>
    <p>Incomplete Todos: {{ incompleteTodos.length }}</p>
    <button @click="incrementAsync">Increment Async</button>
    <button @click="addTodoAsync">Add Todo Async</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapActions } from 'vuex';

export default {
  computed: {
    ...mapState(['count']),
    ...mapGetters(['completedTodos', 'incompleteTodos'])
  },
  methods: {
    ...mapActions(['incrementAsync', 'addTodoAsync'])
  }
};
</script>

在上面的示例中,我们使用了mapState,mapGetters和mapActions辅助函数来将state, getters和actions映射到组件的computed和methods中,这样我们就可以直接在模板中使用它们。

总结一下,actions用于处理异步操作,并通过commit方法触发mutations来更新state。getters用于派生出新的状态,并在多个组件中共享和重用。通过使用这两个概念,我们可以更好地组织和管理Vue.js应用的全局状态。

[vuex] unknown getter: cart/isAllChecked mappedGetter @ vuex.esm.js:978 Watcher.get @ vue.runtime.esm.js:3351 Watcher.evaluate @ vue.runtime.esm.js:3445 computedGetter @ vue.runtime.esm.js:5284 get @ vue.runtime.esm.js:5104 render @ index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Layout/cart.vue?vue&type=template&id=d5f74fca&scoped=true:81 Vue._render @ vue.runtime.esm.js:2637 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher.run @ vue.runtime.esm.js:3422 flushSchedulerQueue @ vue.runtime.esm.js:4007 eval @ vue.runtime.esm.js:3064 flushCallbacks @ vue.runtime.esm.js:2992 Promise.then(异步) timerFunc @ vue.runtime.esm.js:3017 nextTick @ vue.runtime.esm.js:3074 queueWatcher @ vue.runtime.esm.js:4089 Watcher.update @ vue.runtime.esm.js:3413 Dep.notify @ vue.runtime.esm.js:814 reactiveSetter @ vue.runtime.esm.js:1027 setCartListMethods @ cart.js:13 wrappedMutationHandler @ vuex.esm.js:801 commitIterator @ vuex.esm.js:448 eval @ vuex.esm.js:447 _withCommit @ vuex.esm.js:594 commit @ vuex.esm.js:446 boundCommit @ vuex.esm.js:389 local.commit @ vuex.esm.js:749 getCartListActions @ cart.js:41 await in getCartListActions(异步) wrappedActionHandler @ vuex.esm.js:807 dispatch @ vuex.esm.js:492 boundDispatch @ vuex.esm.js:386 created @ index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Layout/cart.vue?vue&type=script&lang=js:27 invokeWithErrorHandling @ vue.runtime.esm.js:2945 callHook$1 @ vue.runtime.esm.js:3917 Vue._init @ vue.runtime.esm.js:5434 VueComponent @ vue.runtime.esm.js:5561 createComponentInstanceForVnode @ vue.runtime.esm.js:4409 init @ vue.runtime.esm.js:4263 merged @ vue.runtime.esm.js:4426 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 createChildren @ vue.runtime.esm.js:6320 createElm @ vue.runtime.esm.js:6228 patch @ vue.runtime.esm.js:6691 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 init @ vue.runtime.esm.js:4264 merged @ vue.runtime.esm.js:4426 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 createChildren @ vue.runtime.esm.js:6320 createElm @ vue.runtime.esm.js:6228 patch @ vue.runtime.esm.js:6691 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 init @ vue.runtime.esm.js:4264 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 patch @ vue.runtime.esm.js:6722 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 eval @ main.js:14 ./src/main.js @ app.js:955 __webpack_require__ @ app.js:1690 (匿名) @ app.js:2801 __webpack_require__.O @ app.js:1732 (匿名) @ app.js:2802 (匿名) @ app.js:2804 显示另外 71 个框架 收起 cart.js:13 [Vue warn]: Duplicate keys detected: '10044'. This may cause an update error. found in ---> <CartPage> at src/views/Layout/cart.vue <LayoutIndex> at src/views/Layout/index.vue <App> at src/App.vue <Root> warn @ vue.runtime.esm.js:4469 checkDuplicateKeys @ vue.runtime.esm.js:6499 updateChildren @ vue.runtime.esm.js:6438 patchVnode @ vue.runtime.esm.js:6550 updateChildren @ vue.runtime.esm.js:6450 patchVnode @ vue.runtime.esm.js:6550 updateChildren @ vue.runtime.esm.js:6446 patchVnode @ vue.runtime.esm.js:6550 patch @ vue.runtime.esm.js:6696 Vue._update @ vue.runtime.esm.js:3660 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher.run @ vue.runtime.esm.js:3422 flushSchedulerQueue @ vue.runtime.esm.js:4007 eval @ vue.runtime.esm.js:3064 flushCallbacks @ vue.runtime.esm.js:2992 Promise.then(异步) timerFunc @ vue.runtime.esm.js:3017 nextTick @ vue.runtime.esm.js:3074 queueWatcher @ vue.runtime.esm.js:4089 Watcher.update @ vue.runtime.esm.js:3413 Dep.notify @ vue.runtime.esm.js:814 reactiveSetter @ vue.runtime.esm.js:1027 setCartListMethods @ cart.js:13 wrappedMutationHandler @ vuex.esm.js:801 commitIterator @ vuex.esm.js:448 eval @ vuex.esm.js:447 _withCommit @ vuex.esm.js:594 commit @ vuex.esm.js:446 boundCommit @ vuex.esm.js:389 local.commit @ vuex.esm.js:749 getCartListActions @ cart.js:41 await in getCartListActions(异步) wrappedActionHandler @ vuex.esm.js:807 dispatch @ vuex.esm.js:492 boundDispatch @ vuex.esm.js:386 created @ index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Layout/cart.vue?vue&type=script&lang=js:27 invokeWithErrorHandling @ vue.runtime.esm.js:2945 callHook$1 @ vue.runtime.esm.js:3917 Vue._init @ vue.runtime.esm.js:5434 VueComponent @ vue.runtime.esm.js:5561 createComponentInstanceForVnode @ vue.runtime.esm.js:4409 init @ vue.runtime.esm.js:4263 merged @ vue.runtime.esm.js:4426 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 createChildren @ vue.runtime.esm.js:6320 createElm @ vue.runtime.esm.js:6228 patch @ vue.runtime.esm.js:6691 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 init @ vue.runtime.esm.js:4264 merged @ vue.runtime.esm.js:4426 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 createChildren @ vue.runtime.esm.js:6320 createElm @ vue.runtime.esm.js:6228 patch @ vue.runtime.esm.js:6691 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 init @ vue.runtime.esm.js:4264 createComponent @ vue.runtime.esm.js:6249 createElm @ vue.runtime.esm.js:6211 patch @ vue.runtime.esm.js:6722 Vue._update @ vue.runtime.esm.js:3657 updateComponent @ vue.runtime.esm.js:3757 Watcher.get @ vue.runtime.esm.js:3351 Watcher @ vue.runtime.esm.js:3341 mountComponent @ vue.runtime.esm.js:3778 Vue.$mount @ vue.runtime.esm.js:8308 eval @ main.js:14 ./src/main.js @ app.js:955 __webpack_require__ @ app.js:1690 (匿名) @ app.js:2801 __webpack_require__.O @ app.js:1732 (匿名) @ app.js:2802 (匿名) @ app.js:2804 显示另外 74 个框架 收起 cart.js:13 [Vue warn]: Duplicate keys detected: '10041'. This may cause an update error. found in ---> <CartPage> at src/views/Layout/cart.vue <LayoutIndex> at src/views/Layout/index.vue <App> at src/App.vue <Root>
最新发布
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ordinary90

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值