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

    0xD34F
    @0xD34F Куратор тега Vue.js
    data: () => ({
      checkedCount: 0,
    }),

    <div v-for="i in 10">
      <label>
        <input
          type="checkbox"
          :checked="i <= checkedCount"
          @change="checkedCount = checkedCount < i ? i : i - 1"
        >
        {{ 2 ** i }}
      </label>
    </div>
    Ответ написан
    Комментировать
  • Почему не работает функция useSwiper слайдера во vue 3?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Вроде делаю как в документации

    Делаете что? Если бы вы не только копипастили из документации примеры кода, но ещё и читали, что написано рядом, то знали бы, что useSwiper предназначен для того, чтобы

    get the Swiper instance in components inside of Swiper

    А теперь посмотрите, как относительно друг друга расположены экземпляр swiper'а, до которого вы хотите достучаться, и компонент, где вы делаете вызов useSwiper.

    Переделываем.

    import { ref } from 'vue';

    setup() {
      const swiper = ref();
    
      return {
        swiper,
        onSwiper: instance => swiper.value = instance,
        ...
      };
    },

    <swiper
      @swiper="onSwiper"
      ...
    >

    Ответ написан
    5 комментариев
  • Как изменить атрибут строки в таблице по нажатию?

    0xD34F
    @0xD34F Куратор тега Vue.js
    :readonly="`${item.isReadonly}`"

    Ну и зачем в строку его засовывать? Вместо false будет "false", а булевым эквивалентом любой непустой строки является true.
    Ответ написан
  • Как создать активность только одного элемента из многих?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Активность кнопки пусть задаётся извне:

    props: {
      active: Boolean,
    },

    В родителе должно быть свойство, указывающее, кто активен (хранит индекс/имя/id - что-то, что имеет уникальное значение для каждой из кнопок):

    data: () => ({
      active: null,
    }),

    Активность конкретной кнопки вычисляете в зависимости от равенства упомянутой выше уникальной характеристики кнопок значению свойства активности; по клику переключаете значение активности:

    <v-button
      v-for="i in 3"
      :active="active === i"
      @click="active = active === i ? null : i"
    >
    Ответ написан
    1 комментарий
  • Как в таблице element-plus преобразовать данные при выводе?

    0xD34F
    @0xD34F Куратор тега Vue.js
    <el-table-column prop="block" label="Block">
      <template #default="{ row }">
        {{ row.block ? 'hello, world!!' : 'fuck the world' }}
      </template>
    </el-table-column>
    Ответ написан
    Комментировать
  • Почему не передаются данные через V-model?

    0xD34F
    @0xD34F Куратор тега Vue.js
    V-model="filterPriceFrom"

    V-model="filterPriceTo"

    props:['FilterPriceFrom', 'FilterPriceTo', "FilterCategoryId"],

    Во-первых - серьёзно? Не видите разницы между большими и маленькими буквами? Это как? О том, что буквы бывают большие и маленькие, и что это не одно и то же, рассказывают в первом классе. Вам сколько лет, шесть? Пять?

    Во-вторых, если бы вы составили себе труд открыть документацию, и прочесть, что там написано, то знали бы, что использовать v-model совместно с входными параметрами особого смысла нет. Потому что

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

    Вот вам и ответ на ваш вопрос: данные не передаются потому, что не могут передаваться избранным вами способом, так уж устроен vue.

    Теперь, что делать.

    Внутри компонента заменяете все v-model="параметр" на

    :value="параметр" @input="$emit('update:параметр', $event.target.value)"

    Снаружи - привязываете значения с использованием модификатора sync, если используете вторую версию vue.
    Или, через v-model с указанием имени параметра, в случае vue 3.
    Ответ написан
    Комментировать
  • Как избавиться от двойных кавычек, выводя текущее количество введенных символов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сообщение об ошибке, согласно документации yup, может быть указано в двух видах - строка или функция. Вычисляемое свойство является объектом, так что чего там с ним будет происходить - непонятно. Поэтому заменим вычисляемое свойство на функцию, которая будет извлекать его значение:

    .min(6, passwordMessage) ---> .min(6, () => passwordMessage.value)
    Ответ написан
    5 комментариев
  • Почему нет двусторонний привязки v-model?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Потому что объект не реактивный. Надо в reactive завернуть.
    Ответ написан
    1 комментарий
  • Как передать в filter массив аргументов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сделайте свои "аргументы" функциями, которые будут использоваться в качестве значений параметров метода filter, например:

    data: () => ({
      items: [ ... ],
      filters: [
        item => item.status === 'hello, world!!',
        item => item.price > 666,
        item => item.text.includes('fuck the world'),
      ],
    }),
    computed: {
      filteredItems() {
        return this.filters.reduce((items, filterFn) => items.filter(filterFn), this.items);
      },
    },
    Ответ написан
    Комментировать
  • Как обновить данные в vuex state?

    0xD34F
    @0xD34F Куратор тега Vue.js
    data(){
      return{
        Item: {
          ...

    v-model="item.name"

    Ну и как там у вас имя свойства начинается - с большой буквы или маленькой? Вы определитесь.

    ADD_TO_PRODUCTS({commit}, item){
        commit('SET_PRODUCT_TO_STATE', item)
    },

    methods:{
      ...mapActions([
          'ADD_TO_PRODUCTS',
      ]),

    @click="ADD_TO_PRODUCTS"

    В экшене ожидается параметр, но вы ничего не передаёте. Точнее, не передаёте в явном виде - передаётся объект события клика. А надо item (Item?).

    После того, как исправите косяки выше, у вас, вероятно, вылезет ещё один. С ним разбираться будете здесь.
    Ответ написан
    Комментировать
  • Как освоить vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Читая документацию - сложно полностью понять её.

    Это потому что вы js не знаете. Если знать язык - понимать в документации нечего, всё становится ясно на ходу.

    Может ли это означать, что frontend не мое

    Может.

    либо это стандартная ситуация и стоить продолжать?

    Стандартная. Для не знающих js.

    Освоение фреймворков без знания языка - прямая дорога к превращению в говнокодера. Который никому на рынке труда конкуренции не составит. Если ваша цель такая - конечно продолжайте.

    Короче, хотите освоить vue - освойте js.
    Ответ написан
    Комментировать
  • Как сделать, чтобы выбранная дата была подсвечена в календаре?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Оставить в datepicker'e просто дату, а дату с временем оформить как вычисляемое свойство.
    Ответ написан
    Комментировать
  • Как сделать отмеченную форму checkbox устойчивой к обновлению страницы в браузере на Vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Зачем отдельный массив checked? Пусть notes вместо массива строк будет массивом объектов, состоящих из двух свойств - text и checked. Наблюдатель c deep: true, сохраняющий данные в localStorage уже есть, так что никаких дополнительных действий предпринимать не придётся.

    UPD. Как это может выглядеть:

    <div id="app">
      <div>
        <input v-model="newTaskText" @keypress.enter="addTask">
        <button @click="addTask">add</button>
      </div>
      <hr>
      <ol v-if="tasks.length">
        <li v-for="(n, i) in tasks">
          <label :class="{ 'task-checked': n.checked }">
            <input type="checkbox" v-model="n.checked">
            {{ n.text }}
          </label>
          <button @click="delTask(i)">del</button>
        </li>
      </ol>
      <strong>Total: {{ tasks.length || 'no tasks fucking exist' }}</strong>
    </div>

    .task-checked {
      text-decoration: line-through;
    }

    Vue.createApp({
      data: () => ({
        newTaskText: '',
        tasks: JSON.parse(localStorage.getItem('tasks')) ?? [],
      }),
      watch: {
        tasks: {
          deep: true,
          handler: val => localStorage.setItem('tasks', JSON.stringify(val)),
        },
      },
      methods: {
        addTask() {
          const text = this.newTaskText.trim();
          if (text) {
            this.tasks.push({
              text,
              checked: false,
            });
    
            this.newTaskText = '';
          } else {
            alert('fuck off');
          }
        },
        delTask(index) {
          if (confirm('really?')) {
            this.tasks.splice(index, 1);
          }
        },
      },
    }).mount('#app');
    Ответ написан
    8 комментариев
  • Задать класс body при активной переменной во vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    watch: {
      переменная: {
        immediate: true,
        handler(val) {
          document.body.classList.toggle('класс', val);
        },
      },
    },
    Ответ написан
    Комментировать
  • Почему style background vue3 не применяется?

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

    :style="{ color: bgColor }"

    Цветами ЧЕГО? Свойство color - это цвет текста, никакого текстового содержимого в блоках нет.

    Делаю как в документации

    v-for="(index, bgColor) in colorArray"

    Ну конечно, как в документации. Там ведь тоже элемент массива и его индекс местами перепутаны. Или всё-таки нет?
    Ответ написан
    Комментировать
  • Выбор из нескольких компонентов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    computed: {
      component() {
        /*
         * здесь возвращаете имя компонента, в зависимости от... это вам виднее;
         * если действительно будет так, как показано в вопросе - натуральные числа
         * соответствуют компонентам, то можно сложить имена компонентов в массив:
         * return [ 'component-1', 'component-2', 'component-3' ][this.x - 1];
         */
      },
    },

    <component :is="component" />
    Ответ написан
    1 комментарий
  • Как сделать подсчет количества строк?

    0xD34F
    @0xD34F Куратор тега Vue.js
    computed: {
      linesCount() {
        return 1 + (this.text.match(/\n/g)?.length ?? 0);
      },
    },

    <div>{{ linesCount }}</div>
    Ответ написан
    1 комментарий
  • Можно ли передать параметр в computed vue3?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Можно. Если значение этого computed является функцией. Но если вам туда надо передавать параметр, то, наверное, это должен быть метод, а не computed.
    Ответ написан
    Комментировать
  • Как правильно свести посты к категориям, через отношение?

    0xD34F
    @0xD34F Куратор тега Vue.js
    computed: {
      categories() {
        return this.posts.data.reduce((acc, n) => (
          (acc[n.category_name] ??= {
            name: n.category_name,
            posts: [],
          }).posts.push(...n.posts),
          acc
        ), {});
      },
      ...

    <div v-for="category in categories">
      <h3>{{ category.name }}</h3>
      <div v-for="post in category.posts">
        {{ post.title }}
      </div>
    </div>
    Ответ написан
  • Как установить ref на transition-group елемент?

    0xD34F
    @0xD34F Куратор тега Vue.js
    ref указанный так указывает на Proxy а не на элемент. Как это исправить?

    Никак не исправить.

    Да это и не нужно. За этим Proxy скрывается ссылка на экземпляр компонента, а у экземпляра компонента в качестве одного из свойств присутствует ссылка на элемент.
    Ответ написан
    Комментировать