Vue | Vuex中五大属性及其辅助函数的使用说明

 

这篇文章主要介绍了vuex中五大属性和使用说明(包括辅助函数),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。

1.state

vuex的基本数据,用来存储变量

// state存储基本数据
state: {  
   userId: '',  
}

在Vue中使用 this.$store.state.userId

我们可以通过Vue的computed获得Vuex的state

// An highlighted block
const store = new Vuex.Store({
    state: {
        count:0
    }
})

const app = new Vue({
    //..
    store,
    computed: {
        count: function(){
            return this.$store.state.count
        }
    },
    //..
})

mapState辅助函数

当一个组件需要获取多个状态时候,将这些状态都声明为计算属性会有些重复和冗余。

为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键。

将 Vuex store 中的状态映射为组件的计算属性, mapState有两种常用的写法,分别是对象语法和数组语法:

数组语法

import { mapState } from 'vuex';
 
export default {
 // 映射计算属性
 computed: mapState([
   // 映射 this.count 为 store.state.count
   'count'
 ])
 //...
}

在数组语法中,我们只需列出需要映射的状态属性名称,而不需要指定映射的模块。这种写法会自动将这些属性映射到组件的根状态(即this.$store.state)中。  

对象语法

写法一

import { mapState } from 'vuex';
 
export default {
 // 映射计算属性
 computed: mapState({
   // 映射 this.count 为 store.state.count
   count:state=>state.uploadfile.count
 })
 //...
}

在对象语法中,我们通过一个对象来定义映射关系,在键值对中指定组件中的计算属性名称作为键,然后使用箭头函数返回需要映射的状态值。 

写法二

import { mapState } from 'vuex';
 
export default {
  computed: {
    ...mapState('uploadfile', ['count'])
  },
  // ...
};

推荐使用第二种这种写法。原因如下:

① 语法更加简洁明了,直接指定模块名和需要映射的属性名称不需要额外的箭头函数或命名空间参数。

② 在组件中使用count时,可以清晰地知道该属性来自于哪个模块,提高了可读性。

③ 当需要映射多个属性时,可以在数组中列出所有需要映射的属性,使代码更加整洁。

总结:

在大型项目中,更推荐使用对象语法 ...mapState('module', ['property']) 来映射状态属性。这是因为大型项目通常具有复杂的模块化结构,并且存在多个模块之间的状态共享和交互。

以下是选择对象语法的原因:

模块明确:在大型项目中,往往存在多个模块,每个模块都有自己的状态属性。使用对象语法可以明确指定所需属性属于哪个模块,将状态属性与特定模块关联起来,提高了代码的可读性和可维护性。

避免命名冲突:在大型项目中,可能会存在多个模块中同名的状态属性。使用对象语法,可以避免不同模块中的状态属性名称冲突,减少潜在的错误。

模块解耦:使用对象语法可以将组件与特定模块解耦。当模块内部的状态结构发生变化时,只需更新模块内部的代码,而不需要修改组件中的映射代码。这有助于降低代码的耦合性和维护成本。

总之,对于大型项目来说,对象语法更具可扩展性、可读性和维护性,能更好地管理和组织模块化状态属性。使用对象语法能够更清晰地表达状态属性来自于哪个模块,并避免潜在的冲突和错误。


state:用来存储公共状态, state中存储的数据都是响应式的。

响应式原因:state里面有get

### Vue3 中 Vuex 的集成与使用方法 #### 一、Vuex 简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式[^2]。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 #### 二、Vuex 基本结构 在 Vuex 中,核心概念包括 `state`(状态)、`mutations`(更改状态的方法)、`actions`(异步操作触发 mutations)、以及 `getters`(计算属性)。以下是这些部分的具体说明: - **State**: 存储全局共享的数据。 - **Mutations**: 修改 State 的唯一途径,必须同步执行。 - **Actions**: 处理异步逻辑的地方,最终会提交 Mutations 来更新 State。 - **Getters**: 类似于 Store 上的计算属性,用于派生一些基于 State 的状态。 #### 三、Vue3 中 Vuex 的安装与配置 为了在 Vue3 项目中使用 Vuex,首先需要安装 Vuex 并将其引入到项目中。具体步骤如下所示: 1. 安装 Vuex: ```bash npm install vuex@next --save ``` 2. 创建 Vuex Store 文件 (`src/store/index.js`): ```javascript import { createStore } from 'vuex'; const state = { count: 0, }; const mutations = { increment(state) { state.count++; }, decrement(state) { state.count--; } }; const actions = { incrementAction(context) { context.commit('increment'); }, decrementAction(context) { context.commit('decrement'); } }; const getters = { doubleCount(state) { return state.count * 2; } }; export default createStore({ state, mutations, actions, getters }); ``` 3. 在主入口文件 (`main.js`) 注册 Vuex Store: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import store from './store'; const app = createApp(App); app.use(store); // 将 Vuex Store 添加到 Vue 实例中 app.mount('#app'); ``` #### 四、在组件中使用 Vuex 通过 Vuex 提供的辅助函数可以在组件内部轻松访问和修改 Store 数据。下面是一个简单的例子展示如何读取和修改 Store 中的状态。 ##### 示例代码 ```html <template> <div> <p>Current Count: {{ count }}</p> <button @click="increment">Increment</button> <button @click="decrement">Decrement</button> <p>Double Count: {{ doubleCount }}</p> </div> </template> <script> import { mapState, mapGetters, mapActions } from 'vuex'; export default { computed: { ...mapState(['count']), ...mapGetters(['doubleCount']) }, methods: { ...mapActions(['incrementAction', 'decrementAction']), increment() { this.incrementAction(); }, decrement() { this.decrementAction(); } } }; </script> ``` 上述代码展示了如何利用 `mapState`, `mapGetters`, 和 `mapActions` 辅助函数来简化对 Vuex Store 的访问和调用[^4]。 #### 五、模块化功能支持 对于大型应用程序来说,将 Store 划分为多个模块有助于提高代码的可维护性和清晰度。可以通过定义不同的模块并将它们组合在一起形成完整的 Store 结构[^5]。 例如,在 `modules/counter.js` 中定义一个新的模块: ```javascript const counterModule = { namespaced: true, state: () => ({ value: 0 }), mutations: { increaseValue(state) { state.value += 1; } }, actions: { asyncIncrease({ commit }) { setTimeout(() => { commit('increaseValue'); }, 1000); } }, getters: { doubledValue: (state) => state.value * 2 } }; export default counterModule; ``` 然后在主 Store 文件中导入该模块: ```javascript import { createStore } from 'vuex'; import counter from './modules/counter'; export default createStore({ modules: { counter } }); ``` 这样就可以按照命名空间的形式分别管理和调用不同模块中的数据和方法了。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

儒雅的烤地瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值