Задать вопрос
Ответы пользователя по тегу Vue.js
  • Как переключаться между компонентами при клике на список используя v-for?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Понадобятся два свойства - массив имён компонентов и имя выбранного в данный момент компонента:

    data: () => ({
      items: [ 'имя-компонента-1', 'имя-компонента-2', 'имя-компонента-3' ],
      selected: null,
    }),

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

    <li
      v-for="n in items"
      v-text="n"
      @click="selected = n"
    ></li>

    Если что-то выбрано, рендерим это что-то:

    <component v-if="selected" :is="selected"></component>
    Ответ написан
    3 комментария
  • Странное поведение при рендеренге таблицы, почему?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Гм-гм... Опять несколько корневых элементов сделали - не далее как месяц назад, вы уже сталкивались с подобной проблемой. Не надоело продолжать наступать на одни и те же грабли?

    Так, теперь что делать.
    1. Заголовок таблицы оборачиваете в thead
    2. В draggable добавляете атрибут element="tbody"
    3. Элемент tr из шаблона компонента table-operations выбрасываете, v-for будет по item-operation
    4. В компоненте item-operation оборачиваете все td в один общий tr
    Ответ написан
    Комментировать
  • Как передать элемент в @click?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Объект события доступен как $event, так что

    <button @click="someFunction($event.target)">Click!</button>


    Но вообще, если вы действительно собираетесь

    повесить на него определенный класс

    , то так делать не надо. О том, как правильно работать с классами, вы можете прочитать в документации.
    Ответ написан
  • Как правильно работать со vuex?

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

    Да. Вместо

    let puzzles = getters.getPuzzles

    делайте

    let puzzles = [...getters.getPuzzles]
    Ответ написан
    5 комментариев
  • Каким образом лучше сделать данный слайд во Vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Через масив slides(условно) их не выведешь т.к контент у них различаеться...

    Да ну? А что мешает сделать контент свойством элементов slides и передавать каждому слайду то, что нужно?
    Ответ написан
  • Как добавить новую модель на основе уже созданной?

    0xD34F
    @0xD34F Куратор тега Vue.js
    А что такое this.rooms - массив, объект, есть ли у него вложенные объекты? Раз уж решили не показывать, что это такое...

    Можно вместо this.rooms попробовать присваивать JSON.parse(JSON.stringify(this.rooms)) (правда, если внутри есть методы, они отвалятся).

    Или можно воспользоваться _.cloneDeep или каким-нибудь аналогом, или реализовать его самостоятельно.

    Или можно добавить в компонент метод, который будет возвращать дефолтное значение rooms (т.е., создавать новый объект при каждом вызове), и, когда понадобится ещё один экземпляр rooms, вместо обращения к this.rooms использовать этот метод:

    methods: {
      createRooms() {
        return {
          ...
        };
      },
      ...

    this.period[moment(itr.next().toDate()).format('YYYY-MM-DD')] = this.createRooms();
    Ответ написан
    1 комментарий
  • Vue-router - переключение по скроллу?

    0xD34F
    @0xD34F Куратор тега Vue.js
    например

    HTML

    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.3/vue.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue-router/3.0.1/vue-router.min.js"></script>
    
    <div id="app" :style="appStyle">
      <transition name="route-change">
        <router-view class="route"></router-view>
      </transition>
    </div>


    JS

    const router = new VueRouter({
      routes: [
        [ '/',               'home', 'black' ],
        [ '/xxx',  'hello, world!!',   'red' ],
        [ '/yyy',  'fuck the world', 'green' ],
        [ '/zzz', 'fuck everything',  'blue' ],
      ].map(([ path, text, color ]) => ({
        path,
        component: {
          template: `<div style="background: ${color};">${text}</div>`,
        },
      })),
    });
    
    new Vue({
    	router,
      el: '#app',
      data: () => ({
        routeIndex: 0,
      }),
      computed: {
        appStyle() {
          return {
            height: `${100 * (this.$router.options.routes.length + 1)}vh`,
          };
        },
      },
      watch: {
        routeIndex(val) {
          const { $router } = this;
          const { routes } = $router.options;
          const index = Math.max(0, Math.min(routes.length - 1, val | 0));
    
          $router.push(routes[index].path);
        },
      },
      mounted() {
        const onScroll = () => this.routeIndex = window.scrollY / window.innerHeight | 0;
        onScroll();
        window.addEventListener('scroll', onScroll);
      },
    });


    CSS

    html, body {
      margin: 0;
    }
    
    .route {
      width: 100vw;
      height: 100vh;
      position: fixed;
      display: flex;
      justify-content: center;
      align-items: center;
      color: white;
      font: bold 64px monospace;
      transition: transform 0.2s ease-in;
    }
    
    .route-change-enter {
      transform: translateX(100%);
    }
    .route-change-enter-to,
    .route-change-leave {
      transform: translateX(0);
    }
    .route-change-leave-to {
      transform: translateX(-100%);
    }

    Ответ написан
    Комментировать
  • Как правильно реализовать drag and drop?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Есть подозрение что...

    Не надо подозревать - надо открыть консоль, и посмотреть, что там происходит. А именно, вы должны были получить предупреждение о том, что шаблон скомпилирован с ошибкой: "You are binding v-model directly to a v-for iteration alias. This will not be able to modify the v-for source array because... бла-бла-бла".

    Добавьте индекс (например, room_index) в v-for="room in rooms".

    И замените v-model="room" на v-model="period[day][room_index]".
    Ответ написан
    1 комментарий
  • Как применять реактивность при использовании Vuex?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сделайте computed свойство, у которого геттер возвращает значение из vuex, а сеттер - дёргает мутацию:

    сomputed: {
      checked: {
        get() {
          return this.$store.state.checked
        },
        set(val) {
          this.$store.commit('updateChecked', val)
        }
      }
    }

    https://jsfiddle.net/4nkh119u/
    Ответ написан
    5 комментариев
  • Зависимость нескольких select-ов?

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

    Например, так. Добавляете в объекты, на основе которых создаются элементы управления, свойство value, передаёте его в v-model соответствующего элемента (надо будет реализовать v-model для вашего dropdown'а). Делаете computed свойство formData на основе этих value. И задаёте элементам v-if - если элемент имеет зависимость, то пока соответствующее поле в formData не заполнено, элемент не создаётся (или disabled реализовываете - с аналогичной логикой).

    как в select model передать данные, которые выводятся в консоль после выбора объекта?

    Ну, НАВЕРНОЕ, вместо вывода в консоль эти данные куда-то сохранить надо - и передавать оттуда в соответствующий dropdown.
    Ответ написан
  • Как заставить перестать моргать форму авторизации?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавьте третье состояние, оно же дефолтное - неопределённость, непонятно, авторизован пользователь, или нет:

    data: () => ({
      auth: null,
    }),
    methods: {
      checkUser() {
        ...
        // указываем false только в случае отрицательного результата проверки
        this.auth = false;
        ...
      },
    },

    <template v-else-if="auth === false">
      ФОРМА АВТОРИЗАЦИИ
    </template>
    Ответ написан
  • Сортировка по блокам в зависимости от даты?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Можно как-то в зависимости от даты отсортировать данные из массива по этим блокам?
    То есть в блок "Сегодня" уходит 2018-05-28
    В блок "Вчера" 2018-05-27

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

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавьте свойство value каждому элементу массива, его и указывайте в v-model. А item сделайте из обычного свойства вычисляемым.

    data: () => ({
      entity: [
        { id: 1, name:   'title', value:   'default title' },
        { id: 2, name: 'address', value: 'default address' },
      ],
    }),
    computed: {
      item() {
        return this.entity.reduce((acc, n) => (acc[n.name] = n.value, acc), {});
      },
    },

    <div v-for="n in entity" :key="n.id">
      <label>
        {{ n.name }}
        <input type="text" v-model="n.value">
      </label>
    </div>
    Ответ написан
    Комментировать
  • Как добавить обработчик событий к группе элементов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    На div с id 98 и 99 клик работает

    Да ну? Нечему там работать, вот эта штука

    greet: function () {
        alert('Привет!');
    }

    должна находиться в methods. От которого у вас одна закрывающая скобка (wtf??!).

    когда делаю так
    template: '<div class = "brick"  v-on:click="greet">{{ brick.text }}</div>'

    выдает ошибку реактивности

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

    Какие есть варианты исправить ситуацию:

    • Слушать снаружи нативное событие, добавив соответствующий модификатор:

      <brick-item @click.native="greet" ...

    • Эмитить событие изнутри компонента при клике по корневому элементу:

      <div @click="$emit('click')" ...

    • Добавить корневому элементу компонента передаваемые ему слушатели событий.

      Можно конкретно click: <div @click="$listeners.click" ...
      А можно - всё, что есть: <div v-on="$listeners" ...

    Ответ написан
    Комментировать
  • Почему вотчер не возвращает старое значение?

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

    Чтобы иметь доступ к предыдущему значению, надо создавать новый массив. Т.е., например, сейчас у вас есть this.array.push('hello'). Вместо этого делайте this.array = [ ...this.array, 'hello' ].

    Аналогично и с объектами - вместо какого-нибудь this.obj.prop = value будет this.obj = { ...this.obj, prop: value }.

    UPD.

    watch: {
        array: function (o, n) {
          this.oldData = o
          this.newData = n
        }
      }

    У вас тут старое и новое значение местами перепутаны.
    Ответ написан
    Комментировать
  • Как разрезать картинку на много частей?

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

    Нормальное решение. Простое и короткое.

    Как бы вы это сделали с позиции проектирования и производительности?

    Что вы понимаете под "позицией проектирования" я без понятия, а что до производительности - сперва стоит сделать хоть как-нибудь, оптимизацией займётесь потом (если надо будет).

    Никогда не имел дела с Canvas, насколько я понимаю, он тут тоже может помочь

    Может. Только при чём тогда тут Vue, указанный вами в тэгах?
    Ответ написан
    1 комментарий
  • Как изменить набор слайдов в vue-slick?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Использую карусель vue-slick...

    Я так понимаю, вы говорите про эту?

    Есть кнопка "добавить слайд", после которой нужно "перезапустить" слайдер. <...> Пробую использовать в методе добавления слайда this.$refs.slick.$reSlick(), ничего не получается.

    Что неудивительно - внутри reSlick карусель уничтожается и сразу же создаётся. При уничтожении вся внутренняя разметка кроме картинок вырезается, сами же картинки slick держит в отдельном div'е - то есть, только что добавленный слайд попадает в корневой элемент slick'a и сразу же удаляется.

    Так что порядок действий при изменении набора слайдов должен выглядеть как-то так - уничтожить карусель, изменить разметку, создать карусель. То есть, вызов $refs.slick.destroy; затем изменение данных, на основе которых строится разметка слайдов; и наконец, вызов $refs.slick.create, обёрнутый в $nextTick.

    Заниматься подобной ерундой особого смысла не вижу, лучше будем уничтожать и создавать заново экземпляр самого компонента. Для этого назначим ему key, чьё значение будет зависеть от набора данных, на основе которых строится разметка слайдов. Например.
    Ответ написан
    Комментировать
  • Как решить проблему с transition-group?

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

    <transition-group name="trgroup" :key="active.name">

    Демо.
    Ответ написан
    8 комментариев
  • Как во Vue получать номер страницы, на которой нахожусь и запускать в зависимости от этого анимации?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Устанавливайте transition'у значение параметра name в зависимости от текущего маршрута:

    computed: {
      routeAnimation() {
        return что-то, зависящее от this.$route;
      },
    },

    <transition :name="routeAnimation">
      <div :key="routeAnimation"></div>
    </transition>

    https://jsfiddle.net/wac86yo0/1/
    Ответ написан
    Комментировать
  • Пропал элемент в html после указания родителя в объекте el: '#app'?

    0xD34F
    @0xD34F Куратор тега Vue.js
    @click="pushNumbars() reader.push(*)"

    Вот из-за подобных художеств шаблон и не рендерится.

    Между выражениями должна быть точка с запятой, и ещё кавычек не хватает - попробуйте догадаться где. Ну а по-хорошему - вместо этого позорища надо бы метод сделать, так и ошибки будут очевиднее.
    Ответ написан
    3 комментария