Набор часов Vue2 не работает

У меня есть простое приложение Vue, которое должно добавлять число в набор, когда вы нажимаете кнопку «Добавить в набор» -

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.info(this.n + ' added to Set');
    }
  },
  watch: {
    nSet: function (newVal, oldVal) {
      console.info(newVal);
    }
  }
});

Почему смотреть ничего не регистрирует в консоли?

Есть ли причина, по которой вы используете Set вместо Array? Если единственной целью является обеспечение уникальности, вы можете легко проверить с помощью indexOf, прежде чем нажимать. AFAIK не существует простого способа следить за изменениями Set.

Terry 18.06.2018 16:06

Потому что Set требуется в реальном коде. Кодовое слово - это просто урезанный пример. Но я понял вашу точку зрения. Спасибо

Jerry Ji 18.06.2018 16:30

Интересно, не реагируют ли наборы в компонентах Vue.

Francis Leigh 18.06.2018 16:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
2 028
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сохранение и повторное использование 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.info('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>
Ответ принят как подходящий

Vue добавляет специальная обработка массивов, но не для наборов. В результате Vue не обнаруживает автоматически изменений в членстве в Set. Вы можете принудительно обновить

  this.nSet.add(this.n);
  this.$forceUpdate();

Это потому, что Vue не поддерживает Set, Map, WeakSet и WeakMap. Причина в том, что браузеры плохо поддерживают эти структуры. Особенно WeakMap. Но ... Они решили поддержать эти структуры. Возможно, в версии 3 - когда они решат отказаться от поддержки старых браузеров. Итак, сейчас используйте объект, добавьте свойства с помощью Vue.$set() и следите за изменениями с помощью deep: true.

Другие вопросы по теме