Задать вопрос
  • Почему в консоли выводится 6 и 340?

    0xD34F
    @0xD34F Куратор тега JavaScript
    .then(
      (x) => x + 1,
      (x) => x + 3
    ) //promise rejected, value = 14

    Так, а второй коллбек then'а - он для чего нужен? Тройка добавится, будет 17. И, соответственно, последующие catch'и пропускаются, будет выполнен .then((x) => x * 20).
    Ответ написан
    1 комментарий
  • Почему кнопка постоянно disabled?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Отвечать прямо не буду, предложу ряд встречных вопросов, разберётесь с ними - разберётесь со своим:

    Сколько у вас чекбоксов?
    Что выдаёт метод every для пустого массива?
    Как работает оператор ||?
    Ответ написан
    2 комментария
  • Стоит ли использовать lodash сейчас?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Я так понимаю все что предлагает лодаш уже реализовано нативно

    Не понимаете.
    Ответ написан
    Комментировать
  • Как выделять данные в столбце таблицы Element Plus различными цветами?

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

    .waiting { background: yellow; }
    .working { background: green; }
    .completed { background: blue; }

    Определить, какому тексту какой класс соответствует:

    const highlight = {
      'Ожидание': 'waiting',
      'Работа': 'working',
      'Завершено': 'completed',
    };

    Дальше остаётся эти классы назначить кому надо.

    Класс получает элемент внутри ячейки:

    <el-table-column label="Процесс">
      <template #default="{ row: { process } }">
        <span :class="highlight[process]">{{ process }}</span>
      </template>
    </el-table-column>

    Или, класс получает сама ячейка таблицы:

    const cellClassName = ({ column, row }) =>
      column.property === 'process'
        ? (highlight[row.process] ?? '')
        : '';

    <el-table
      :cell-class-name="cellClassName"
      ...
    >
    Ответ написан
  • Как изменить иконку календаря по умолчанию у date picker element plus?

    0xD34F
    @0xD34F Куратор тега Vue.js
    prefix-icon="calendar-icon"

    Да ну? В документации говорится, что это должна быть не строка, а компонент. Давайте будем делать, как сказано.

    UPD. Документацию с первого раза полностью прочитать не осилил, как подсказывают в комментариях - строку указывать всё-таки можно. Окей, вот строка с именем компонента.
    Ответ написан
  • Как добавить иконку в Select ElementPlus?

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

    - <template slot="prefix">
    + <template #prefix>
    Ответ написан
    Комментировать
  • Как реализовать подобный паттерн на CSS?

    0xD34F
    @0xD34F Куратор тега CSS
    Ответ написан
    Комментировать
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    0xD34F
    @0xD34F
    function combine($ids, $keys, ...$values) {
      return array_combine(
        $ids,
        array_map(
          fn($i) => array_combine($keys, array_column($values, $i)),
          array_keys($ids)
        )
      );
    }
    
    
    $result = combine($input, $params, $array1, $array2);
    Ответ написан
    2 комментария
  • Как изменять цвет текста в progress bar'е?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Ответ написан
    Комментировать
  • Как перевести дату в строке в формат UNIX?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const months = Object.fromEntries(Array.from(
      { length: 12 },
      (_, i) => [ new Date(0, i).toLocaleString('ru-RU', { month: 'long' }), i ]
    ));
    
    function parseDate(str) {
      const [ , month, day, year, hour, minute ] = str.match(/(\S+) (\d+), (\d+) (\d+):(\d+)/);
      return +new Date(year, months[month.toLowerCase()], day, hour, minute);
    }
    Ответ написан
    1 комментарий
  • Как отрендерить календарь, чтобы числа дней выводились в соответствии с днями недели?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Отдельные циклы для чисел за текущий и предыдущий месяцы (кстати, а где у вас следующий?) не нужны. Чтобы получить число, надо не на счётчик цикла смотреть, а на дату - начальным значением будет первое число месяца минус количество дней, прошедших с последнего понедельника предыдущего месяца. Цикл крутить надо не до конца месяца, а немного дальше - чтобы общее количество чисел было кратно семи (т.е., чтобы в последней неделе не было отсутствующих дней) и всегда одно и то же (чтобы размер календаря не зависел от отображаемого месяца). Вот так:

    const month = computed(() => {
      const today = new Date().setHours(0, 0, 0, 0);
      const m = date.value.getMonth();
      const d = new Date(date.value.getFullYear(), m, 0);
      d.setDate(d.getDate() - (d.getDay() || 7));
    
      return Array.from({ length: 42 }, () => (
        d.setDate(d.getDate() + 1),
        {
          date: d.getDate(),
          currMonth: d.getMonth() === m,
          today: +d === today,
        }
      ));
    });

    <div class="calendar">
      <div
        v-for="n in weekdays"
        v-text="n"
        class="weekday"
      ></div>
      <div
        v-for="{ date, ...n } in month"
        v-text="date"
        :class="[ 'day', n ]"
      ></div>
    </div>

    .calendar {
      display: grid;
      grid-template-columns: repeat(7, 1fr);
    }
    Ответ написан
    Комментировать
  • Как в react выделить все чекбоксы?

    0xD34F
    @0xD34F Куратор тега React
    Вот так собираю данные с чекбоксов:

    const formData = new FormData(e.currentTarget.form);
    const names = formData.getAll('names');
    setNames(names);

    Понятно. А react тогда зачем?
    Если хотите продолжать в том же духе,...
    ...то обработчик события change для чекбокса, выставляющего/снимающего всё, будет выглядеть так:

    const onAllSelectedChange = ({ target: { checked, form: { names } } }) => {
      names.forEach(n => n.checked = checked);
      setNames(checked ? Array.from(names, n => n.value) : []);
    };

    А для обычных чекбоксов обработчик можно переписать так (это чтобы изменение их состояния влияло на общий, которому надо будет имя задать, "allSelected"):

    const onChange = ({ target: { form } }) => {
      const names = new FormData(form).getAll('names');
      const isAllSelected = names.length === form.names.length;
      const all = form.allSelected;
      all.checked = isAllSelected;
      all.indeterminate = !isAllSelected && !!names.length;
      setNames(names);
    };

    А если делать чуть менее дико, то

    const Checkbox = forwardRef(({ label, ...props }, ref) =>
      <label>
        <input type="checkbox" ref={ref} {...props} />
        {label}
      </label>
    );
    
    function CheckboxGroup({
      items,
      label = item => item,
      selected,
      setSelected,
    }) {
      const onChange = ({ target: { checked, dataset: { index } } }) =>
        setSelected(selected => checked
          ? [ ...selected, items[index] ]
          : selected.filter(n => n !== items[index])
        );
    
      const allSelectedRef = useRef();
      const onAllSelectedChange = ({ target: { checked } }) =>
        setSelected(checked ? [...items] : []);
    
      useEffect(() => {
        const isAllSelected = items.length === selected.length;
        allSelectedRef.current.checked = isAllSelected;
        allSelectedRef.current.indeterminate = !isAllSelected && !!selected.length;
      }, [ selected ]);
    
      return (
        <div className="checkbox-group">
          <Checkbox
            label="SELECT ALL"
            defaultChecked={false}
            onChange={onAllSelectedChange}
            ref={allSelectedRef}
          />
          {items.map((n, i) => (
            <Checkbox
              label={label(n)}
              data-index={i}
              checked={selected.includes(n)}
              onChange={onChange}
            />
          ))}
        </div>
      );
    }

    https://jsfiddle.net/kj9wet6L/
    Ответ написан
    Комментировать
  • Как сделать такой фильтр опций на js или jq?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Где находятся чекбоксы и фильтруемые элементы, какой класс обеспечивает сокрытие элементов:

    const checkboxContainer = document.querySelector('.options');
    const itemsContainer = document.querySelector('.box');
    const hiddenClass = 'hidden';

    Собираем селектор на основе состояний чекбоксов (выставлен - класс должен присутствовать, не выставлен - помещаем класс внутрь :not):

    function getCheckedSelector(container) {
      const [ not, has ] = Array.prototype.reduce.call(
        container.querySelectorAll('input'),
        (acc, n) => (acc[+n.checked].push(`.${n.value}`), acc),
        [ [], [] ]
      );
    
      return has.join('') + (not.length ? `:not(${not.join(',')})` : '');
    }

    Затем проверяем фильтруемые элементы на соответствие селектору:

    checkboxContainer.addEventListener('change', function() {
      const selector = getCheckedSelector(this);
    
      for (const n of itemsContainer.children) {
        n.classList.toggle(hiddenClass, !n.matches(selector));
      }
    });

    Или сначала прячем всё, а потом показываем что надо:

    const toggleHidden = (selector, state) => itemsContainer
      .querySelectorAll(selector)
      .forEach(n => n.classList.toggle(hiddenClass, state));
    
    checkboxContainer.addEventListener('change', e => {
      toggleHidden(':scope > *', true);
      toggleHidden(getCheckedSelector(e.currentTarget), false);
    });

    ИЛИ

    При обработке элемента перебираем чекбоксы и проверяем, что их состояния соответствуют наличию классов у данного элемента:

    const checkboxes = [...checkboxContainer.querySelectorAll('input')];
    const onChange = function() {
      this.forEach(({ classList: cl }) => {
        cl.toggle(hiddenClass, checkboxes.some(n => n.checked !== cl.contains(n.value)));
      });
    }.bind([...itemsContainer.children]);
    
    checkboxes.forEach(n => n.addEventListener('change', onChange));
    Ответ написан
  • Как добавить/ удалить класс каждые 3 секунды в Vue?

    0xD34F
    @0xD34F Куратор тега Vue.js
    const blocks = ref(Array.from({ length: 5 }, (_, i) => (-~i) ** 2));
    const active = ref(0);
    
    function next() {
      active.value = (active.value + 1 + blocks.value.length) % blocks.value.length;
    }
    
    let intervalId = null;
    onMounted(() => intervalId = setInterval(next, 500));
    onUnmounted(() => clearInterval(intervalId));

    <div
      v-for="(n, i) in blocks"
      v-text="n"
      :class="[ 'box-item', { active: i === active } ]"
    ></div>

    Конечно, зашивать в стили цвета блоков и их количество - все эти :nth-child - не круто. Лучше сделать компонент, принимающий массив цветов и создающий блоки на его основе. Соответственно, вместо класса будет назначаться цвет фона напрямую, как-то так:

    <div
      v-for="(n, i) in colors"
      :style="{ backgroundColor: i === active ? n : '' }"
      ...
    Ответ написан
    2 комментария
  • Как мне сделать так, чтобы slice был для каждого компонента свой?

    0xD34F
    @0xD34F Куратор тега React
    кликая на один список открывается и второй

    Ну ещё бы не открывался. А как конкретно накосячили - забыли передать dropdownId или тупо скопипастили уже существующий?

    Если каждому экземпляру Dropdown передавать уникальный dropdownId, то открываться будет один. Если открываться должны независимо, то вместо хранения одного id можно сделать объект, где id будут ключами.
    Ответ написан
  • Как осуществлять фильтрацию по нескольким свойствам?

    0xD34F
    @0xD34F Куратор тега React
    Вместо общего массива выбранных значений сделать отдельные для каждого из свойств.

    Чтобы не дублировались чекбоксы, создавать их на основе уникализированных массивов значений свойства вместо массива данных.

    Чтобы поменьше копипастить, оформить чекбоксы в отдельный компонент - принимает массив доступных значений, массив выбранных значений, функцию установки выбранных значений.

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

    https://jsfiddle.net/bqyxa0kL/
    Ответ написан
    Комментировать
  • Как убрать фокус с компонента DateTimePicker при нажатии на ok?

    0xD34F
    @0xD34F Куратор тега Vue.js
    function onVisibleChange(state) {
      if (!state) {
        document.activeElement.blur();
      }
    }

    <el-date-picker
      @visible-change="onVisibleChange"
      ...
    Ответ написан
    Комментировать
  • Почему не обновляется пропс?

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

    Встречный вопрос - почему вы решили, что внутреннее состояние компонента обновляться должно? Покажите, где вы обновляете targetDate при изменении props.date. Нет, можете себя не утруждать - ничего такого у вас нет.

    Не надо никакого targetDate, рассчитываем дни-часы-минуты-секунды сразу на основе props.date - так при изменении props.date не придётся предпринимать никаких дополнительных телодвижений, всё посчитается как надо при следующем вызове updateCountdown. Вот как-то так.
    Ответ написан
    Комментировать
  • Как разбить многостроковый текст на массив с помощью регулярного выражения?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Понимаю что можно сделать проще с помощью split, но хочу научиться именно с помощью регулярного выражения

    Одно другому не мешает:

    str.split(/\n(?=#EXTINF)/)
    Ответ написан
    Комментировать
  • Как кликать на вложенные элементы так, чтобы не кликался родительский элемент?

    0xD34F
    @0xD34F Куратор тега JavaScript
    .data-accordion--summary-container.active > .dropdown {
      display: block;
    }

    const itemSelector = '.data-accordion--summary-container';
    const activeClass = 'active';
    const toggle = el => el
      .parentNode
      .querySelectorAll(`:scope > ${itemSelector}`)
      .forEach(n => n.classList[n === el ? 'toggle' : 'remove'](activeClass));

    // применяем делегирование
    document.body.addEventListener('click', ({ target: t }) =>
      t.matches(itemSelector) && toggle(t)
    );
    
    // или, назначаем обработчик клика каждому элементу индивидуально
    document.querySelectorAll(itemSelector).forEach(function(n) {
      n.addEventListener('click', this);
    }, e => e.currentTarget === e.target && toggle(e.target));
    Ответ написан
    Комментировать