Я пытаюсь обновить дочерние реквизиты до родительских с помощью on:click $event.
Я передал данные и $event от родителя к дочернему, как показано ниже. в родительском;
<v-filter
:sortTypePrice = "sortTypePrice"
:sortTypeNewest = "sortTypeNewest"
v-on:updatePrice = "sortTypePrice = $event"
v-on:updateDate = "sortTypeNewest = $event"
/>
data(){
return {
sortTypePrice: "",
sortTypeNewest: "",
}
}
computed: {
filterArticles(){
let filteredStates = this.api.filter((article) => {
return (this.keyword.length === 0 || article.address.includes(this.keyword))
});
if (this.sortTypePrice == "price") {
filteredStates = filteredStates.sort((prev, curr) => prev.price1 - curr.price1);
}
if (this.sortTypeNewest == 'created_at') {
filteredStates = filteredStates.sort((prev, curr) => Date.parse(curr.created_at) - Date.parse(prev.created_at));
}
return filteredStates;
},
}
Я получил реквизит и установил обновление $event. Но мой @click не работает.
у ребенка
<ul>
<li v-model = "sortPrice" @click = "updatePrice" :value = "price">lowest</li>
<li v-model = "sortDate" @click = "updateDate" :value = "created_at">newest</li>
</ul>
props:["sortTypePrice", "sortTypeNewest"],
name: "controller",
data(){
return {
price: "price",
created_at: "created_at",
sortPrice:this.sortTypePrice,
sortDate:this.sortTypeNewest,
};
},
methods: {
updatePrice(e){
this.$emit("updatePrice", e.target.value)
},
updateDate(e){
this.$emit("updateDate", e.target.value)
}
}
Я думаю, что я использую очень неправильный способ сделать это. если это так, каков правильный способ добиться этого?
Я считаю, что лучший способ синхронизации реквизита между родительским и дочерним компонентами — это:
в родительском:
<!-- notice `sync` modifier -->
<child :foo.sync = "val" />
у ребенка:
<input v-model = "foo_" />
props: ['foo'],
computed: {
// create a local proxy for the `foo` prop
foo_{
// its value should be the value of the prop
get(){
return this.foo
},
// when we try to change it we should update the prop instead
set(val){
this.$emit('update:foo', val)
}
}
}
Теперь в дочернем компоненте вы можете работать с реквизитом foo_
так же, как и с реквизитом foo
. Всякий раз, когда вы пытаетесь изменить его, он обновляет реквизит foo
в родительском элементе, а затем синхронизируется, чтобы foo_
оставался равным foo
. Например, this.foo_ = 1
будет foo == 1
.
Это тот же шаблон, который применяется с директивой v-model
. Проверьте .sync Модификатор для лучшего понимания.
Не следует устанавливать одновременно :value
и v-model
. Можешь попробовать
<ul>
<li @click = "$emit('updatePrice', 'price')" :value = "price">lowest</li>
<li @click = "$emit('updateDate', 'created_at')" :value = "created_at">newest</li>
</ul>
хорошо, получилось. Спасибо!! а также не нужно использовать :value = ""
, потому что он уже установлен внутри $emit. Часть, которую я не понимаю. Я использовал это так: <li @click = "updatePrice" :value = "price">安い順</li>
но не получилось... какая разница? почему $emit не может обновляться через methods:{}
?
Потому что HTML-тег <li>
не имеет атрибута value
.
Спасибо за ответ! но должен быть способ установить значение атрибута в HTML-тег <li>
, как я спрашивал в теме... @EmīlsGulbis
Если вы хотите установить значение для такого элемента, вам следует создать собственный компонент со свойством значения.
спасибо за совет, я попробую это позже.