Задать вопрос
  • Сортировка по блокам в зависимости от даты?

    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>
    Ответ написан
    Комментировать
  • Angular 2 ngFor?

    0xD34F
    @0xD34F
    Вместо this.listers = data['in']; пусть будет

    this.listers = Object.entries(data.in).map(([key, val]) => ({ key, val }));

    Тогда при переборе listers в ngFor ключи будут доступны как item.key, а значения - как item.val.
    Ответ написан
    Комментировать
  • Как добавить обработчик событий к группе элементов?

    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 Куратор тега Яндекс.Карты
    Для этого воспользуйтесь методами setBounds и getBounds. Типа так.

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

    А можно регулировать масштаб? Сейчас максимально приближено. Можно установить значение zoom 15, например?

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

    0xD34F
    @0xD34F Куратор тега JavaScript
    Потому что методы принадлежат непосредственно экземпляру, а не конструктору. Хотите вызывать их у конструктора - ну так сделайте их его свойствами. Правда, не очень понятно, зачем тут вообще конструктор - пусть это будет простой объект, содержащий нужные методы:

    const random = {
      intFromInterval: (min, max) => Math.floor(Math.random() * (max - min)) + min,
      intFromZero: (max) => Math.floor(Math.random() * max),
    };
    
    console.log(random.intFromInterval(55, 66));
    Ответ написан
    Комментировать
  • Как сделать, чтобы NodeList.prototype.forEach заработал в Internet Explorer?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вариант раз, воспользоваться forEach'ем массива:

    Array.prototype.forEach.call(cards, function(cardDiv) {
      // ...
    });

    Вариант два, переписать через цикл for:

    for (var i = 0; i < cards.length; i++) {
      var cardDiv = cards[i];
      // ...
    }

    Вариант три - найти и добавить полифилл.
    Ответ написан
    1 комментарий
  • Почему вотчер не возвращает старое значение?

    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, чьё значение будет зависеть от набора данных, на основе которых строится разметка слайдов. Например.
    Ответ написан
    Комментировать
  • Как можно сделать движение плавным в css animation(keyframes)?

    0xD34F
    @0xD34F Куратор тега CSS
    нужно вращать сначала медленно, потом быстро, потом опять медленно

    Так?

    Ну и вообще - вам стоит почитать про временные функции.
    Ответ написан
    2 комментария
  • Как решить проблему с transition-group?

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

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

    Демо.
    Ответ написан
    8 комментариев
  • Как реализовать динамическое сравнение массивов на основе чекбоксов?

    0xD34F
    @0xD34F Куратор тега React
    Для хранения выбранных значений можно использовать объект, имена свойств которого соответствуют индексам групп чекбоксов, а значения будут массивами значений, соответствующих чекбоксам выбранной группы (вперемешку, без разделения по конкретным чекбоксам). В обработчике клика чекбокса в зависимости от его checked дописываете или выбрасываете значения группы.

    Для вывода значений, выбранных во всех группах берёте массив выбранных значений любой группы, и фильтруете его с условием, что элемент массива присутствует во всех массивах выбранных значений групп.

    Выглядеть это может так, например:

    class App extends React.Component {
      state = {
        selected: {},
        groups: [
          [
            [ 'value_a1', 'value_a2', 'value_a3' ],
            [ 'value_b1', 'value_b2', 'value_b3' ],
            [ 'value_c1', 'value_c2', 'value_c3' ],
          ],
          [
            [ 'value_a1', 'value_b1', 'value_c1' ],
            [ 'value_a2', 'value_b2', 'value_c2' ],
            [ 'value_a3', 'value_b3', 'value_c3' ],
          ],
        ],
      }
    
      onChange = (e, groupIndex, itemIndex) => {
        const selectedGroup = this.state.groups[groupIndex][itemIndex];
        const selectedInfo = this.state.selected[groupIndex] || [];
    
        this.setState({
          selected: {
            ...this.state.selected,
            [groupIndex]: e.target.checked
              ? selectedInfo.concat(selectedGroup)
              : selectedInfo.filter(n => !selectedGroup.includes(n))
          },
        });
      }
    
      render() {
        const { selected, groups } = this.state;
        const matched = (selected[0] || []).filter(n => {
          return groups.every((group, i) => (selected[i] || []).includes(n));
        });
    
        return (
          <div>
            {groups.map((group, groupIndex) => (
              <ul>
                {group.map((item, itemIndex) => (
                  <li>
                    <input
                      type="checkbox"
                      onChange={(e) => this.onChange(e, groupIndex, itemIndex)}
                    />
                    {item.map(val => <span>{val}</span>)}
                  </li>
                ))}
              </ul>
            ))}
            <div>
              {matched.map(val => <span>{val}</span>)}
            </div>
          </div>
        );
      }
    }
    Ответ написан
    1 комментарий
  • Как во 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/
    Ответ написан
    Комментировать
  • Как встроить svg, используя Renderer2?

    0xD34F
    @0xD34F
    При создании SVG элементов надо указывать пространство имён. Т.е., замените
    this.renderer.createElement('svg');
    на
    this.renderer.createElement('svg', 'svg');

    Ну и соответственно
    this.renderer.createElement('circle');
    на
    this.renderer.createElement('circle', 'svg');
    Ответ написан
    2 комментария
  • Почему срабатывает EventEmitter?

    0xD34F
    @0xD34F
    Мне этот механизм не понятен.

    Обработка события selectedColorChange осуществляется автоматически - поскольку задана двусторонняя привязка для свойства selectedColor.

    Как это можно понять, это документированная возможность?

    Документированная.
    Ответ написан
    2 комментария
  • В чем ошибка reactJS JSON?

    0xD34F
    @0xD34F Куратор тега React
    Кривой json - проверьте кавычки вокруг ключа во второй строке.
    Компонент Comment - судя по имени и по коду, он должен рендерить один комментарий, а у вас массив. Наверное, тут нужен ещё один компонент - список комментариев.

    const Comment = ({ general, job, address }) => (
      <li>
        <div>first name: {general.firstName}</div>
        <div>last name: {general.lastName}</div>
        <div>company: {job.company}</div>
        <div>address: {address.country}, {address.city}, {address.street}</div>
      </li>
    );
    
    const CommentList = ({ comments }) => (
      <ul>
        {comments.map(n => <Comment {...n} />)}
      </ul>
    );
    
    ReactDOM.render(
      <CommentList comments={comments} />,
      document.getElementById('root')
    );
    Ответ написан
    Комментировать
  • Как сделать скрывающиеся блоки?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('.button').click(function() {
      const $this = $(this);
      const $content = $this.closest('.item').find('.block');
    
      if ($this.hasClass('closed')) {
        $this.removeClass('closed').html('Скрыть &#8593;');
        $content.slideDown();
      } else {
        $this.addClass('closed').html('Показать &#8595;');
        $content.slideUp();
      }
    }).click();
    Ответ написан
    1 комментарий