【转】[Vue] VueX 的使用
来自:kimi.ai
在 Vue.js 中,Vuex 是一个专为 Vue 应用设计的状态管理模式,用于集中管理应用的状态。Vuex 的核心概念包括 State、Getters、Mutations 和 Actions。以下是对这些概念的详细解释以及它们的用法示例。
1. State
state
是 Vuex 中存储应用状态的地方。它类似于 Vue 组件中的 data
,但它是全局共享的。示例代码
JavaScript复制
// store/index.js
import { createStore } from 'vuex';
export default createStore({
state: {
count: 0
}
});
2. Getters
getters
是 Vuex 中的计算属性,用于从 state
中派生出一些状态。它们类似于 Vue 组件中的 computed
属性。示例代码
JavaScript复制
// store/index.js
import { createStore } from 'vuex';
export default createStore({
state: {
count: 0
},
getters: {
doubleCount(state) {
return state.count * 2;
}
}
});
在组件中使用
getters
:vue复制
<template>
<div>
<p>Count: {{ count }}</p>
<p>Double Count: {{ doubleCount }}</p>
</div>
</template>
<script>
import { mapState, mapGetters } from 'vuex';
export default {
computed: {
...mapState(['count']),
...mapGetters(['doubleCount'])
}
};
</script>
3. Mutations
mutations
是用于修改 state
的唯一方式。它们是同步的,并且必须是纯函数(即不能有副作用)。mutations
通常接收两个参数:state
和 payload
。示例代码
JavaScript复制
// store/index.js
import { createStore } from 'vuex';
export default createStore({
state: {
count: 0
},
mutations: {
increment(state) {
state.count += 1;
},
decrement(state) {
state.count -= 1;
},
setCount(state, payload) {
state.count = payload;
}
}
});
在组件中触发
mutations
:vue复制
<template>
<div>
<p>Count: {{ count }}</p>
<button @click="increment">Increment</button>
<button @click="decrement">Decrement</button>
<button @click="setCount(10)">Set Count to 10</button>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex';
export default {
computed: {
...mapState(['count'])
},
methods: {
...mapMutations(['increment', 'decrement', 'setCount'])
}
};
</script>
4. Actions
actions
类似于 mutations
,但它们可以包含异步操作。actions
不能直接修改 state
,而是通过调用 mutations
来修改 state
。示例代码
JavaScript复制
// store/index.js
import { createStore } from 'vuex';
export default createStore({
state: {
count: 0
},
mutations: {
increment(state) {
state.count += 1;
},
decrement(state) {
state.count -= 1;
},
setCount(state, payload) {
state.count = payload;
}
},
actions: {
increment({ commit }) {
commit('increment');
},
decrement({ commit }) {
commit('decrement');
},
setCount({ commit }, payload) {
commit('setCount', payload);
},
asyncIncrement({ commit }) {
setTimeout(() => {
commit('increment');
}, 1000);
}
}
});
在组件中触发
actions
:vue复制
<template>
<div>
<p>Count: {{ count }}</p>
<button @click="increment">Increment</button>
<button @click="decrement">Decrement</button>
<button @click="setCount(10)">Set Count to 10</button>
<button @click="asyncIncrement">Async Increment</button>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
export default {
computed: {
...mapState(['count'])
},
methods: {
...mapActions(['increment', 'decrement', 'setCount', 'asyncIncrement'])
}
};
</script>
5. Modules
在大型应用中,Vuex 的状态树可能会变得非常庞大。为了更好地管理状态,Vuex 允许将状态树分割成模块(
modules
)。每个模块拥有自己的 state
、mutations
、actions
和 getters
。示例代码
JavaScript复制
// store/modules/counter.js
const counterModule = {
state: {
count: 0
},
mutations: {
increment(state) {
state.count += 1;
}
},
actions: {
increment({ commit }) {
commit('increment');
}
},
getters: {
doubleCount(state) {
return state.count * 2;
}
}
};
export default counterModule;
在主
store
中引入模块:JavaScript复制
// store/index.js
import { createStore } from 'vuex';
import counterModule from './modules/counter';
export default createStore({
modules: {
counter: counterModule
}
});
在组件中使用模块中的状态和方法:
vue复制
<template>
<div>
<p>Count: {{ count }}</p>
<p>Double Count: {{ doubleCount }}</p>
<button @click="increment">Increment</button>
</div>
</template>
<script>
import { mapState, mapGetters, mapActions } from 'vuex';
export default {
computed: {
...mapState('counter', ['count']),
...mapGetters('counter', ['doubleCount'])
},
methods: {
...mapActions('counter', ['increment'])
}
};
</script>
总结
-
state
:存储应用的状态。 -
getters
:从state
中派生出一些状态,类似于 Vue 的computed
属性。 -
mutations
:同步地修改state
,必须是纯函数。 -
actions
:可以包含异步操作,通过调用mutations
来修改state
。 -
modules
:将状态树分割成模块,便于管理大型应用的状态。
通过合理使用这些功能,你可以更好地管理 Vue 应用中的状态。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2024-02-05 [转][Centos]安装 gogs
2024-02-05 【转】【Centos】配置静态IP
2024-02-05 【转】【Centos】安装 VMware Tools
2024-02-05 [转][Linux]安装 Centos