【发布时间】:2021-10-05 10:21:43
【问题描述】:
我正在努力弄清楚如何使数组的属性具有反应性。这可能吗?在下面的示例中,filteredResults 数组本身是响应式的,并且可以正常工作,但resultCountRef(包装在reactive() 中)和resultCount 字段都不是响应式的。换句话说,如果我单击Filter for Apples 按钮,filteredResults 将更改为仅一项,但两个计数字段仍保留在3。请注意,在模板中使用 {{filteredResults.length}} 确实可以按预期工作。 Here is a working sample.
这里是代码(一个 Search.vue 组合 API 组件和一个 useFilter 组合函数):
Search.vue:
<template>
<div>resultCountRef: {{resultCountRef}}</div>
<div>resultCount: {{resultCount}}</div>
<div>filteredResults.length: {{filteredResults.length}}</div>
<div>filteredResults: {{filteredResults}}</div>
<div>filters: {{filters}}</div>
<div><button @click="search()">Search</button></div>
<div><button @click="applyFilter('apples')">Filter for Apples</button></div>
</template>
<script>
import { reactive } from 'vue';
import useFilters from './useFilters.js';
export default {
setup(props) {
const products = reactive(['apples', 'oranges', 'grapes']);
const { filters, applyFilter, filteredResults } = useFilters(products);
const resultCountRef = reactive(filteredResults.value.length);
const resultCount = filteredResults.value.length;
return {
resultCountRef,
resultCount,
filteredResults,
filters,
applyFilter,
};
},
};
</script>
useFilters.js:
import { ref, onMounted } from 'vue';
function filterResults(products, filters) {
return products.filter((product) => filters.every(
(filter) => {
return product.includes(filter);
},
));
}
export default function useFilters(products) {
const filters = ref([]);
const filteredResults = ref([...products]);
const applyFilter = (filter) => {
filters.value.push(filter);
filteredResults.value.splice(0);
filteredResults.value.splice(0, 0, ...filterResults(products, filters.value));
};
return { filters, applyFilter, filteredResults };
}
【问题讨论】:
标签: vuejs3