У меня есть простое приложение Vue, которое должно добавить номер в Set, когда вы нажимаете кнопку "Добавить в Set" -
https://codepen.io/jerryji/pen/mKqNvm?editors=1011
<div id="app">
<input type="number" placeholder="enter a number" v-model="n">
<button type="button" @click.prevent="addToSet()">Add to Set</button>
</div>
new Vue({
el: "#app",
data: {
n: null,
nSet: new Set()
},
methods: {
addToSet: function() {
this.nSet.add(this.n);
console.log(this.n + ' added to Set');
}
},
watch: {
nSet: function (newVal, oldVal) {
console.log(newVal);
}
}
});
Почему ничего не заводится в консоли на часах?
Vue добавляет специальную обработку для массивов, но не для Sets. В результате Vue автоматически не обнаруживает изменения в Set membership. Вы можете принудительно обновить, хотя
this.nSet.add(this.n);
this.$forceUpdate();
Это потому, что Vue не поддерживает Set, Map, WeakSet и WeakMap. И это потому, что браузеры не поддерживали эти структуры хорошо. Особенно WeakMap. Но... Они решили поддержать эти структуры. Возможно, в версии 3 - когда они решили отказаться от поддержки старых браузеров. Итак, на данный момент используйте объект, добавьте свойства с помощью Vue.$set()
и следите за изменениями с помощью deep: true
.
Сохранение и повторная Set
Set с использованием .values()
для Set
работал для меня, и мне не пришлось использовать $forceUpdate
Использование $forceUpdate
может быть более разумным способом. В некоторых случаях использования в прошлом я обнаружил, что компоненты для принудительного обновления становятся проблематичными.
new Vue({
el: "#app",
data: {
n: null,
nSet: new Set()
},
methods: {
addToSet: function() {
let set = this.nSet;
let newSet = set.add(this.n)
this.nSet = new Set(newSet.values())
}
},
watch: {
nSet: function (newVal, oldVal) {
console.log('newVal', ...newVal);
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
<div id="app">
<input type="number" placeholder="enter a number" v-model="n">
<button type="button" @click.prevent="addToSet()">Add to Set</button>
<p>n = {{ n }}</p>
</div>
Set
overArray
? Если единственной целью является обеспечение уникальности, вы можете легко проверить с помощьюindexOf
перед нажатием. AFAIK нет простого способа следить за изменениямиSet
.