当前位置:   article > 正文

Vuex简单入门_state => vuex

state => vuex

一.什么是Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理架构。它借鉴了 Flux 和 Redux的设计思想,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。。状态?理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态。简单的说就是data中需要共用的属性。

二.Vuex的组成部分

完整的应用Vuex开发的应用结构应该是这样的:

简单的理解:当vue组件(vue components)发生变化的(比如用户触发点击事情,需要改变vuex状态)——》通过dispatch提交action(这里面会很多的函数,需要dispatch触发这里的事情函数)——》通过 store.commit 方法触发状态变更(mutation的方法)  ——》mutation改变state状态——》state状态改变之后,getter映射渲染vue 组件  

案例GitHub

1.State

State负责存储整个应用的状态数据,一般需要在使用的时候在跟节点注入store对象,后期就可以使用this.$store.state直接获取状态

  1. //store为实例化生成的
  2. import store from './store'
  3. new Vue({
  4. el: '#app',
  5. store,
  6. render: h => h(App)
  7. })

这个store可以理解为一个容器,包含着应用中的state等。实例化生成store的过程是:

  1. const mutations = {...};
  2. const actions = {...};
  3. const state = {...};
  4. Vuex.Store({
  5. state,
  6. actions,
  7. mutation
  8. });

后续在组件中使用的过程中,如果想要获取对应的状态你就可以直接使用this.$store.state获取,当然,也可以利用vuex提供的mapState辅助函数将state映射到计算属性中去(当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组),如

  1. //我是组件
  2. import {mapState} from 'vuex'
  3. export default {
  4. computed: mapState({
  5. count: state => state.count
  6. })
  7. }

2.Mutations

Mutations的中文意思是“变化”,利用它可以更改状态,本质就是用来处理数据的函数,其接收唯一参数值state。store.commit(mutationName)是用来触发一个mutation的方法。需要记住的是,定义的mutation必须是同步函数,否则devtool中的数据将可能出现问题,使状态改变变得难以跟踪。

  1. const mutations = {
  2. mutationName(state) {
  3. //在这里改变state中的数据
  4. }
  5. }
  6. 在组件中触发:
  7. //我是一个组件
  8. export default {
  9. methods: {
  10. handleClick() {
  11. this.$store.commit('mutationName')
  12. }
  13. }
  14. }
  15. 或者使用辅助函数mapMutations直接将触发函数映射到methods上,这样就能在元素事件绑定上直接使用了。如:
  16. import {mapMutations} from 'vuex'
  17. //我是一个组件
  18. export default {
  19. methods: mapMutations([
  20. 'mutationName'
  21. ])
  22. }

 Vuex之理解mutation的用法

3.Actions

Actions也可以用于改变状态,不过是通过触发mutation实现的,重要的是可以包含异步操作。其辅助函数是mapActions与mapMutations类似,也是绑定在组件的methods上的。如果选择直接触发的话,使用this.$store.dispatch(actionName)方法。

  1. //定义Actions
  2. const actions = {
  3. actionName({ commit }) {
  4. //dosomething
  5. commit('mutationName')
  6. }
  7. }
  8. 在组件中使用
  9. import {mapActions} from 'vuex'
  10. //我是一个组件
  11. export default {
  12. methods: mapActions([
  13. 'actionName',
  14. ])
  15. }

Vuex之理解action的用法

4.Getters

有些状态需要做二次处理,就可以使用getters。通过this.$store.getters.valueName对派生出来的状态进行访问。或者直接使用辅助函数mapGetters将其映射到本地计算属性中去。

  1. const getters = {
  2. strLength: state => state.aString.length
  3. }
  4. //上面的代码根据aString状态派生出了一个strLength状态
  5. 在组件中使用
  6. import {mapGetters} from 'vuex'
  7. //我是一个组件
  8. export default {
  9. computed: mapGetters([
  10. 'strLength'
  11. ])
  12. }

Vuex之理解Getters的用法

5.Plugins

