【发布时间】:2018-10-27 16:25:17
【问题描述】:
我正在尝试创建一个通用搜索组件,该组件带有一个事件,该事件与搜索字符串一起发送回父级,以便父级实际上可以过滤结果。
使用下面的代码,当this.searchCriteria 的值发生变化时,为什么computed.filteredDocuments 不会重新计算?如何调整我的代码以便在调用updatedSearchString 时重新计算?
父组件
<template>
<search :searchCriteria="searchCriteria" @searchString="updatedSearchString" />
<div v-for="(doc, index) in filteredDocuments" v-bind:key="index">
<div>{{doc.filename}}</div>
</div>
</template>
<script>
import store from '../store/index'
import { mapState } from 'vuex'
// import _ from 'lodash'
import Search from '../components/search'
export default {
name: 'Parent',
components: {
Search: Search
},
data () {
return {
searchCriteria: ''
}
},
computed: {
...mapState({
documents: state => state.documents.items
}),
filteredDocuments () {
console.log('in computed')
return _(this.documents)
.filter(this.applySearchFilter)
.value()
}
},
methods: {
updatedSearchString (searchString) {
this.searchCriteria = searchString <-- I WOULD HAVE EXPECTED BY UPDATING THIS IT WOULD TRIGGER COMPUTED.FILTEREDDOCUMENTS TO RECOMPUTE
}
},
applySearchFilter (doc) {
console.log('in applySearchFilter')
// If no search criteria return everything
if (this.searchCriteria === null) {
return true
}
if (doc.filename.toLowerCase().includes(this.searchCriteria.toLowerCase())) {
return true
}
return false
}
}
</script>
子组件
<template>
<div>
<q-search v-model="search" placeholder="Search" />
</div>
</template>
<script>
export default {
name: 'Search',
props: {
searchCriteria: { type: String, required: true }
},
data () {
return {
search: null
}
},
mounted () {
this.search = this.searchCriteria // Clone
},
watch: {
search: function (newVal, oldVal) {
// If no search criteria return everything
if (!newVal) {
this.clearSearch()
}
this.$emit('searchString', newVal) <-- THIS EMITS THE SEARCH VALUE TO THE PARENT
}
}
}
</script>
【问题讨论】:
-
filteredDocuments不依赖于searchCriteria。只有过滤器回调函数是。 -
但是由于
filteredDocuments使用this.applySearchFilter的函数过滤,它使用this.searchCriteria,所以我希望它可以工作。当我在同一个组件中执行所有这些操作时,它会起作用。 -
您不应该克隆数据。在子项中使用为 searchCriteria 计算的 settable。 setter 应该进行发射。这可能不是你麻烦的根源。我不知道为什么它不适合你。你有没有机会制作一个展示问题的小提琴?
-
看起来
applySearchFilter不在您的methods部分中。 -
@RoyJ 这完全是因为
applySearchFilter不在methods中,正如您所指出的那样。