让前端飞

vuex速成学习总结

2019-02-15  本文已影响6人  龙旗飘扬的舰队

vuex | 应用场景

store | 是全局共享状态

store | 是响应式全局变量

commit 和 action 操作

vuex 目录结构

├── index.html
├── main.js
├── api
│   └── ... # 抽取出API请求
├── components
│   ├── App.vue
│   └── ...
└── store
    ├── index.js          # 我们组装模块并导出 store 的地方
    ├── actions.js        # 根级别的 action
    ├── mutations.js      # 根级别的 mutation
    └── modules
        ├── cart.js       # 购物车模块
        └── products.js   # 产品模块

严格模式(不建议设置)


三步跑起第一个 vuex 程序

Vue.use(Vuex);
export default new Vuex.Store({
    state: {
        count: 0
    },
}
import store from "./store";
new Vue({
      el: "#app",
      store,
      router: router,
      render: h => h(App)
});
export default {
  data() {
        return {};
  },
  computed: {
        count() {
              return this.$store.state.count;
        }
  }
};

基础概念的完全理解

state | 存储数据

getters | 加工数据

//声明
getters: {
    countText: state => {
          return "the count is " + state.count;
    }
},
//调用
//在组件中保存 getters 中的数据
computed: {
    countText() {
      return this.$store.getters.countText;
    }
},

mutations | 修改 state 的唯一方式

//声明
mutations: {
    setToken(state, newToken) {
        state.data.token = newToken;
    },
    //向 store.commit 传入额外的参数,即 mutation 的 载荷(payload)
    //使用对象风格的提交方式,整个对象都作为载荷传给 mutation 函数
    incrementByAnything(state, payload) {
        state.count += payload.more;
    }
},
//调用
mounted() {
    this.$store.commit("setToken", "bbbbb");
},

actions | 允许异步操作

//先声明mutations
mutations: {
    setToken(state, newToken) {
        state.data.token = newToken;
    },
    nameToUppercase(state, friend) {
        state.data.fullName = (state.data.fullName + friend).toUpperCase();
    },
}
//声明actions,其中只能使用mutations
//actions中可以包括异步操作
//actions方法接受两个参数,第一个可以是对象,第二个是传参(可以是对象)
actions: {
    nameToUppercase({ commit,sate }, friend) {
        setTimeout(() => {
            commit("nameToUppercase", friend);
        }, 1500);
    },
    //也可以这样写,传入vue组件的实例 context
    nameToUppercase(context, friend) {
        setTimeout(() => {
            context.commit("nameToUppercase", friend);
        }, 1500);
    }
}
//在组件中调用
methods: {
    uppercaseName() {
      this.$store.dispatch("nameToUppercase", "gs");
    },
}
//在一个 actions 方法中,可以调用另一个 actions 方法
actions: {
  // ...
  actionB ({ dispatch, commit }) {
    return dispatch('actionA').then(() => {
      commit('someOtherMutation')
    })
  }
}

****==利用 async / await 实现组合 action==****

//在store中定义mutations方法
mutations: {
    nameToUppercase(state, friend) {
        state.data.fullName = (state.data.fullName + friend).toUpperCase();
    },
    nameAddmore(state, str) {
        state.data.fullName = state.data.fullName + str;
    }
}
//在store中定义actions方法
actions: {
    async nameAddmore({ commit }) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log("add 789");
                commit("nameAddmore", "789");
                resolve()
            }, 2000)
        })
    },
    async nameToUppercase({ commit, dispatch }, friend) {
        await dispatch('nameAddmore');
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log("uppercase name");
                commit("nameToUppercase", friend);
                resolve()
            }, 1000)
        })
    }
}
//在组件中调用,可见已经隐藏了所有内部实现
methods: {
    uppercaseName() {
      this.nameToUppercase("gsaaaa").then(() => {
        console.log("all completed");
      });
    },
}
//执行结果
//2s打印 add 789,显示 zhangkai789
//再1s打印 uppercase name 显示 ZHANGKAI789
//最后打印 all completed 显示 ZHANGKAI789

mapActions 辅助函数的映射

//声明
actions: {
    nameToUppercase({ commit,sate }, friend) {
        setTimeout(() => {
            commit("nameToUppercase", friend);
        }, 1500);
    },
}
//在组件中调用
methods: {
    ...mapActions(["nameToUppercase"]),
    //在其它方法中调用映射
    uppercaseName() {
      // do something...
      this.nameToUppercase("gsss");
    },
}

【...mapActions语法报错的问题】

#安装依赖
npm install --save-dev babel-plugin-transform-object-rest-spread
#在 .babelrc 配置文件中新增
{ "plugins": ["transform-object-rest-spread"] }

Module | 模块

更多功能参考

//moduleA
const moduleA = {
    namespaced: true,
    state: {
        name: "zk",
        age: 22
    },
    mutations: {
        setName(state, newName) {
            state.name = newName;
        },
    },
}
export default moduleA;

//moduleB
const moduleB = {
    namespaced: true,
    state: {
        name: "gs",
        age: 18
    },
    mutations: {
        setName(state, newName) {
            state.name = newName;
        },
    },
}
export default moduleB;

//主模块
import Vue from 'vue'
import Vuex from 'vuex'
import moduleA from './moduleA'
import moduleB from './moduleB'

Vue.use(Vuex);

export default new Vuex.Store({
    modules: {
        zk: moduleA,
        gs: moduleB
    }
})

//在Vue根实例上注册 store
import store from "./store";
new Vue({
    el: "#app",
    store,
    router: router,
    render: h => h(App)
});
//在组件中使用
computed: {
    zkName() {
      return this.$store.state.zk.name;//注意 state 的模块调用方式
    },
    gsName() {
      return this.$store.state.gs.name;//注意 state 的模块调用方式
    }
},
methods: {
    setZkName() {
      this.$store.commit("zk/setName", "lili");//注意 mutations 的模块调用方式为【目录式】
    },
    setGsName() {
      this.$store.commit("gs/setName", "bebe");//注意 mutations 的模块调用方式为【目录式】
    },
}
上一篇 下一篇

猜你喜欢

热点阅读