当前位置:   article > 正文

在vue中如何使用vuex_vue项目 引入vuex

vue项目 引入vuex

一、vuex概念

在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

二、何时使用 

多个组件需要共享数据时 

三、安装

npm install vuex@3 --save //vue2安装3 vue3安装4 

四、搭建vuex环境 

1.创建文件:src/store/index.js 

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. // 应用vuex插件
  4. Vue.use(Vuex)
  5. // 创建并暴露store
  6. export default new Vuex.Store({
  7. // 数据,相当于data
  8. state: {
  9. },
  10. //准备getters——用于将state中的数据进行加工
  11. getters: {
  12. },
  13. //准备mutations——用于操作数据(state)
  14. mutations: {
  15. },
  16. //准备actions——用于响应组件中的动作
  17. actions: {
  18. },
  19. modules: {}
  20. })

2.在main.js中引入 

  1. //引入store
  2. import store from './store'
  3. //创建vm
  4. new Vue({
  5. el:'#app',
  6. render: h => h(App),
  7. store
  8. })

五、 核心概念

vuex中一共有五个状态 State  Getters  Mutations   actions   Modules

5.1 state

统一定义公共数据,相当于data

在state中写入的数据,在任意组件中都可使用

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. Vue.use(Vuex)
  4. export default new Vuex.Store({
  5. state: {
  6. sum: 0,
  7. school:"尚硅谷",
  8. subject:"前端",
  9. }
  10. })

使用方法一:

<div>{{$store.state.sum}}</div>

使用方法二: 

  1. <div>{{sum}}</div>
  2. computed:{
  3. sum(){
  4. return this.$store.state.sum
  5. },
  6. }

使用方法三:

  1. import {mapState} from "vuex"
  2. computed:{
  3. //对象写法
  4. ...mapState({sum:'sum',school:'school'}),
  5. //数组写法
  6. ...mapState(['sum','school'])
  7. }

5.2 getters

类似于computed(计算属性,对现有的状态进行计算得到新的数据),用于将state中的数据进行加工

  1. //准备getters——用于将state中的数据进行加工
  2. getters: {
  3. bigSum(state){
  4. return state.sum * 10
  5. }
  6. }

使用方法一:

<h1>{{$store.getters.bigSum}}</h1>

使用方法二:

  1. <div>{{bigSum}}</div>
  2. computed:{
  3. sum(){
  4. return this.$store.getters.bigSUm
  5. },
  6. }

使用方法三:

  1. <p>{{bigSum}}</p>
  2. import {mapGetters} from "vuex"
  3. computed:{
  4. //对象写法
  5. ...mapGetters({bigSum:"bigSum"}),
  6. //数组写法
  7. ...mapGetters(['bigSum'])
  8. }

5.3 Mutations

使用它来操作数据(类似于methods) 

对数据进行加减操作: 

  1. mutations: {
  2. add(state, value) {
  3. state.sum += value
  4. },
  5. reduce(state,value){
  6. state.sum -= value
  7. }
  8. },

 点击两个按钮对sum进行加减的操作

  1. <button @click="add">+</button>
  2. <button @click="reduce">-</button>

方法一:

使用commit触发mutation中的方法

  1. methods:{
  2. add(){
  3. this.$store.commit('add',2)
  4. },
  5. reduce(){
  6. this.$store.commit('reduce',2)
  7. }
  8. }

方法二:

使用辅助函数,若需要传递参数,再绑定事件时传递好参数: <button @click="add(2)">+</button>

  1. import {mapMutations} from "vuex"
  2. methods:{
  3. //对象形式
  4. ...mapMutations({add:'add',reduce:'reduce'}),
  5. //数组形式
  6. ...mapMutations(['add','reduce'])
  7. }

5.4 Actions

用于响应组件中的动作,发起异步请求 

  1. //准备actions——用于响应组件中的动作
  2. actions: {
  3. odd(context,value){
  4. if(context.state.sum % 2){
  5. context.commit('add',value)
  6. }
  7. },
  8. },

 使用方法一:

  1. <button @click="odd">当前求和为奇数再加</button>
  2. methods:{
  3. odd(){
  4. this.$store.dispatch('odd',2)
  5. }
  6. }

使用方法二:

使用辅助函数,若需要传递参数,再绑定事件时传递好参数: <button @click="odd(2)">当前求和为奇数再加</button>

  1. import {mapActions} from "vuex"
  2. methods:{
  3. //对象形式
  4. ...mapActions({odd:'odd'}),
  5. //数组形式
  6. ...mapActions(['odd'])
  7. }

5.5 Modules 

模块拆分 +命名空间

目的:让代码更好维护,让多种数据分类更加明确。

 修改 store/index.js文件

  1. //该文件用于创建Vuex中最为核心的store
  2. import Vue from 'vue'
  3. //引入Vuex
  4. import Vuex from 'vuex'
  5. import countOptions from './count'
  6. import personOptions from './person'
  7. //应用Vuex插件
  8. Vue.use(Vuex)
  9. //创建并暴露store
  10. export default new Vuex.Store({
  11. modules:{
  12. countAbout:countOptions,
  13. personAbout:personOptions
  14. }
  15. })

count.js文件和person.js文件:

  1. export default {
  2. // 开启命名空间
  3. namespaced:true,
  4. actions:{
  5. },
  6. mutations:{
  7. },
  8. state:{
  9. },
  10. getters:{
  11. },
  12. }

六、开启命名空间后的使用方法: 

1.组件中读取state数据:

  1. //方式一:自己直接读取
  2. this.$store.state.personAbout.list
  3. //方式二:借助mapState读取:
  4. ...mapState('countAbout',['sum','school','subject']),

2.组件中读取getters数据: 

  1. //方式一:自己直接读取
  2. this.$store.getters['personAbout/firstPersonName']
  3. //方式二:借助mapGetters读取:
  4. ...mapGetters('countAbout',['bigSum'])

3.组件中调用dispatch

  1. //方式一:自己直接dispatch
  2. this.$store.dispatch('personAbout/addPersonWang',person)
  3. //方式二:借助mapActions:
  4. ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

4. 组件中调用commit

  1. //方式一:自己直接commit
  2. this.$store.commit('personAbout/ADD_PERSON',person)
  3. //方式二:借助mapMutations:
  4. ...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/256998
推荐阅读
相关标签
  

闽ICP备14008679号