插件就是一个钩子函数,在初始化store的时候引入即可。比较常用的是内置的logger插件,用于作为调试使用。

  1. import createLogger from 'vuex/dist/logger'
  2. const store = Vuex.Store({
  3. ...
  4. plugins: [createLogger()]
  5. })

三.mapGetters, mapMutations, mapActions, mapState 的使用

1. store 文件下

store/index.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import VuexPersist from 'vuex-persist'
  4. import user from './modules/user'
  5. import getters from './getters'
  6. Vue.use(Vuex)
  7. const vuexLocal = new VuexPersist({
  8. storage: window.sessionStorage //可选,sessionStorage/indexDB/localStorage
  9. });
  10. export default new Vuex.Store({
  11. state: {
  12. token:"1833737"
  13. },
  14. modules: {
  15. user
  16. },
  17. mutations: {
  18. },
  19. actions: {
  20. },
  21. getters,
  22. plugins: [vuexLocal.plugin]
  23. })

 store/getters.js

  1. const getters = {
  2. name: state => state.user.name
  3. }
  4. export default getters

 store/modules/user.js

 

  1. const user = {
  2. state: {
  3. name:"王一涵"
  4. },
  5. mutations: {
  6. SET_NAME: (state, name) => {
  7. state.name = name
  8. }
  9. },
  10. actions: {
  11. setName({ commit },data) {
  12. return new Promise((resolve, reject) => {
  13. commit('SET_NAME', data)
  14. })
  15. },
  16. }
  17. }
  18. export default user

2. 组件

 

  1. <template>
  2. <div id="app">
  3. <button @click="fn">按钮</button>
  4. </div>
  5. </template>
  6. <script>
  7. import { mapGetters, mapMutations, mapActions, mapState } from "vuex";
  8. export default {
  9. name: "App",
  10. components: {
  11. },
  12. data() {
  13. return {
  14. };
  15. },
  16. created() {},
  17. mounted() {
  18. console.log("开始:", this.$store.getters.name);
  19. },
  20. computed: {
  21. // ...mapGetters(["name"]),
  22. ...mapState({
  23. token: "token",
  24. name:state=> state.user.name,// 指定modules里的
  25. }),
  26. },
  27. created: function () {},
  28. methods: {
  29. // ...mapMutations(["SET_NAME"]),
  30. ...mapActions(["setName"]),
  31. fn() {
  32. console.log("token:", this.token);
  33. // this.SET_NAME("张翰");// mapMutations的方法
  34. this.setName("迪丽热巴");// mapActions的方法
  35. console.log("点击", this.name);//mapState mapGetters 访问
  36. },
  37. },
  38. };
  39. </script>
  40. <style lang="scss">
  41. </style>

四.demo

1.简单触发mutation

store.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. Vue.use(Vuex)
  4. // 引入actions, mutations, getters
  5. import mutations from "./mutations.js"
  6. //state:是容器
  7. const state = {
  8. count:10,
  9. name:"jack"
  10. }
  11. export default new Vuex.Store({
  12. state,
  13. mutations
  14. })

index.vue

  1. <template>
  2. <div>
  3. <h1>Vuex小demo</h1>
  4. <div>测试1:Count is {{count}}</div>
  5. <div>用户名:{{name}}</div>
  6. <button @click="add">+</button>
  7. <button @click="dec">-</button>
  8. <button @click="updata">改变用户名</button>
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. computed:{
  14. count(){
  15. //通过 store.state 来获取状态对象
  16. return this.$store.state.count;
  17. },
  18. name(){
  19. return this.$store.state.name;
  20. }
  21. },
  22. methods: {
  23. add(){
  24. //通过 store.commit 方法触发状态变更(mutation的方法)
  25. this.$store.commit('increment');
  26. },
  27. dec(){
  28. this.$store.commit('decrement');
  29. },
  30. updata(){
  31. //传参数
  32. this.$store.commit('updataName','修小龙');
  33. }
  34. }
  35. }
  36. </script>

