vuex理解

vuex 的引入放在的是main.js入口文件,然后在构建实例处挂载,也就是说,store这个文件在所有的页面都可以使用,就相当于组件的router 一样,路由可以通过this.$router访问,那么store 也可以通过this.$store.state访问数据;

可以在store文件夹下面建立action,mutation,和modules文件夹,亦可以只建立modules文件夹,然后文件夹里再建立文件,细分文件的归属;同时你也可以这样,直接把文件分为state.js,cation.js,mutation.js,不过这样的话一个数据的更改要跑几个文件夹,有点麻烦,vue2升级vue3也有提到这种麻烦,所以推荐在modules文件夹下的某一个文件夹内写完所有然后导出

这是一个文件夹内的结构,state 是数据,相当于data,getter是计算属性,actions异步提交dispatch,其实也是提交到mutation,只不过是异步的,mutation是同步的commit,注意命名规范,提交的命名是全部大写,可以小写

import { resetRouter } from '@/router';
import { getToken, removeToken, removeAuthorization } from '@/utils/auth';
import { getAccount, setAccount, removeAccount } from '@/utils/account';
import { loginByUsername, logout } from '@/api/account';
import store from '@/store';


const user = {
  state: {
    account: getAccount(),
    token: getToken() || '',
  },
  getters: {
    account: state => state.account,
    token: state => state.token,
  },
  actions: {
    // 用户名登录
    loginByUsername({ commit }, account) {
      return new Promise(async (resolve, reject) => {
        try {
          const res = await loginByUsername(account);
          if (res.success) {
            commit('SET_ACCOUNT', res.data);
            setAccount(res.data);
            // setToken(res.data.token || '');
            // commit('SET_TOKEN', data.token || '');
            resolve(res);
          } else {
            resolve(res);
          }
        } catch (error) {
          reject(error);
        }
      });
    },
    // 退出登录
    logout({ commit }, isExpiration = false) {
      return new Promise(async (resolve) => {
        try {
          if (!isExpiration) {
            // 非会话过期, 即为主动退出登录, 需发请求
            const res = await logout();
            console.log('logout res', res);
          }
          commit('SET_TOKEN', '');
          commit('SET_ACCOUNT', null);
          // 初始化store中菜单
          commit('SET_MENUS', []);
          commit('SET_AUTH_LIST', []);
          commit('SET_IS_GET_MENU', false);
          // 清除字典数据
          commit('CLEAR_ALL_DICTIONARY_STATE_MUTATIONS');
          store.dispatch('delAllViewsToOther');
          removeToken();
          removeAuthorization();
          removeAccount();
          resetRouter();
          resolve();
        } catch (error) {
          console.log('logout error', error);
        }
      });
    },
  },
  mutations: {
    SET_ACCOUNT: (state, account) => {
      state.account = account;
    },
    SET_TOKEN: (state, token) => {
      state.token = token;
    },
  },
};

export default user;


注意mutation的方法,接收的参数,第一个是state,第二个是替换的参数,改变state数据只能通过mutation来更改;

说一下action的方法和mustation 方法

// 方法一:mutation ,通过context 上下文触发事件,payload 是承载
export const saveDbSource = (context, payload) => {
   context.commit('saveDbSource', payload);
};
 
// 方法二:action,通过commit,第二个参数都是payload,这是为了保存数据,不然vuex的数据就是空值
export const saveDbSource = ({ commit }, payload) => {
  commit('saveDbSource', payload);
};


vuex的数据更改的使用:

页面中定义方法,点击就触发,然后点击触发的是提交到mutation的方法和挟带修改的参数、

<template>
<div>
  <p>当前最新的count值为:{{$store.state.count}}</p>
  <button @click="handleAdd">+1</button>
  //这里的handleAdd是触发的方法
