#vue.js
#vue.js
Вопрос:
У меня есть следующий компонент, который я создал, который является флажком типов:
<mapFilterCheckbox v-bind:selected="allSelected" v-bind:label="getCleanedTitle(category.name)" v-bind:count="category.count" v-on:click.native="filterPostsByCategory(category.slug)"/>
Я указал prop
of selected
, который динамически привязан к переменной this.allSelected
. У меня также есть другая кнопка в другом месте моего шаблона, которая устанавливает переменную this.allSelected
в значение false при нажатии.
Однако это изменение не передается дочернему компоненту в качестве реквизита — и я абсолютно не уверен, почему. Это mapFilterCheckbox
компонент:
<template>
<div>
<div class="vue-taxonomy-select clearfix" v-bind:class="{ 'vue-taxonomy-select__active': checked }" v-on:click="checkBoxClick()">
<div class="float-left">
<font-awesome-icon :icon="icon" class="mr-3"/>
<span class="text-dark" v-html="label"></span>
</div>
<div class="float-right">
<small class="font-weight-bold text-teal">{{ count }}</small>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'mapFilterCheckbox',
props: {
label: String,
count: [String, Number],
selected: Boolean,
},
data () {
return {
checked: this.selected,
icon: this.selected ? ['fal', 'check-square'] : ['fal', 'square']
}
},
watch: {
selected () {
console.log(this.selected)
},
checked () {
if (this.checked) {
this.icon = ['fal', 'check-square']
}
if (!this.checked) {
this.icon = ['fal', 'square']
}
}
},
methods: {
checkBoxClick () {
this.checked = !this.checked
}
}
}
</script>
Наблюдатель за выбранным не регистрирует изменение выбранного значения … изменение значения allSelected также не изменяет ни this.checked, ни icon…so для меня prop
selected
родительский компонент не изменяет?
Это работает только тогда, когда я изначально установил allSelected
в объекте данных родительского компонента значение true или false, все работает так, как ожидалось.
Итак, каким образом мне зарегистрировать эту мутацию в дочернем компоненте??
**** ОБНОВИТЬ **** Ок — итак, значение, allSelected
однажды установленное при нажатии на resetAllFilters
, равно false — поэтому оно никогда не обновляется после первоначального нажатия …как мне распространить изменение, даже если я возвращаю его к false
исходному false
??
Комментарии:
1. Я бы подумал, что использование вычисляемого свойства было бы правильным решением…
2. @iceman — Я пробовал это, и это не работает; кажется, работает — я попытался вычислить
this.checked
в дочернем элементе mapFilterCheckbox значение передаваемого реквизитаthis.selected
, но затем я устанавливаю его внутри метода checkBoxClick, поэтому, к сожалению, я не могу использовать этот метод … ошибки установки возвращаются с проблемой максимального стека вызовов.3. @iceman если бы вы могли привести пример, который сработал бы — и поверьте мне, я перепробовал все, что мог придумать, с помощью вычисляемого метода get set, тогда я был бы очень признателен.
4. @Iceman Мне кажется, что когда я изначально запускаю метод события щелчка resetAllFilters — allSelected устанавливается с true на false. Любой последующий щелчок, и это всегда false, поэтому не регистрируется изменение. Не могу ли я явно указать Vue изменить переменную?
Ответ №1:
Измените свой наблюдатель на вычисляемый реквизит, подобный этому:
computed: {
icon() {
return this.checked ? ['fal', 'check-square'] : ['fal', 'square']
}
}
Итак, переменная icon теперь реагирует на любое обновление в checked.