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

    0xD34F
    @0xD34F Куратор тега Vue.js
    Чем setInterval не устроил?
    let index = -1;
    setInterval(() => {
      index = (index + 1) % array.length;
      console.log(array[index]);
    }, 500);

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

    Показалось будет неудобно юзать в Вью компоненте. Мне надо при наведении мышки показывать по кругу картинки из массива и останавливать при убирании мышки.

    Не вижу ничего неудобного:

    <div
      @mouseenter="установитьИнтервал"
      @mouseleave="сброситьИнтервал"
    >

    methods: {
      установитьИнтервал() {
        this.interval = setInterval(() => { ... }, 666);
      },
      сброситьИнтервал() {
        clearInterval(this.interval);
      },
    },
    Ответ написан
    2 комментария
  • Как организовать опрос, как на tj?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Структура данных, содержащая вопросы.
    Массив объектов, каждый из которых представляет один вопрос. Внутри два свойства - текст вопроса, и массив с вариантами ответа:

    data: () => ({
      questions: [
        {
          text: '2 x 2?',
          answers: [ '5', '3', '69', '187' ],
        },
        {
          text: '...',
          answers: [ '...', '...', ... ],
        },
        ...
      ],
    }) ,

    Компонент вопроса.
    Принимает три параметра - текст вопроса, массив вариантов ответа, и выбранный ответ:

    props: [ 'text', 'answers', 'value' ],

    Показываем текст вопроса; на основе массива ответов создаём радиокнопки, если ответ совпадает с выбранным, соответствующая кнопка помечается как выбранная; при выборе кнопки отправляем значение родительскому компоненту:

    <div>{{ text }}</div>
    <div v-for="n in answers">
      <label>
        <input
          type="radio"
          :checked="n === value"
          @change="$emit('input', n)"
        >
        {{ n }}
      </label>
    </div>

    Компонент опроса.
    Принимает список вопросов в качестве параметра:

    props: [ 'questions' ],

    Из данных содержит в себе индекс текущего вопроса и массив выбранных ответов:

    data: () => ({
      index: 0,
      answers: [],
    }),

    Если индекс меньше количества вопросов, значит опрос ещё не окончен, показываем вопрос, в противном случае следует отобразить результаты:

    <div v-if="index < questions.length">
      вопрос
    </div>
    <div v-else>
      результаты
    </div>

    Чтобы показать вопрос, отрендерим экземпляр компонента вопроса, передав ему в качестве параметров содержимое элемента массива вопросов + привязав элемент массива ответов:

    <question
      v-bind="questions[index]"
      v-model="answers[index]"
    />

    Чтобы перейти к следующему вопросу, достаточно увеличить индекс текущего вопроса (кнопку, пока пользователь не выбрал ответ, можно: а) блокировать - :disabled="!answers[index]"; б) скрывать - v-show="answers[index]"):

    <button @click="index++">дальше</button>

    Результаты - список вопросов и соответствующих им (с тем же индексом) ответов:

    <div v-for="(n, i) in questions">
      {{ n.text }} - {{ answers[i] }}
    </div>


    https://jsfiddle.net/fdbj1w29/
    Ответ написан
    1 комментарий
  • Почему не обновляется state после успешного получения данных?

    0xD34F
    @0xD34F Куратор тега Vue.js
    return this.$store.authInfo

    А может, всё-таки this.$store.state.authInfo?
    Ответ написан
    4 комментария
  • Как не присваивать класс, если значение переменной null?

    0xD34F
    @0xD34F Куратор тега Vue.js
    :class="form.FirstName !== null ? form.FirstName ? 'input-successes' : 'input-error' : ''"

    или

    :class="{ 'input-successes': form.FirstName, 'input-error': form.FirstName === false }"

    или

    :class="form.FirstName !== null && [ 'input-error', 'input-successes' ][+form.FirstName]"

    или

    :class="({ true: 'input-successes', false: 'input-error' })[form.FirstName]"

    Лучше бы подобное конечно в computed/метод завернуть, как-то громоздко получается.
    Ответ написан
    2 комментария
  • Как вернуть копию значения с объекта в vuex store?

    0xD34F
    @0xD34F Куратор тега Vue.js
    после перезагрузки страницы получаю undefined

    Сохраняйте стейт в localStorage.

    Если лень реализовывать сохранение самостоятельно - есть готовые плагины, например.

    правильно ли я возвращаю копию значения с объекта store.singleMetricNamesMap

    Геттер в хранилище, возвращающий функцию, которая по переданному id возвращает объект... Не вижу, в чём смысл подобных сложностей.

    Просто читайте свойство объекта, типа $store.state.singleMetricNamesMap[value.metricId]. Если так по-вашему слишком длинно - сделайте в компоненте вычисляемое свойство, которое будет представлять singleMetricNamesMap.
    Ответ написан
    2 комментария
  • Как отобразить Яндекс карту в компоненте vue?

    0xD34F
    @0xD34F Куратор тега Яндекс.Карты
    Проблема из-за css. Для всех canvas'ов у вас задано правило width: 100% !important;, а родительский элемент canvas'а карты имеет нулевые размеры.

    UPD.

    new ymaps.Map("map", {

    Вот так делать не надо. Что если экземпляров компонента с картой будет больше одного? - двух, трёх и т.д. карт с одним id быть не может. Замените id на ref, и передавайте в конструктор карты вместо id сам элемент.
    Ответ написан
    3 комментария
  • Как смещать серый квадрат только после прохода курсором ячейки?

    0xD34F
    @0xD34F Куратор тега Vue.js
    data: () => ({
      size: 52,
      col: 0,
      row: 0,
    }),
    methods: {
      onMouseMove(e) {
        this.col = e.offsetX / this.size | 0;
        this.row = e.offsetY / this.size | 0;
      },
    },
    computed: {
      blockStyle() {
        return {
          backgroundSize: `${this.size}px ${this.size}px`,
        };
      },
      blockCursorStyle() {
        const { col, row, size } = this;
        return {
          transform: `translate(${col * size}px, ${row * size}px)`,
          width: `${size * 0.95}px`,
          height: `${size * 0.95}px`,
        };
      },
    },

    <div class="block" :style="blockStyle" @mousemove="onMouseMove">
      <div class="block-cursor" :style="blockCursorStyle"></div>
    </div>

    https://jsfiddle.net/La4297zd/

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

    0xD34F
    @0xD34F Куратор тега CSS
    Свойство width у элементов headers. Число или строка. Если число - это пиксели. Если строка - доступны все единицы измерения css (значение подставляется в style соответствующего th).

    В документации не нашёл.

    Я бы скорее поверил в "не нашёл документацию". Чего там можно было не найти - без понятия, всё на поверхности лежит (в блоке API: компонент v-data-table, вкладка props - выбраны по умолчанию, достаточно просто скроллить вниз и читать, какой параметр за что отвечает - неужели это так сложно?).
    Ответ написан
    1 комментарий
  • Почему директива не работает?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сначала определяете директиву, потом создаёте экземпляр Vue. Не наоборот.

    UPD. Первая буква в имени директивы - русская:

    Vue.directive('сarusel', {
    Ответ написан
    2 комментария
  • Как добавить имя нескольким сущностям с store?

    0xD34F
    @0xD34F Куратор тега Vue.js
    return this.singleMetricNamesMap.forEach(el => el[this.value.metricId])

    Круто.

    Откройте документацию, разберитесь, что такое forEach. И какие ещё бывают методы у массивов.

    UPD.

    metric() {
        if (this.metric) {
            this.setSingleMetricNamesMap({ [this.metric.id]: this.metric.name })
        }
    }

    Текущее значение наблюдаемого свойства передаётся в наблюдатель первым параметром, this. не нужен:

    metric(val) {
      if (val) {
        this.setSingleMetricNamesMap({ [val.id]: val.name });
      }
    },
    Ответ написан
    Комментировать
  • Как сделать так, чтобы для тэгов применялись разные классы?

    0xD34F
    @0xD34F Куратор тега CSS
    Слот item позволяет определить разметку строки целиком:

    <v-data-table>
      <template #item="{ item }">
        <tr>
          <td class="какой-то_класс">{{ item['какое-то свойство'] }}</td>
          <td class="ещё_какой-то_класс">{{ item['ещё какое-то свойство'] }}</td>
          <td class="ну_и_так_далее">{{ item['как видите, ничего сложного'] }}</td>
        </tr>
      </template>
    </v-data-table>
    Ответ написан
    Комментировать
  • Как в vue.js, в компоненте tsx вывести элементы в цикле?

    0xD34F
    @0xD34F Куратор тега Vue.js
    v-for={weekDay in this.arWeekDays}

    выдает ошибку "index is not defined"

    А может, всё-таки "weekDay is not defined"? Или вы о чём-то умалчиваете?

    Про v-for забудьте:

    <div>
      {this.arWeekDays.map(n => <div>{n}</div>)}
    </div>
    Ответ написан
    3 комментария
  • Как сделать кружок, бегающий за курсором на vue,js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    data: {
        circle: document.querySelector(`.circle`)
    },

    Бессмысленно сохранять ссылки на элементы шаблона. После инициализации экземпляра Vue этот элемент уже не будет частью страницы - исходное содержимое .app Vue заменит элементами, которые создаст сам. Если хотите иметь доступ к ним, для этого есть специальный механизм. Т.е., добавляете атрибут ref элементу .circle:

    <div class="circle" ref="circle"></div>

    В методе move заменяете this.circle на this.$refs.circle:

    this.$refs.circle.style.left = `${e.pageX}px`;
    this.$refs.circle.style.top = `${e.pageY}px`;

    https://jsfiddle.net/4esvu230/
    Ответ написан
    2 комментария
  • Как отследить состояние сортировки по убыванию/возрастанию vue js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавить в компонент булево свойство, которое будет обозначать порядок сортировки, и переключать его значение при вызовах метода sorted. Например.
    Ответ написан
    Комментировать
  • Почему transition-group не работает?

    0xD34F
    @0xD34F Куратор тега Vue.js
    С помощью классов *-enter-active, *-leave-active и т.д. анимируются удаляемые/добавляемые элементы. Если key не изменился, элемент не будет удалён и заново добавлен, соответственно, и классы не будут добавляться.
    Ответ написан
  • Как исправить баг awesome-swiper?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Этот компонент - всего лишь обёртка над собственно swiper'ом. Который для создания бесконечной прокрутки делает копии слайдов (последнего, предпоследнего и т.д. перед первым; первого, второго и т.д. после последнего). При копировании элемента обработчики событий не копируются (кроме инлайновых, но, очевидно, тут другой случай). Отсюда "клик не срабатывает" - когда вы кликаете по клонированному слайду.

    Делегируйте обработку событий. Обработчик клика будет один, и прицеплен к корневому элементу слайдера:

    <swiper @click="onClick"

    methods: {
      onClick(e) {
        const slide = e.target.closest('.swiper-slide');
        if (slide) {
          console.log(`slide ${slide.dataset.swiperSlideIndex} clicked`);
        }
      },
    Ответ написан
    Комментировать
  • Как отфильтровать bootstrap-vue таблицу?

    0xD34F
    @0xD34F Куратор тега Vue.js
    по клику на чекбокс не происходит фильтрация items

    Ну ткнулись вы в чекбокс name, например - дальше что должно происходить? Чтобы фильтрация выполнилась, кроме активации фильтра надо ещё что-то ввести в строку поиска.

    как запустить bootstrap пример

    Ну, НАВЕРНОЕ, КАК МИНИМУМ, скопировать его полностью - чего вы не сделали.

    как можно реализовать фильтрацию списка по статусу...

    Добавить в компонент свойство - выбранный статус. Устанавливать его значение при клике. Сделать собственную функцию фильтрации. Например.

    ...по клику на кнопки

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

    0xD34F
    @0xD34F Куратор тега Vue.js
    Версия bootstrap-vue устаревшая используется. Да и сам vue тоже другой нужен. Обновите их.

    Ну или меняйте синтаксис слотов на старый. Т.е., например, вместо

    v-slot:cell(index)="data"

    будет

    slot="index" slot-scope="data"
    Ответ написан
    1 комментарий
  • Как обновить значение в store?

    0xD34F
    @0xD34F Куратор тега Vue.js
    set(count) {
      this.$store.commit('setCount', {
        count,
        index: this.index,
      });
    },
    Ответ написан
    Комментировать