Ответы пользователя по тегу Vue.js
  • Как оставаться на том же месте при скроллинге при добавлении элементов в Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сохраняйте значение scrollHeight. И делайте watch на массив элементов - в обработчике вычисляйте разницу между старым и новым значениями scrollHeight, корректируйте соответствующим образом scrollTop. Как-то так.
    Ответ написан
    Комментировать
  • Как связать SVG Path с моделью Vue.JS?

    0xD34F
    @0xD34F Куратор тега Vue.js
    например (поскольку свой svg вы решили не показывать, взял первый нагугленный)
    Ответ написан
    Комментировать
  • Почему в компонент vue передается только число или json?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Почему так происходит?

    Потому что вы используете динамическую передачу данных. Соответственно, переданная строка либо рассматривается как имя свойства текущего компонента, либо является некорректным мусором. Отсюда undefined (свойства нет) и "скрипт вылетит" (из-за мусорного значения параметра не удалось скомпилировать шаблон).

    Ну а числа и json, они являются корректными выражениями: число оно и есть число, а json рассматривается как литерал объекта/массива.

    Мне необходимо строку передать в url

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

    0xD34F
    @0xD34F Куратор тега Vue.js
    <img :src="comment.comment_image">
    Ответ написан
    Комментировать
  • Как в однофайловых компонентах Vue передать props?

    0xD34F
    @0xD34F Куратор тега Vue.js
    export default {
      data () {
        props: ['a'],
        return {
          qwe: "Привет 2"
        }
      }
    }

    Это шизофрения какая-то. Наверное, имелось в виду

    export default {
      props: ['a'],
      data() {
        return {
          qwe: "Привет 2"
        }
      }
    }
    Ответ написан
    Комментировать
  • Как вывести данные из атрибута data в текст vue.js?

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

    Добавляем два свойства в data - возможные значения, и выбранное значение:

    data: () => ({
      selectedPercent: null,
      percents: [ 30, 40, 50 ],
      ...
    }),

    Разметку создаём на основе данных; обработка клика - нужное значение сразу доступно, так что просто выполняем присваивание:

    <div v-for="p in percents" @click.prevent="selectedPercent = p">
      ...

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

    computed: {
      header() {
        return this.selectedPercent !== null ? this.selectedPercent : 'hello, world!!';
      },
    },

    Ну и выводим его:

    <h1>{{ header }}</h1>
    Ответ написан
    2 комментария
  • VueJS & fabric.js: как добиться реактивности?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Делать watch на elems. Код создания картинок вынести в метод, который дёргать в mounted и в watcher'е. Как-то так.
    Ответ написан
  • Как заблокировать в Select элемент который был избран в другом Select?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Нужны два массива значений - доступных для выбора и выбранных. Пункты select'ов создаются на основе списка доступных значений, в зависимости от присутствия значения в списке выбранных назначаете disabled:

    data: () => ({
      items: [...Array(10)].map((n, i) => `item ${i}`),
      selected: Array(4).fill(null),
    }),

    <select v-for="(s, i) in selected" v-model="selected[i]">
      <option
        v-for="n in items"
        v-text="n"
        :disabled="selected.includes(n)"
      ></option>
    </select>

    https://jsfiddle.net/2wz6sgxb/
    Ответ написан
    1 комментарий
  • Как воткнуть :data-vv-as и :data-vv-delay аттрибуты в vue-datepicker, чтобы они отрабатывали?

    0xD34F
    @0xD34F Куратор тега Vue.js
    не уверен, что применяются :data-vv-as и :data-vv-delay аттрибуты

    А эта ваша неуверенность - она основана хоть на чём-нибудь? Я вот знаю, что всё применяется.

    Может, дело в том, что в вашем примере вместо сообщения об ошибке, которое генерирует vee-validate, показывается какое-то другое? - потому вы и не видите подмены имени поля. А отсутствие задержки обусловлено тем, что единственный сценарий валидации, который вы проверяли - это отправка формы, а в соответствующем обработчике валидация осуществляется немедленно, в то время как задержка предназначена для пользовательского ввода:

    You can specify a delay to debounce the input event, a case scenario that you may want to wait for the user to stop typing then validate the field

    Сделал пример к сказанному выше:

    Сообщение об ошибке выводится то, которое генерирует vee-validate.
    Имитация пользовательского ввода - кнопка сброса, вместо прямой установки значения кидается событие input с пустой строкой; также обратите внимание, что при выборе даты выведенное сообщение об ошибке пропадает с указанной задержкой.
    Ответ написан
    Комментировать
  • Как правильно добавлять и удалять обработчики событий в директиве (Vue)?

    0xD34F
    @0xD34F Куратор тега Vue.js
    сохранить доступ к el и binding

    Элемент будет доступен как this.

    Что до binding - можно использовать dataset для передачи значения. Например.

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

    датасет дает нам возможность сохранять только примитивы

    Можно прицепить интересующий вас объект к элементу в качестве его свойства, типа так. Или использовать Map/WeakMap, где ключом будет элемент, например.

    А вообще, возможно, что вы неверно выбрали инструмент для решения своей проблемы, и тут вместо директивы следует использовать компонент.
    Ответ написан
    2 комментария
  • Как избежать switch при реализации компонента работающего с разными API/сущностями в VueJS?

    0xD34F
    @0xD34F Куратор тега Vue.js
    // где-то вне метода загрузки сканов
    const docApi = {
      oneDoc: oneDocApi,
      anotherDoc: anotherDocApi,
      ...
    };

    docApi[this.type].uploadScan();

    Можно даже в виде вычисляемого свойства оформить:

    computed: {
      docApi() {
        return docApi[this.type];
      },
    },

    this.docApi.uploadScan();
    Ответ написан
    Комментировать
  • Как из родительского компонента сконфигурировать компонент ввода?

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

    Да неужели? А параметры на что?

    хотелось бы иметь возможность каким-либо образом отменить передачу значения, не прошедшего валидацию наверх

    Ну так вы не тупо делайте emit, а при условии отсутствия ошибок.

    UPD. https://jsfiddle.net/369saL08/
    Ответ написан
    Комментировать
  • Как получить аттрибут ссылки во vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Пробовал указать и a.href и a.getAttribute('href') и т.д.

    Лучше бы попробовали документацию почитать.

    @click.prevent="toPage"

    toPage(e) {
      console.log(e.target.href)
    }
    Ответ написан
    Комментировать
  • Как "красиво" в методе компонента заменять надпись на каком-либо элементе?

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

    "Самых правильных" способов нет.

    Создавать еще один элемент в data()?

    Да.
    Ответ написан
    2 комментария
  • VueJs: не изменяются реактивные переменные на лету?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Если я правильно понял, должно быть так (в смысле - наблюдаемое поведение, а не код - тут уж вы сами думайте, как правильно надо). Реактивность тут не при чём, проблема в том, что вы сначала используете значение, а потом его меняете, предполагая при этом, что использовано будет изменённое значение.
    Ответ написан
  • Vue lodash.shuffle для списка?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Использовать индекс в качестве key не надо никогда. Чтоб вот такого, как у вас сейчас, не было.

    Делаем нормальный key - всё окей.
    Ответ написан
    Комментировать
  • Chart with Axios?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Как можно с помощью axios подставить данные в массив chart?

    Это в принципе невозможно, axios - для выполнения запросов, а не работы с массивами.

    Разумеется, вы имели в виду кое-что другое, и даже понятно, что именно. Но учитывая фантастически ублюдочную формулировку вопроса, иного ответа вы не заслуживаете. Под ублюдочной формулировкой я имею в виду не только непонимание, о чём вы сами же и спрашиваете, но также и почти полное отсутствие какой-либо конкретики. А именно:

    Не сказано ни слова о графике, что он отображает.

    Получение данных для графика осуществляется будто бы с помощью axios - но единственный показанный запрос про другое, там идёт получение данных для выпадающего списка. То есть, должен быть ещё какой-то запрос. Какой? - url, параметры, структура ответа - ничего не известно.

    Далее, "подставить данные" вы планируете в "массив chart" - но как следует из показанного огрызка кода, такого массива нет. Есть chartData. Это он? Или какой-то другой массив? Не знаю что и думать. Что до собственно "подставить" - у массивов есть метод push, неужели вы про него не слышали? Если не слышали - разговаривать тут не о чем, идите учить язык. А где-нибудь через полгодика, не раньше, можно будет и в сторону vue попробовать посмотреть. Если слышали - очевидно, сам по себе push проблемой быть не может, придётся констатировать, что о сути своих затруднений вы решили попросту умолчать.

    Компонент line-chart, который, надо полагать, ответственен за построение графика - что это такое? Едва ли вы его написали сами - это или сторонний компонент, или обёртка над сторонним компонентом. Почему нет ссылки на документацию/github/...? - насколько я понял, график успешно строится, но надо динамически докидывать в него данные, так что сведения о компоненте графика пришлись бы очень кстати. Отслеживает ли он изменения своих параметров? Или может у него есть метод, позволяющий принудительно обновить свой внешний вид? Но нет - и тут никакой информации.

    Вот так.

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

    График строится библиотекой chartkick.js

    есть запрос <...> необходимо подставить значения получаемых менеджеров в имена chartData. То есть в chartData:[{name:[сюда]}]

    Понятно.

    Не надо ничего "подставлять". Делаем отдельные свойства name и data, а chartData будет вычисляемым, причём собирать массив надо только в том случае, когда и name и data будут получены:

    computed: {
      chartData() {
        const { names, data } = this;
        return names && data && data.map((n, i) => ({
          name: names[i],
          data: n,
        }));
      },
    },

    Соответственно, график создаётся только в том случае, если удалось собрать chartData:

    <line-chart v-if="chartData" :data="chartData"></line-chart>

    https://jsfiddle.net/t5dovxL4/
    Ответ написан
    1 комментарий
  • Как в Vue сделать поочередное удаление класса у элементов списка?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Непонятно, чем мотивировано неиспользование v-for. Если использовать, будет гораздо проще добиться того, что вы хотите, например:

    .hidden {
      opacity: 0;
    }

    data: () => ({
      items: [
        { text: '...', hidden: true },
        { text: '...', hidden: true },
        ...
      ],
    }),
    mounted() {
      this.items.forEach((n, i) => {
        setTimeout(() => n.hidden = false, 300 * (i + 1));
      });
    },

    <li v-for="{ text, hidden } in items" :class="{ hidden }">
      <a href="">{{ text }}</a>
    </li>
    Ответ написан
    9 комментариев
  • Как сделать, чтобы чекбокс реагировал на нажатия (bootstrap-vue)?

    0xD34F
    @0xD34F Куратор тега Vue.js
    В колонках где tbody я смог реализовать

    Не до конца - у вас нет связи между чекбоксом и значением соответствующего свойства. Надо сделать:

    <template slot="isActive" slot-scope="{ item }">
      <b-form-checkbox v-model="item.isActive"></b-form-checkbox>
    </template>

    но вот в thead не получается

    Делаете вычисляемое свойство, которое будет представлять общее состояние всех чекбоксов в столбце. Геттер возвращает true, если все чекбоксы true; сеттер - назначаете всем чекбоксам переданное значение:

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

    И используете это свойство в хедере:

    <template slot="HEAD_isActive" slot-scope="data">
      <b-form-checkbox
        @click.native.stop
        :checked="checkedAll"
        @change="checkedAll = $event"
      ></b-form-checkbox>
    </template>

    https://jsfiddle.net/k1cbz7nu/
    Ответ написан
    Комментировать