• vuex里的state,actions,mutations用法与理解


    state里是放定义的全局变量/常量

    1. computed: {
    2. ...mapState(['userInfo','allState']), //userInfo,allState变量
    3. ...mapState('designerPlatform', ['wallet']) //designerPlatform文件里的wallet变量
    4. },

    actions是放全局可以调用的函数,修改stae里的变量/常量 但actions里不能直接修改state的变量/常量,里面还是需要通过mutations里定义的函数来修改比如:commit('add', 1); 同时在mutations里有一个add(state,id)方法,其实它就是个“中介”。

    mutaions放真正修改state属性的方法,可以在我们的vue里直接调用,也可以通过actions来间接调用。

    一、直接调用mutations里的方法 

     首先在vuex定义:

    1. export default new Vuex.Store({
    2. state: {
    3. // 展示数据
    4. data: {},
    5. },
    6. mutations: {
    7. //方法名字自定义()
    8. changeDetail(state, data) {
    9. // 信息
    10. this.data=data
    11. }
    12. }
    13. }


    接下来调用mutaions里的方法,有两种调方式:

    1.直接调用

    1. //修改sate里的数据
    2. this.$store.commit('changeDetail',data)
    1. //使用state里的数据
    2. this.$store.state.data

    2.通过mapMutaionts引入后再调用

      在组件中导入vuex中的mapMutations:

    1. //引入vuex(mapMutations主要是传递参数,辅助函数)
    2. import {
    3. mapMutations
    4. } from "vuex"

    在methods下使用…引用

    1. methods: {
    2. ...mapMutations(['changeDetail']),
    3. }

    最后一步,在需要存入vuex的时候调用

    this.changeDetail(data)
    

    二、使用 action里的方法间接调用mutations方法

    首先在vuex定义

    1. export default new Vuex.Store({
    2. state: {
    3. //定义数据
    4. data: {},
    5. },
    6. actions: {
    7. //中介,修改数据
    8. changeDetail({ commit }, data) {
    9. commit('change',data)
    10. }
    11. },
    12. mutations:{
    13. //真正修改state里的数据
    14. change(state,data){
    15. state.detail = data
    16. }
    17. }
    18. }

    接下来调用actions中的方法,也有两种方式:

    1.直接调用

    this.$store.dispatch('changeDetail',data)

     2.通过mapActions间接调用

    在组件中导入vuex中的mapActions:

    1. import {
    2.         mapActions
    3.     } from "vuex"

    在methods 或computed下使用…引用

    1. //这相当于在当前组件下定义了一个changeDetail函数
    2. methods: {
    3.             ...mapActions(['changeDetail']),
    4. ...mapActions('designerPlatform', ['GET_WALLET']),
    5. }

    最后,在当前组件下需要的地方直接使用:

    changeDetail(data)

    不知道你们有没有疑问,反正我是有两个疑问:

    1. 既然可以在组直件里直接用 this.$store.state.data 来直接读取state里的变量,难道不能直接通过

    通过 this.$store.state.data = 'xxx‘  或this.state.data = "xxx" 来修改变量的值吗?

    答:state里面的变量(如data)不可以在组件里面进行直接修改, 强行修改不会触发视图更新。

    2.既然 actions最后也要通过mutaions里的方法来修改state里的值,为什么要多此一举来这么一层“中介”呢?

    答:因为mutaions里的函数只能进行同步操作,如果有异步操作的需求,比如调用某个接口后再修改state某个变量,这时候直接用mutaions里的方法就不行了。而actions里的方法就可以弥补这个缺陷,可以在调用了异步接口后,再在返回回调里调用mutaions里的方法。下面举个例子:

    1. const store = new Vuex.Store({
    2. state: {
    3. navList: []
    4. },
    5. mutations: {
    6. initNav(state, data) { // 第一个参数是state对象,第二个参数是res.data.data
    7. state.navList = data
    8. }
    9. },
    10. actions: {
    11. async getNav(context) {
    12. const res = await axios.get('http://127.0.0.1:3000/api/cate')
    13. context.commit('initNav', res.data.data)
    14. // 第一个参数是mutations里面的方法,第二个是参数
    15. }
    16. }
    17. })
    18. 274

  • 相关阅读:
    全局指令选择
    C++实现的代码行数统计器
    NVIDIA 7th SkyHackathon(七)Tao 目标检测模型可视化推理与导出
    2022年陕西省职称申报可以申报什么专业
    Es6 箭头函数
    深入浅出Android同步屏障机制
    EN 13984防水柔性板—CE认证
    工艺边与定位孔设计经验规则总结
    任务兼职系统开发
    Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)
  • 原文地址:https://blog.csdn.net/nnmmbb/article/details/126540391