True двусторонние привязки не могут быть достигнуты, но дочерний элемент может передать событие с необходимой информацией родительскому элементу, и последний может обновить связанную переменную.
Начиная с 2.3.0 Vue имеет специальный .sync
модификатор , чтобы сделать это, и вот ваш модифицированный фрагмент с использованием модификатора .sync
.Обратите внимание, что метод changeCounter
не изменяет lval
напрямую, а генерирует событие.
Здесь
Vue.config.productionTip = false;
Vue.component('like', {
template: '#like',
props: ['lval', 'lname', 'lstep', 'lclass'],
methods: {
changeCounter: function(step) {
const newlval = this.lval + parseInt(step);
this.$emit('update:lval', newlval);
}
}
});
new Vue({
el: '#app',
data: {
counterlike: 0,
counterdislike: 0
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<like lname="Like" lstep="1" :lval.sync="counterlike" lclass="btn-success"></like>
<like lname="Dislike" lstep="-1" :lval.sync="counterdislike" lclass="btn-danger"></like>
<br> {{ counterlike + counterdislike }}
</div>
<template id="like">
<button :class="['btn',lclass]" @click="changeCounter(lstep)" >{{ lname + ' ' + lval }}</button>
</template>