【发布时间】:2017-11-18 10:37:06
【问题描述】:
这是一个带有 参数化 getter 的 Vuex Store 示例,我需要将其映射到 Vue 实例以在模板中使用。
const store = new Vuex.Store({
state: {
lower: 5,
higher: 10,
unrelated: 3
},
getters: {
inRange: state => value => {
console.log('inRange run')
return (state.lower <= value) && (state.higher >= value)
}
},
mutations: {
reduceLower: state => state.lower--,
incrementUnrelated: state => state.unrelated++
}
})
new Vue({
el: '#app',
template: "<div>{{ inRange(4) }}, {{ unrelated }}</div>",
store,
computed: Object.assign(
Vuex.mapGetters(['inRange']),
Vuex.mapState(['unrelated'])
),
})
setTimeout(function() {
console.log('reduceLower')
store.commit('reduceLower')
setTimeout(function() {
console.log('incrementUnrelated')
store.commit('incrementUnrelated')
}, 3000);
}, 3000);
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vuex/dist/vuex.js"></script>
<div id="app"></div>
首先,这看起来确实是有效的工作代码。但是考虑到computed 是一组缓存的计算属性,我很好奇这种情况下的行为,是否正在进行缓存?如果没有,是否需要考虑性能问题?即使该函数不会导致任何状态变化,它应该是method吗?
这是一种反模式吗?该示例不是真实示例,但我确实希望将逻辑集中在商店中。
更新
我更新了示例以说明对 inRange getter 所基于的底层 lower/higher 值的修改对于 Vue 实例确实是反应性的(尽管没有被映射为状态)。我还包含了一个 unrelated 值,它不是计算的一部分,如果映射的 getter 被缓存,修改不相关的值不应该触发 getter 再次被调用,但是确实如此。
我的结论是没有缓存,因此它的性能比传统的计算属性差,但它在功能上仍然是正确的。
关于这种模式是否存在任何缺陷,或者是否存在性能更好的可用模式,这个问题仍然悬而未决。
【问题讨论】:
-
我还需要用参数缓存我的 getter。我仍然不知道该怎么做。
-
我已经详细阐述了马特的答案(必须添加另一个答案):stackoverflow.com/a/44607740/1084004
标签: javascript vue.js vuejs2 vuex