假设我有 CountrySelect
和 CitySelect
,其中 CountrySelect
列出所有国家/地区 CitySelect
仅列出当前所选国家/地区的城市...
通过新选择的国家的正确方法是什么?正如我在vuejs文档中读到的那样:
在Vue中,父子组件关系可以概括为支持向下,事件向上 . 父母通过道具将数据传递给孩子,孩子通过事件向父母发送消息 . 让我们看看他们接下来的工作方式 .
所以在这种情况下,我会检测 CountrySelect
内的选择框的更改并触发事件 changed
以及国家对象 . 然后 CountrySelect
的父组件将侦听此事件,然后当发生这种情况时将更新其属性 country
. 属性 country
在父组件中是"observed",更改其值将导致DOM更新,因此 <city-select>
标记上的HTML属性( country
)将更改 . 但是,我将如何检测 CitySelect
组件的属性更改,因为我需要通过AJAX重新加载城市 . 我想在 CitySelect
中将 country
属性放在 watch
对象中,但这对我来说似乎不是一个优雅的解决方案,它不会让人觉得这样做是正确的...
<template>
<parent>
<country-select name="country_id" v-model="country"></country-select>
<city-select name="city_id" :country="country" v-model="city"></city-select>
</parent>
<template>
<script>
export default {
data: function() {
return {
country: null,
city: null,
};
}
}
</script>
我认为其他方式是在父母那样做这样的事情:
this.$refs.citySelect.emit('countryChanged', this.country)
要么:
this.$refs.citySelect.countryChanged(this.country)
我不知道这两个是否可能......那么 CountrySelect
组件告诉其兄弟组件 CitySelect
更新城市列表的正确方法是什么...
1 回答
通过将
country
作为属性传递给CitySelect
组件,您已经在做您需要做的事情 . 当country
更改时,更改的值将传递给CitySelect
组件 . 您只需确保CitySelect
组件了解更改 .这是一个有效的例子 .