mutations.js模块

  1. /*
  2. *mutations:状态改变操作方法。是vuex修改state的唯一推荐方法,
  3. */
  4. export default {
  5. //对state进行操作
  6. increment:(state) =>{
  7. return state.count ++;
  8. },
  9. decrement:(state) =>{
  10. return state.count--;
  11. },
  12. updataName:(state,userName) =>{
  13. state.name = userName;
  14. }
  15. }

从上面可以简单案例一般组件改变的事件 直接触发mutation方法 进行修改state。

2.加上action

store.js:引入action.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. Vue.use(Vuex)
  4. // 引入actions, mutations, getters
  5. import actions from "./actions.js"
  6. import mutations from "./mutations.js"
  7. //state:是容器
  8. const state = {
  9. count:10,
  10. name:"jack"
  11. }
  12. export default new Vuex.Store({
  13. state,
  14. actions,
  15. mutations
  16. })

在index.vue:改变add方法

  1. add(){
  2. //通过 store.dispatch方法触发状态变更(action创建函数的方法)
  3. this.$store.dispatch('incrementAction');
  4. },

action.js

  1. //action 模块
  2. /*action:操作行为处理模块。负责处理vue 组件接受到所有交互行为。包含同步/异步操作,支持多个同名方法,按照注册的顺序依次触发。
  3. 向后台api请求的操作就在这个模块中进行,包括触发其他action以及提交mutation的操作。该模块提供了,promise的封装,以支持action的链式触发
  4. *通过commit提交
  5. commit:状态改变提交方法。对mutetion进行提交,是唯一能执行mutation的方法
  6. *dispatch:操作行触发方法,是唯一能执行action的方法
  7. *action不能直接操作state
  8. */
  9. export default {
  10. incrementAction:(context) =>{
  11. context.commit('increment');
  12. }
  13. }

效果也是跟上面一样。加上action后,组件改变事情 触发action函数(通过dispatch触发action),action函数里面触发mutation(还是用commit来触发)

action简单的操作是可以不用,具体情况具体分析。

3.加上getters(辅助性,在基层上进行延伸的操作)

store.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. Vue.use(Vuex)
  4. // 引入actions, mutations, getters
  5. import actions from "./actions.js"
  6. import mutations from "./mutations.js"
  7. import getters from "./getters.js"
  8. //state:是容器
  9. const state = {
  10. count:10,
  11. name:"jack"
  12. }
  13. export default new Vuex.Store({
  14. state,
  15. actions,
  16.   getters,
  17. mutations
  18. })
count:10, name:"jack" } export default new Vuex.Store({ state, actions,   getters, mutations })

index.vue

  1. <template>
  2. <div>
  3. <h1>Vuex小demo</h1>
  4. <div>测试1:Count is {{count}}</div>
  5. <div>用户名:{{name}}</div>
  6. <div>通过getters改变用户名:{{userName}}</div><button @click="add">+</button>  
  7.         <button @click="dec">-</button> 
  8.          <button @click="updata">改变用户名</button>  
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. computed:{
  14. count(){
  15. //通过 store.state 来获取状态对象
  16. return this.$store.state.count;
  17. },
  18. name(){
  19. return this.$store.state.name;
  20. },
  21. userName(){
  22. return this.$store.getters.userName;
  23. }
  24. },
  25. methods: {
  26. add(){
  27. //通过 store.dispatch方法触发状态变更(action创建函数的方法)
  28. this.$store.dispatch('incrementAction');
  29. },
  30. dec(){
  31. this.$store.commit('decrement');
  32. },
  33. updata(){
  34. //传参数
  35. this.$store.commit('updataName','修小龙');
  36. }
  37. }
  38. }
  39. </script>

getters.js

  1. //getters 模块
  2. /*
  3. *getters:state对象读取方法。图中没有单独列出该模块,应该被包含在render中,组件通过该方法this.$store.getters.userName 直接读取全局state对象
  4. 而不需要去触发mutation函数
  5. */
  6. export default {
  7. userName:(state) =>{
  8. return state.name + ',Hello';
  9. }
  10. }

在之前的基层store中name上加上Hello,getters跟其他都没有关系。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/256920
推荐阅读
相关标签
  

闽ICP备14008679号