【发布时间】:2018-05-29 22:26:57
【问题描述】:
我正在尝试创建一个具有“预先输入”方面的组件,但遇到了一些困难。
该组件还有更多内容,但某些操作会触发父组件将typeaheadItems 传递给该组件,此时它应该显示它们。用户应该能够隐藏我遇到问题的预输入。
我最初的幼稚做法如下。
尝试 1
给定 Vue 组件:
<template>
<div
class="typeahead-items"
v-show="myTypeaheadItems.length">
<div class="item close-typeahead">
<i
class="icon close"
@click="closeTypeahead"></i>
</div>
<div
class="item"
v-for="item in typeaheadItems"
:key="item">
{{item}}
</div>
</div>
</template>
<script>
export default {
name: 'typeahead',
props: {
typeaheadItems: {
type: Array,
default: function () {
return [];
}
}
},
data () {
return {
};
},
methods: {
closeTypeahead: function () {
this.typeaheadItems = [];
}
}
};
</script>
这按预期工作,适当地显示和隐藏预先输入,但给了我警告:
避免直接改变prop,因为值会被覆盖 每当父组件重新渲染时。相反,使用数据或 基于道具值的计算属性。道具被变异: "typeaheadItems"
尝试 2
然后我尝试按如下方式更新组件:
v-for="item in myTypeaheadItems"
data () {
return {
myTypeaheadItems: this.typeaheadItems
};
},
methods: {
closeTypeahead: function () {
this.myTypeaheadItems = [];
}
这根本不起作用,预输入永远不会显示,也没有警告或错误。
尝试 3
最后我尝试添加手表:
watch: {
typeaheadItems: function (val) {
this.myTypeaheadItems = val.splice(0);
}
},
这不起作用并给我警告:
您可能在带有表达式的观察器中存在无限更新循环 "typeaheadItems"
我似乎无法弄清楚Vue 的方式来完成此操作。我怎样才能让一个数组道具从另一个组件进来,并且仍然在它自己的组件中对其进行操作,并让视图适当地更新而不会出现警告/错误?
更新
经过进一步审查,尝试 2 似乎是最接近“Vue 方式”的方法,它的工作原理是预先输入的项目正在为它们呈现 html 元素,但是似乎什么都没有发生,因为v-show="myTypeaheadItems.length" 似乎没有更新。除了 Vue 网站上列出的 caveats 之一之外,我不确定为什么会出现这种情况。
鉴于以下Franco Pino 的cmets,我能够尝试3 将splice 更改为slice。 这是前进的正确方式吗?
【问题讨论】:
标签: vuejs2 vue-component