前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >(五)Vuex 中的Actions

(五)Vuex 中的Actions

作者头像
老怪兽
发布2023-02-22 19:06:04
发布2023-02-22 19:06:04
42000
代码可运行
举报
运行总次数:0
代码可运行

Vuex 中的计的Actions

说明

actionsmutations 整体上是一样的,但是actions 支持异步代码 mutations 只支持同步代码,另外 actions 不会直接修改全局状态 而是出发 mutations 来修改全局状态

一、示例远程异步加载数据
代码语言:javascript
代码运行次数:0
复制
import { createApp } from 'vue'
import { createStore } from 'vuex'
import App from "./App.vue"

const store = createStore({
  state() {
    return {
      user: []
    }
  },

  mutations: {
    loadusers(state, payload) {
      state.user = paload.user
    }
  }

  // 定义actions 进行远程操作修改全局数据
  actions: {
    // context 可以触发 mutations 修改全局状态等
    fetchUser(context) {
      setTiomeout(() => {
        context.comit('loadusers', {user: 157****7802})
      }, 3000)
    }
  }
})

const app = createApp(App)
app.use(store)
app.mount("#app")
触发 actions
代码语言:javascript
代码运行次数:0
复制
<script>
  export default {
    created() {
      {/* dispatch 是制定用来触发 actions的 里面的参数则是在store 中 actions 中定义的函数名字 */}
      this.$store.dispatch('fetchUser')
    }
  }
</script>
二、通过 mapActions 来访问 actions
代码语言:javascript
代码运行次数:0
复制
<script>
  import { mapActions } from 'vuex'
  export default {
    // 直接在页面加载的时候调用
    created() {
      this.fetchUser()
    }

    // 把actions 中的函数映射到methods 中就可以直接通过this 来调用了
    methods: {
      mapActions(['fetchUser'])
    }
  }
</script>
三、actions 传递参数

说明

actions 也可以向 mutations 一样传递参数,都是通过第二个参数来传递

四、在 actions 中触发其他 actions

说明

如果要在 actions 中触发其他的 actions 直接通过 context 来调用就可以了,如果需要按顺序执行 actions 可以通过 promiseasyncawait 来操作,并且返回一个 promise,当上一个 actions 执行完了在调用其他需要执行的 actions.

注意

注意

需要注意的是如果在 actions 内部调用其他 actions 就不能结构 dispatch 二十 直接 dispatch('其他dispatch名字')

  • 示例代码
代码语言:javascript
代码运行次数:0
复制
import { createApp } from "vue";
import { createStore } from "vuex";
import App from "./App.vue";
import { users } from "./data/users";
import { blogs } from "./data/blogs";

const store = createStore({
  state() {
    return {
      users: [],
      blogs: [],
    };
  },
  mutations: {
    loadUsers(state, payload) {
      state.users = payload.users;
    },
    loadBlogs(state, payload) {
      state.blogs = payload.blogs;
    },
  },
  actions: {
    async fetchUsers({ commit }) {
      await new Promise((resolve) => setTimeout(resolve, 1000));
      commit("loadUsers", { users });
    },
    async fetchUsersAndBlogs({ dispatch, commit }) {
      await dispatch("fetchUsers");
      await new Promise((resolve) => setTimeout(resolve, 1000));
      commit("loadBlogs", { blogs });
    },
  },
});

const app = createApp(App);

app.use(store);

app.mount("#app");
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Vuex 中的计的Actions
    • 一、示例远程异步加载数据
    • 触发 actions
    • 二、通过 mapActions 来访问 actions
    • 三、actions 传递参数
    • 四、在 actions 中触发其他 actions
    • 注意
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档