Задать вопрос
  • Как внутри v-on = "..." получить глобальный контекст?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сделайте отдельный метод:

    @click="onClick"

    methods: {
      onClick() {
        this.myVueMeth1();
        this.myVueMeth2();
        document.forms[0].submit();
      },
    },

    UPD. Конечно, вы можете определить computed свойство для document, типа так:

    computed: {
      document() {
        return document;
      },
    },

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

    0xD34F
    @0xD34F Куратор тега JavaScript
    if (cell.textContent === num) {

    Дайте-ка угадаю - num, это число, да? Сенсация! Шок! - число не может быть равно строке.

    Сравнивайте с приведением типов:

    if (cell.textContent == num) {

    Или явным образом приводите значения к одному типу:

    // строку в число
    if (+cell.textContent === num) {
    
    // число в строку
    if (cell.textContent === `${num}`) {
    Ответ написан
    1 комментарий
  • Смена регистра в массиве?

    0xD34F
    @0xD34F
    array_walk_recursive($array, function(&$item) {
      $item = strtolower($item);
    });
    Ответ написан
    Комментировать
  • Передача массива в props?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Дело в том, что значение pickeds задаётся лишь единожды - при создании экземпляра компонента app-some, так что странно ожидать, что оно изменится - вы этого нигде не делаете.

    Не знаю, чего конкретно вам надо, но... Чтобы чекбоксы переключились, есть варианты:
    • Отказаться от внутреннего массива, использовать параметр. Типа так.
    • Использовать computed вместо data. Типа так.
    • Задать key для app-some, это приведёт к созданию нового экземпляра компонента при изменении activeId. Типа так.
    Ответ написан
    1 комментарий
  • Как обработать нажатие на любую ячейку в таблице?

    0xD34F
    @0xD34F Куратор тега React
    handleTdClick(item) {

    Интересно, а как вы собираетесь определять, какой именно элемент следует изменить, если item - число?

    Вместо значения нужны его индексы:

    {this.state.rows.map((row, rowIndex) => (
      <tr>
        {row.map((item, colIndex) => (
          <td
            onClick={this.onTdClick}
            data-row={rowIndex}
            data-col={colIndex}
            className={item ? 'not-empty' : 'empty'}
          >
            {item}
          </td>
        ))}
      </tr>
    ))}

    onTdClick = ({ target: { dataset: d } }) => {
      const row = +d.row;
      const col = +d.col;
    
      this.setState(({ rows }) => ({
        rows: rows.map((n, i) =>
          i === row
            ? n.map((m, j) => j === col ? +!m : m)
            : n
        )
      }));
    }
    Ответ написан
    Комментировать
  • Почему store меняется а страница не рендерится?

    0xD34F
    @0xD34F Куратор тега React
    Вы возвращаете тот же самый массив cards (и тот же самый элемент cards, и то же самое свойство entries обновляемого элемента cards), что и был, поэтому изменений как бы и не было. Делайте копии:

    const addEntry = (state, action) => {
      const cards = [...state.cards];
      const index = cards.findIndex(n => n.id === action.id);
      const card = {...cards[index]};
      card.entries = [ ...card.entries, { id: Math.random().toString(36).substring(7) } ];
      cards[index] = card;
      return { cards };
    };

    Кстати, я правильно понимаю, что

    const addEntry = (state, action) => {

    - это не весь редьюсер, а эта функция вызывается внутри редьюсера? Как-то так, да?
    Ответ написан
    Комментировать
  • Как поочередно подсветить блоки?

    0xD34F
    @0xD34F Куратор тега JavaScript
    document.querySelector('.animate-all').addEventListener('click', () => {
      document.querySelectorAll('[data-color]').forEach((n, i) => {
        setTimeout(() => {
          n.parentNode.style.backgroundColor = n.dataset.color;
        }, i * 500);
      });
    });
    Ответ написан
    Комментировать
  • Как сделать смену фона блока при нажатии на ссылку?

    0xD34F
    @0xD34F Куратор тега JavaScript
    document.addEventListener('click', ({ target: t }) => {
      const { color } = t.dataset;
      if (color) {
        t.parentNode.style.backgroundColor = color;
      }
    });

    или

    document.querySelectorAll('[data-color]').forEach(function(n) {
      n.addEventListener('click', this);
    }, function() {
      this.closest('li').style.backgroundColor = this.getAttribute('data-color');
    });
    Ответ написан
  • Как создать такой массив с данными?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const grouped = Object.values(arr.reduce((acc, { title, value: money }) => {
      (acc[title] = acc[title] || { title, data: [] }).data.push({ money });
      return acc;
    }, {}));
    Ответ написан
    Комментировать
  • Помощь с калькулятором jquery?

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

    $('#production, #col, .pay, [name="size"]').on('input', recalcPrice);
    recalcPrice();
    
    function recalcPrice() {
      const price = [
        $('#production').val(),
        ...$('.pay:checked').get().map(n => n.value),
        $('[name="size"]:checked').val(),
      ].reduce((acc, n) => acc + (n | 0), 0);
    
      $('#final_price').html(price * ($('#col').val() | 0));
    }
    Ответ написан
    Комментировать
  • Как перебрать каждую букву заголовка?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const title = document.getElementById('title');
    title.innerHTML = Array.from(title.innerText, n => `<span>${n}</span>`).join('');

    или

    const title = document.querySelector('#title');
    title.innerHTML = title.textContent.replace(/./g, '<span>$&</span>');

    https://jsfiddle.net/uwjg6qb3/
    Ответ написан
    4 комментария
  • Почему боковое меню не заезжает обратно?

    0xD34F
    @0xD34F Куратор тега CSS
    Уберите opacity... Или добавьте его в transition. А то сейчас у вас элемент становится прозрачным мгновенно - отсюда иллюзия, что он "просто пропадает". Не просто - двигается, так как вам и нужно, но будучи невидимым.
    Ответ написан
  • Почему внутренний React компонент не ререндерится после изменения стейта?

    0xD34F
    @0xD34F Куратор тега React
    Проблема в том, что компонент Form, некоторые элементы которого зависят от стейта - не ререндерятся.

    "Некоторые" - это, видимо, инпуты (плейсхолдеры) и кнопка (текст). Почему не обновляются - да потому, что значение isFormStateChange формы, от которого они зависят (кстати, не "от стейта" - стейта у вас там нет, что за бред-то?), устанавливается лишь единожды, в конструкторе, и изменение isFormStateChange родительского компонента никак на него не влияет.

    Я так понимаю, вы стремились к чему-то такому?
    Ответ написан
    Комментировать
  • Скажите объективно, какая книга сформирует правильный фундамент, Выразительный JavaScript или Илья Кантор?

    0xD34F
    @0xD34F Куратор тега JavaScript
    правильный фундамент <...> ориентироваться в программировании

    Фундаментальный ориентир.
    Ответ написан
    Комментировать
  • Как применить filter к вложенному массиву?

    0xD34F
    @0xD34F Куратор тега JavaScript
    cards.filter(n => n.tags.some(m => m.tag === tag))
    Ответ написан
  • Как подписаться через this.$refs.element на addEventListener()?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Используйте mounted вместо created:

    mounted() {
      this.$refs.textArea.addEventListener(...
    Ответ написан
    Комментировать
  • Как правильно сделать выпадающий div при нажатии?

    0xD34F
    @0xD34F Куратор тега JavaScript
    То, что значение i в момент выполнения document.getElementsByClassName("desc")[i]
    будет тем же, что и в момент выполнения acc[i].addEventListener есть ни на чём не основанная фантазия, не соответствующая реальности.

    Вот если вы объявите i в заголовке цикла с помощью let - тогда да, работать будет.

    Но вообще, создавать отдельные обработчики клика для каждой кнопки и обращаться по индексу к элементам .desc нет необходимости. Можно от кликнутой кнопки подняться до .tab-pane и там переключить класс, который изменит видимость .desc:

    .active .desc {
      display: block;
    }

    const itemSelector = '.tab-pane';
    const buttonSelector = `${itemSelector} .material_info`;
    const activeClass = 'active';
    
    // слушаем клики на кнопках
    document.querySelectorAll(buttonSelector).forEach(function(n) {
      n.addEventListener('click', this);
    }, e => e.target.closest(itemSelector).classList.toggle(activeClass));
    
    // или, применяем делегирование - назначаем обработчик один раз общему предку кнопок,
    // внутри проверяем, где случился клик
    document.addEventListener('click', ({ target: t }) => {
      if (t.matches(buttonSelector)) {
        t.closest(itemSelector).classList.toggle(activeClass);
      }
    });
    Ответ написан
    Комментировать
  • Как отсортировать массив по ближайшему числу?

    0xD34F
    @0xD34F
    return abs(($a['value'] - $c_v) - ($b['value'] - $c_v)); // тут возможно бред - уже изменял 100000 раз и запутался

    Да конечно бред.

    Во-первых, вычислять надо не абсолютное значение разности разностей, а разность абсолютных значений разностей.

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

    В общем, ваша сортировка могла бы выглядеть как-то так:
    usort($arr, function($a, $b){
      $c_v = 2.6;
      return ceil(abs($a['value'] - $c_v) - abs($b['value'] - $c_v));
    });
    Ответ написан
    Комментировать
  • Как вывести матрицу в DOM?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Получение случайного числа:

    const random = (min, max) =>
      Math.floor(Math.random() * (max - min + 1)) + min;

    Создание матрицы:

    function createMatrix(rows, cols, min, max) {
      const matrix = [];
    
      for (let i = 0; i < rows; i++) {
        matrix.push([]);
    
        for (let j = 0; j < cols; j++) {
          matrix[i][j] = random(min, max);
        }
      }
    
      return matrix;
    }
    
    // или
    
    const createMatrix = (rows, cols, min, max) =>
      Array.from({ length: rows }, () =>
        Array.from({ length: cols }, () =>
          random(min, max)
        )
      );

    Вывод:

    function outputMatrix(matrix, el) {
      const table = document.createElement('table');
    
      matrix.forEach(function(n) {
        const tr = this.insertRow();
        n.forEach(m => tr.insertCell().textContent = m);
      }, table.createTBody());
    
      el.appendChild(table);
    }
    
    // или
    
    function outputMatrix(matrix, el) {
      el.insertAdjacentHTML('beforeend', `
        <table>
          <tbody>${matrix.map(n => `
            <tr>${n.map(m => `
              <td>${m}</td>`).join('')}
            </tr>`).join('')}
          </tbody>
        </table>
      `);
    }

    Как всем этим пользоваться:

    outputMatrix(createMatrix(5, 5, 10, 30), document.body);
    Ответ написан
    5 комментариев
  • Как организовать логику фильтра из списка чекбоксов на vue.js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Так?

    что-то мне подсказывает, что сам подход не верен

    Ну в общем да, проблемка есть - унеся всю логику в computed (чего вообще делать не надо, т.к. computed для подобного не предназначены), затруднительно определить, какой из чекбоксов изменил последним своё состояние. Если выбран один чекбокс "секция №" и "все", что надо делать - снять первый или второй? Непонятно.

    возможно вообще стоит разделить all и остальной список чекбоксов?

    Да, так тоже можно.
    Ответ написан