vuejs3.0 从入门到精通——Vuex 4.x —— Getter
Vuex 4.x —— Getter
https://vuex.vuejs.org/zh/guide/getters.html
有时候我们需要从store中的state中派生出一些状态,例如对列表进行过滤并计数:
1 2 3 4 5 | computed: { doneTodosCount () { return this .$store.state.todos.filter(todo => todo.done).length } } |
如果有多个组件需要用到此属性,我们要么复制这个函数,或者抽取到一个共享函数然后在多处导入它——无论哪种方式都不是很理想。
Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。
Getter 接受 state 作为其第一个参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 | const store = createStore({ state: { todos: [ { id: 1, text: '...' , done: true }, { id: 2, text: '...' , done: false } ] }, getters: { doneTodos (state) { return state.todos.filter(todo => todo.done) } } }) |
一、通过属性访问
Getter 会暴露为store.getters
对象,你可以以属性的形式访问这些值:
1 | store.getters.doneTodos // -> [{ id: 1, text: '...', done: true }] |
Getter 也可以接受其他 getter 作为第二个参数:
1 2 3 4 5 6 | getters: { // ... doneTodosCount (state, getters) { return getters.doneTodos.length } } |
1 | store.getters.doneTodosCount // -> 1 |
二、通过方法访问
你也可以通过让 getter 返回一个函数,来实现给 getter 传参。在你对 store 里的数组进行查询时非常有用。
1 2 3 4 5 6 | getters: { // ... getTodoById: (state) => (id) => { return state.todos.find(todo => todo.id === id) } } |
1 | store.getters.getTodoById(2) // -> { id: 2, text: '...', done: false } |
注意,getter 在通过方法访问时,每次都会去进行调用,而不会缓存结果。
三、mapGetters 辅助函数
mapGetters
辅助函数仅仅是将 store 中的 getter 映射到局部计算属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import { mapGetters } from 'vuex' export default { // ... computed: { // 使用对象展开运算符将 getter 混入 computed 对象中 ...mapGetters([ 'doneTodosCount' , 'anotherGetter' , // ... ]) } } |
如果你想将一个 getter 属性另取一个名字,使用对象形式:
1 2 3 4 | ...mapGetters({ // 把 `this.doneCount` 映射为 `this.$store.getters.doneTodosCount` doneCount: 'doneTodosCount' }) |
分类:
Vue3专题精讲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具