Ответы пользователя по тегу Vue.js
  • Как лучше организовать передачу данных во Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    промежуточных компонентов может быть много

    provide / inject
    Ответ написан
    3 комментария
  • Как менять радиус круга при изменении ползунка?

    0xD34F
    @0xD34F Куратор тега Яндекс.Карты
    Кладёте ссылку на круг в компонент:

    this.circle = new ymaps.Circle(
      ...

    И устанавливаете наблюдение за свойством, которое представляет радиус:

    watch: {
      радиусКруга(val) {
        this.circle.geometry.setRadius(val);
      },
      ...

    https://jsfiddle.net/5qmrxez0/

    Или, если этот круг нигде больше не понадобиться, то можно не делать его свойством компонента, а прямо по месту его создания установить наблюдение за радиусом:

    const circle = new ymaps.Circle(
      ...
    );
    
    this.$watch('радиусКруга', val => circle.geometry.setRadius(val));

    https://jsfiddle.net/5qmrxez0/1/
    Ответ написан
    4 комментария
  • Как работать во Vue в computed со сеттерами?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сеттер должен изменить данные, которые используются в геттере.

    Давайте рассмотрим на конкретном примере. Пусть есть массив объектов, на основе которых создаются чекбоксы:

    data: () => ({
      items: [
        { checked: false, label: '...' },
        { checked: false, label: '...' },
        ...
      ],
    }),

    <label v-for="n in items">
      <input type="checkbox" v-model="n.checked">
      {{ n.label }}
    </label>

    И мы хотим сделать чекбокс, который позволял бы устанавливать или снимать все чекбоксы сразу. Его состояние будет описываться вычисляемым свойством. Геттер - очевидно, будет содержать проверку, что все чекбоксы установлены. А сеттер будет устанавливать переданное ему значение всем чекбоксам. Как-то так:

    computed: {
      get() {
        return this.items.every(n => n.checked);
      },
      set(val) {
        this.items.forEach(n => n.checked = val);
      },
    },

    <label>
      <input type="checkbox" v-model="all">
      ALL
    </label>

    https://jsfiddle.net/j7hr68t4/
    Ответ написан
    4 комментария
  • Vue как обновить Круговую диаграмму через инпут?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Документацию пробовали открывать? Там есть ответ на ваш вопрос.

    Делаете вычисляемое свойство, которое будет содержат labels и datasets, передаёте его значение в компонент графика под именем chartData. В самом компоненте этот chartData передаёте в renderChart. Например.
    Ответ написан
    8 комментариев
  • Как у Яндекс карты по нажатию вызвать большой экран на кастомной кнопке?

    0xD34F
    @0xD34F Куратор тега Яндекс.Карты
    myMap.enterFullscreen()

    Вы невнимательно читали документацию. Этот метод принадлежит не самой карте, а map.container.

    var myMap = new ymaps.Map('map', {

    Раз используете Vue, так делать не надо. Вместо id передавайте в конструктор карты сам элемент, для получения которого следует использовать ref:

    <div ref="map"></div>

    mounted() {
      ymaps.ready(() => {
        this.map = new ymaps.Map(this.$refs.map, {
        ...

    https://jsfiddle.net/Lw98kjyc/
    Ответ написан
  • Как установить плагин vue-good-table без npm?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Комментировать
  • Глобальная шина событий Vue.js это норм?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Эта штука уже несколько лет как не рекомендуется к использованию.
    Но, конечно, решение за вами, надо - используйте.
    Ответ написан
    Комментировать
  • Как добавить фильтрацию по select к существующему поиску?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавляете в компонент свойство, которое будет содержать текущее значение выпадающего списка:

    data: () => ({
      status: '',
      ...

    Получаете массив возможных (не считая дефолтного) значений выпадающего списка:

    computed: {
      statuses() {
        return [...new Set(this.characters.map(n => n.status))];
      },
      ...

    Сам список пусть создаётся так, например:

    <select v-model="status">
      <option value="">&lt; ALL &gt;</option>
      <option v-for="n in statuses">{{ n }}</option>
    </select>

    Ну и фильтруете, наконец:

    computed: {
      filteredCharacters() {
        const search = this.search.toLowerCase();
        const status = this.status;
    
        return this.characters.filter(n => (
          (!search || n.name.toLowerCase().includes(search)) &&
          (!status || status === n.status)
        ));
      },
      ...
    Ответ написан
    1 комментарий
  • Как получить yandex marker в vue-yandex-maps?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Не надо манипулировать маркерами напрямую. Храните в данных компонента индекс активного маркера, по событиям enter/leave устанавливайте его значение, в зависимости от которого передавайте в экземпляры компонента маркера картинки иконок:

    data: () => ({
      map: {
        activeMarkerIndex: null,
        markerIconImages: [ MAP_MARKER_DEFAULT, MAP_MARKER_ACTIVE ],
        ...

    <ymap-marker
      v-for="(n, i) in markers"
      :icon="{
        ...map.markerIcon,
        imageHref: map.markerIconImages[+(map.activeMarkerIndex === i)],
      }"
      @mouseenter="map.activeMarkerIndex = i"
      @mouseleave="map.activeMarkerIndex = null"
      ...

    <li
      v-for="(n, i) in objects"
      @mouseenter="map.activeMarkerIndex = i"
      @mouseleave="map.activeMarkerIndex = null"
      ...

    https://jsfiddle.net/bw5eym2n/
    Ответ написан
    Комментировать
  • Почему хук мешает повторному появлению компонента?

    0xD34F
    @0xD34F Куратор тега Vue.js
    updated() {
      this.$refs.scroll.addEventListener('wheel', this.fadeOut);
    },

    Это ещё что за убожество?
    Откройте документацию vue, и разберитесь, как правильно подключать обработчики событий к элементам.

    Когда условие в v-if ложно, элемента нет. Соответственно, в $refs.scroll вместо ссылки на несуществующий элемент пишется null, и вы пытаетесь обратиться к свойству этого null, чего делать не следует - у null никаких свойств нет и быть не может, подобные обращения заканчиваются ошибками вот как та, что получили вы.
    Ответ написан
  • Реактивность не совсем работает vue 3?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Открываем раздел документации, посвящённый реактивности, и читаем там, что

    Отследить переназначение локальных переменных <...> не получится, такого механизма просто нет в JavaScript. Можно лишь отслеживать изменения свойств объектов.

    Так что менять надо внутреннее содержимое, а не заменять объект на полностью новый. Вместо reactive следует использовать ref (соответственно, вместо copyDB = будет copyDB.value =), или же удалять существующие элементы массива, и добавлять новые:

    copyDB.splice(0, copyDB.length, ...addFlags(props.items));
    Ответ написан
    Комментировать
  • Как передать данные через vuex в router?

    0xD34F
    @0xD34F Куратор тега Vue.js
    не передаются данные в router-link

    А что за данные? Почему не показали (да и не только данные - ни строчки кода не вижу)? Случайно не объект запихнуть пытаетесь? - если так, то скорее всего всё передаётся, но данные превращаются в мусор. Дело в том, что роутер приводит значения параметров к строкам (кроме массивов - они-то останутся массивами, в строки будут превращены их элементы). Соответственно, если дальше вы из полученной строки или строк попытаетесь извлечь какие-то свойства (конечно из тех, что у строк нет), то получите undefined.

    Если же сделать корзину на одной странице с каталогом, то все прекрасно записывается в массив корзины.

    Что-то не понял, что конкретно вы пытаетесь сделать. Вижу два варианта, и оба бредовые.

    1. Вы пытаетесь добавлять товар в корзину при переходе по ссылке. Если так - не надо никуда переходить, вместо router-link сделайте кнопку, по клику на которую сразу будет вызываться соответствующее действие или мутация.

    2. Вы пытаетесь через router-link передать в компонент корзины массив добавленных в неё товаров. Если так - не надо ничего передавать, пусть компонент корзины забирает данные сразу из vuex.
    Ответ написан
  • Как сделать доп фильтр?

    0xD34F
    @0xD34F Куратор тега Vue.js
    <option v-for="item in info">
      {{ item.fieldTypes.geo }}
    </option>

    Это неправильно. Если значения в fieldTypes.geo не уникальны, option'ы тоже будут повторяться. Зачем это? Не надо. Делаем вычисляемое свойство, представляющее уникальные значение, и используем при создании option'ов его:

    computed: {
      uniqueGeo() {
        return [...new Set(this.info.map(n => n.fieldTypes.geo))];
      },
      ...

    <option v-for="n in uniqueGeo">{{ n }}</option>

    В вычисляемом свойстве, которое представляет отфильтрованные данные, добавляем проверку второго значения, переписываем его следующим образом:

    computed: {
      filteredOffers() {
        const vacancy = this.searchVacancyName.toUpperCase();
        const geo = this.searchGeo;
    
        return this.info.filter(n => (
          (!vacancy || n.fieldTypes.vacancyName.toUpperCase().includes(vacancy)) &&
          (!geo || n.fieldTypes.geo === geo)
        ));
      },
      ...
    Ответ написан
    1 комментарий
  • Как во Vue подождать загрузки чего-то и только после успешной загрузки позволить навесить обработчик click?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Вот не надо этой ерунды с жонглированием обработчиками.

    Пусть кнопка будет неактивной, пока данных нет:

    <button :disabled="!данные" @click="onClick">

    Заодно и пользователь, вместо того, чтобы испытывать недоумение по поводу отсутствия какой-либо реакции на свои действия, будет ясно видеть, что кликать по кнопке не то, что не надо - бессмысленно.
    Ответ написан
    Комментировать
  • Как изменить вложенное свойство через сцепление во vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    computed: {
      model() {
        return new Proxy(Object.fromEntries(this.obj2.map(n => [ n.model, null ])), {
          get: (target, prop) => typeof prop === 'string'
            ? prop.split('.').reduce((p, c) => p?.[c], this.obj)
            : target[prop],
          set: (target, prop, value) => {
            const keys = prop.split('.');
            const key = keys.pop();
            const obj = keys.reduce((p, c) => (!p.hasOwnProperty(c) && this.$set(p, c, {}), p[c]), this.obj);
            this.$set(obj, key, value);
            return true;
          },
        });
      },
    },

    <div v-for="(v, k) in model">
      <input v-model="model[k]">
    </div>

    https://jsfiddle.net/34brtvok/

    Или, если несуществующие пути не должны обрабатываться, можно сделать попроще:

    computed: {
      model() {
        return this.obj2.map(n => {
          const keys = n.model.split('.');
          const key = keys.pop();
          const obj = keys.reduce((p, c) => p?.[c], this.obj);
    
          return obj && { obj, key };
        }).filter(Boolean);
      },
    },

    <div v-for="n in model">
      <input v-model="n.obj[n.key]">
    </div>

    https://jsfiddle.net/34brtvok/1/
    Ответ написан
    Комментировать
  • Как из объекта Proxy извлечь данные?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Точно так же, как если бы вместо Proxy у вас был оригинальный объект (кстати, а почему вы этого не попробовали сделать - что, увидели этот непонятный Proxy и испугались?).

    Vue заворачивает данные в Proxy для отслеживания изменений. Если вдруг очень надо, можно получить оригинальные данные с помощью toRaw.

    получить массив

    А где у вас там массив? Никакого массива нет. Или исправляйте код на сервере, чтобы присылались верные данные, или используйте Object.values.
    Ответ написан
    Комментировать
  • Как убрать реактивность?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Вам это не нужно.

    Компонент, который занимается редактированием - пусть он создаёт внутри себя копию редактируемых данных, и работает с копией. А по нажатию кнопки сохранения эта копия передаётся в мутацию, где значения её свойств будут записаны в оригинальный объект. Как-то так.
    Ответ написан
    Комментировать
  • Почему пропадает реактивность при слиянии объектов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Потому что вы заменяете реактивный объект обычным.

    Вместо присваивания нового объекта добавляйте свойства одного другому:

    Object.assign(object1, object2);

    Ну или оборачивайте новый объект в reactive, так же, как и старый.
    Ответ написан
    Комментировать
  • Почему не изменяется значение в Vuex?

    0xD34F
    @0xD34F Куратор тега Vue.js
    По клику на кнопку вызывается мутация, в которою передаётся id.

    Эти слова следовало проиллюстрировать кодом. Потому что сама по себе показанная вами мутация... дичь дикая конечно, но рабочая, проблема где-то в другом месте - может, неправильно вызываете мутацию, или не ту, или при вызове передаёте несуществующий id.

    Я так понимаю, потому что метод возвращает только false/true, а не измененный item.

    Не понимаете. Какая разница, что вы там из мутации возвращаете? Да никакой.

    Как примерно должен был выглядеть ваш код. Смотрите, сравнивайте с тем, что у вас реально есть.

    UPD. Вынесено из комментариев:

    id передается, проверял через консоль

    ...mapMutations(['chekedItem', 'deleteItem']),
    itemSucces(id) {
      this.chekedItem({id});
    },

    Правда проверяли? И как же вы ухитрились при этом не заметить, что передаёте объект вместо числа? Кстати, в данной ситуации можно и объект передавать - сам item, тогда его не придётся искать в мутации:

    chekedItem: (state, item) => item.checked = !item.checked,

    Зачем метод дополнительный создавать? - вызывайте сразу chekedItem, а itemSucces удалите.
    Ответ написан