【发布时间】:2022-01-15 01:34:48
【问题描述】:
我正在尝试在使用多个相互依赖的计算属性方面实现一些非常棘手的事情。
我最初的问题如下: 我们有一个计算值 A 和一个计算值 B。B 具有 A 作为依赖项。现在,A 的依赖发生了变化,但是输出的值还是一样的,所以重新计算了,但是返回的值是一样的。
根据我的调查发现,即使A的输出值没有改变,如果重新计算A,那么B也将被重新计算。我想知道是否有办法实现这种行为
为了给你提供上下文,让我首先给你一个与我的真实用例足够接近的具体例子:
<script setup>
import { ref, reactive, computed } from 'vue';
const formState = reactive({
field1: '',
field2: {
field2Child: 'MyChildVal',
},
});
const mapDependencies = (arrayDependencies) => {
let dependencies = {};
for (const { key, value } of arrayDependencies) dependencies[key] = value;
return dependencies;
};
const resolveFromString = (path, obj, separator = '.') => {
var properties = Array.isArray(path) ? path : path.split(separator);
return properties.reduce((prev, curr) => prev && prev[curr], obj);
};
const listDependencies = ['field2.field2Child'];
// Will re-render every time formState changes
const dependencies = computed(() =>
mapDependencies(
listDependencies.map((key) => ({
key,
value: resolveFromString(key, Object.assign({}, formState)),
}))
)
);
const dependenciesAsString = (dependencies) => {
return 'The dependencies are' + Object.entries(dependencies).map(([key, value]) => `${key} : ${value}`);
}
// Expected to re-render only when the output of "dependencies" changes. But on real usage
const computedBasedOnDependencies = computed(() => dependenciesAsString(Object.assign({}, dependencies.value)));
const ChangeState = () => formState.field1 = new Date().toString();
</script>
我创建了这个 stackblitz 的现场复制品:https://stackblitz.com/edit/vue-svtsu2?file=src/App.vue
我期望的行为:如果“dependencies”的输出没有改变,那么“computedBasedOnDependencies”开头的时间戳不应该改变
我得到的行为:即使“依赖项”输出没有改变,但重新计算时 "computedBasedOnDependencies" 也被重新计算
如果您对我无法从 Vue 反应性或任何其他实现此行为的方式中正确理解的内容有任何见解,我欢迎任何帮助。
提前致谢!
【问题讨论】:
标签: vue.js vuejs3 vue-composition-api vue-reactivity