</div>
</template>
<script>
// import {mapState} from 'vuex'
export default {
  name: 'addition',
  components: {},
  data () {
    return {
    }
  },
  methods:{
    handleAdd(){
      this.$store.commit('add',1)
      // 点击方法体handleAdd,触发提交store的add方法,add是store的方法
    }
  },
  // computed: {
  //   ...mapState(['count'])
  // }
}
</script>
<style scoped>
</style>


store.js的方法:
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    // 注意方法的参数接收两个参数,一个state 一个是传进来的参数
    add(state,num){
      state.count= state.count+ num
    },
    del(state,num){
      if(state.count >0){
        state.count=state.count-num;
      }else{
        state.count =0
      }
     
    }
  },
  actions: {
  },
  modules: {
  }
})

同时可以用辅助函数来分发数据,其实原理是挺简单的,写在计算属性内,再展开数组内的属性,如:

<h3>当前最新的count值为:{{count}}</h3>

import { mapState } from 'vuex'

computed: {

...mapState(['count']) // 用...展开运算符把Count展开在资源属性里,用上了辅助函数的时候,获取state里面的数据就不用$store.state.count了,直接count

}

如果是mutation的话,可以把辅助函数写在方法里面,展开数组里的方法体,调用store里面的mutaion的方法体和传递参数;如:

<template>
<div>
  <h3>当前最新的count值为:{{count}}</h3>
  <button @click="handleDel">-1</button>
  <button @click="DelN">-N</button>
</div>
</template>
<script>
import { mapMutations, mapState } from 'vuex'
export default {
  name: 'subtraction',
  components: {},
  data () {
    return {
    }
  },
  // 用另一种方法提交变更的数据
  // 通过辅助函数来实现提交,记得传递参数
  methods:{
    ...mapMutations(['del','jian']),
    handleDel(){
      this.del(1)
    },
    DelN(){
      this.jian(3)
    }
  },
  computed: {
    ...mapState(['count']) // 用...展开运算符把Count展开在资源属性里,用上了辅助函数的时候,获取state里面的数据就不用$store.state.count了,直接count
  }
}
</script>
<style  scoped>
</style>

 

这次先写到这里,里面的单词在总结的时候经常有写错,请多包涵,看到错误的请指正,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vuex是一个专为Vue.js应用程序开发的状态管理模式。它主要用于管理应用程序的状态,其中包括数据的获取、修改和同步,以及在不同组件之间共享数据。 Vuex的核心概念主要有以下四个: 1. State(状态):State是存储应用程序中所有组件共享的数据的地方,可以将它看作是应用程序的单一源 of truth(唯一数据源)。它类似于组件中的data属性,但是可以被多个组件共享。 2. Mutations(变更):Mutations是用来修改State的唯一方式。它们类似于事件,每个Mutation都有一个字符串类型的事件类型和一个回调函数。在回调函数中,我们可以对State进行修改。Mutations只能进行同步操作。 3. Actions(动作):Actions用于异步修改或触发Mutations。它们类似于Mutations,但是可以执行异步操作,并且可以包含任意的业务逻辑。Actions通过提交Mutations来间接修改State。 4. Getters(获取器):Getters用于从Store中获取State的派生状态,类似于计算属性。它们可以接收State作为第一个参数,并且可以接收其他Getters作为第二个参数,从而实现对State的复杂统计或过滤。 Vuex的使用步骤如下: 1. 安装Vuex:在Vue项目中使用npm或者yarn安装Vuex。 2. 创建一个Store:通过创建一个Store实例来管理应用程序的状态。在Store中定义State、Mutations、Actions和Getters。 3. 在Vue组件中使用State:通过this.$store.state来访问State中的数据。 4. 在Vue组件中使用Mutations:通过commit方法来触发Mutations中的回调函数,从而修改State。 5. 在Vue组件中使用Actions:通过dispatch方法来触发Actions中的回调函数,从而间接修改State。 6. 在Vue组件中使用Getters:通过this.$store.getters来访问Getters中的派生状态。 通过合理使用Vuex,我们可以更好地管理Vue.js应用程序的状态,并且实现组件间的数据共享和通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值