Vue状态管理-Vuex简要教程

vuex是什么

  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension (opens new window),提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

1. state

  • 存state相当于组件中的data 专门用来存放全局的数据
  state: {
    
     //state 储存数据
    content:0
  },

2. mutation

  • 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。
  • 相当于组件中的methods 但是它不能使用异步方法(定时器,axios)

小案例
vuex

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

export default new Vuex.Store({
    
    
  state: {
    
     //state 储存数据
    content:0
  },
  mutations: {
    
     // 修改state的数据
    increment(state) {
    
      
      state.content +=1
    },
    decrement(state) {
    
    
      state.content -=1

    }
  },
  actions: {
    
     
  },
  modules: {
    
    
  }
})

app.vue

<template>
  <div id="app">
	<h1>  {
    
    {
    
    content}}</h1>
 	<button @click="add"> + </button>
 	<button @click="del"> - </button>
  </div>
  </template>
<script>
import {
    
     mapMutations, mapState } from 'vuex' //将把vuex的mutations  mapStat e引入进来
export default {
    
    
    data() {
    
    
      return{
    
    
        msg: 'wetcome to Your Vue.js App'
      }
    },
    methods: {
    
    
      ...mapMutations(['increment','decrement']), //把vuexmutation 里面的函数放入数组中并且应用到。。。
      add() {
    
    
          this.increment()  //应用vuexmutation De increment
          //this.$store.commit('increment') //和上面意思一样
      },
      del() {
    
    
          this.decrement()//应用vuex mutation的 decrement
 		  //this.$store.commit('decrement') //和上面意思一样
      }
    },
  computed: {
    
    
    ...mapState( ['content'] ) //使用vuex state 里面储存的数据
  }
}

3. actions

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作
    重复上面的小案例
    vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

export default new Vuex.Store({
    
    
  state: {
    
     //state 储存数据
    content:0
  },
  mutations: {
    
     // 修改state的数据
    increment(state) {
    
      
      state.content +=1
    },
    decrement(state) {
    
    
      state.content -=1

    }
  },
  actions: {
    
      //调用 mutation 
    myincrement(context) {
    
    
      context.commit('increment')
     
    },
    mydecrement(context) {
    
    
      context.commit('decrement')
    },
    
  },
  modules: {
    
    
  }
})

app.vue
const products = [1,2,3,4,5] // await axios.get(…)
return products

<template>
  <div id="app">
	<h1>  {
    
    {
    
    content}}</h1>
 	<button @click="add"> + </button>
 	<button @click="del"> - </button>
  </div>
  </template>
<script>
import {
    
     mapActions, mapMutations, mapState } from 'vuex' //将把vuex的mutations  mapStat e引入进来
import {
    
     mapActions, mapMutations, mapState } from 'vuex' //将把vuex的Actions 引入进来
export default {
    
    
    data() {
    
    
      return{
    
    
        msg: 'wetcome to Your Vue.js App'
      }
    },
    methods: {
    
    
      ...mapMutations(['increment','decrement']), //把vuexmutation 里面的函数放入数组中并且应用到。。。
      add() {
    
    
         this.myincrement()  //应用vuexaction 的 myincrement

      },
      del() {
    
    
 		 this.mydecrement()  //应用vuexaction 的 mydecrement
      }
    },
  computed: {
    
    
    ...mapState( ['content'] ) //使用vuex state 里面储存的数据
  }
}

4.geeters

  • Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
  • 相当于组件中的computed getters事全局的 computed事组件内部使用的
    vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

export default new Vuex.Store({
    
    
  state: {
    
     //state 储存数据
    content:0
  },
  getters: {
    
    
    mycontent(state) {
    
    
      return 'content is '+ state.content
    }
  },
  mutations: {
    
     // 修改state的数据
    increment(state) {
    
      
      state.content +=1
    },
    decrement(state) {
    
    
      state.content -=1

    }
  },
  actions: {
    
     //调用 mutation 
    myincrement(context) {
    
    
      context.commit('increment')
    },
    mydecrement(context) {
    
    
      context.commit('decrement')
    },
  },
})

app

<template>
  <div id="app">
 <h1>  {
    
    {
    
    content}}</h1>
 <h2>{
    
    {
    
    doneCount}}</h2>
 <h3>{
    
    {
    
    doneCount}}</h3> <!-- //修改名字后 -->
 <button @click="add"> + </button>
 <button @click="del"> - </button>

  </div>
</template>
<script>
import {
    
     mapActions, mapState, mapGetters} from 'vuex' //将把vuex的mapGetters,mutations  mapStat e引入进来
export default {
    
    
    data() {
    
    
      return{
    
    
      }
    },
    methods: {
    
    
      ...mapActions(['myincrement','mydecrement']),
      add() {
    
    
          this.myincrement()  //应用vuexmutation De increment
      },
      del() {
    
    
          this.mydecrement()//应用vuex mutation的 decrement
      }
    },
  computed: {
    
    
    ...mapState( ['content'] ) ,//使用vuex state 里面储存的数据,
    ...mapGetters(['mycontent']),


    ...mapGetters({
    
    
      // 把 `this.doneCount` 映射为 `this.$store.getters.mycontent`
      doneCount: 'mycontent'
    })
  }
}
</script>
<style>
.omargin {
    
    
  margin: 0 10px;
}
</style>

5.modules

vuex拆分写法

新建文件同等与index.js文件目录 state.js mutation.js 。。。。。
vuex
在这里插入图片描述js文件 把对应的内容都填写在文件中
在这里插入图片描述完事后 你会发现 代码可以正常使用

猜你喜欢

转载自blog.csdn.net/weixin_54645059/article/details/113817555
今日推荐