Задать вопрос
  • Почему не работает создание объекта?

    0xD34F
    @0xD34F
    Почему не работает - вам написали, синтаксическая ошибка.

    Возьмите ваш action.title в кавычки, либо в квадратные скобки - в зависимости от того, что вам нужно. В первом случае именем свойства будет "action.title", во втором - значение action.title.

    Кстати, а что нужно? Очевидно, второй вариант - значение action.title должно стать ключом, но что дальше? Ведь получится, что ключ и значение свойства вложенного объекта совпадают, а больше в этом вложенном объекте ничего и нет. Будет ли он дополняться в будущем чем-то ещё? Если нет, было бы логичнее складывать эти title'ы в массив вместо создания отдельного объекта под каждый. Если да, то в случае, если объект с указанным title'ом уже существует, его свойства будут потеряны. Так и задумано? Если нет, то их надо копировать:

    return {
      ...state,
      [action.title]: {
        ...state[action.title],
        title: action.title,
      },
    };
    Ответ написан
    Комментировать
  • Как работать с массивом в котором есть объект и вложенный массив?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как из этого массива, создать новый массив, и чтобы в нем были значения из массива user, что-то типа такого массива должно получиться res = [5,12,2,22,'5,23',cost,'5',numbers,1,5,33,count,props,4,area,7];

    В смысле - хотите, чтобы все элементы массивов и ключи/значения объектов, включая вложенные, оказались развёрнуты в одномерный массив? Ну, так можно:

    const toArray = val =>
      val instanceof Object
        ? [].concat(...(val instanceof Array
            ? val
            : Object.entries(val)
          ).map(toArray))
        : [ val ];
    
    
    const res = toArray(user);
    Ответ написан
    Комментировать
  • Как реализовать выбор чекбоксов зажатием мыши как в Яндекс Почте?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Зажимайте.

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

    Есть ли способ для снятия чекбоксов таким же способом, если делать по аналогии выходит коряво ?

    вот аналогия и вот почему коряво
    https://codepen.io/sasha1998dmitalex/pen/OZbyYo

    Ну, тут разные варианты есть...

    Можно выставлять чекбокс по левой кнопке, снимать по правой, типа так.

    Можно инвертировать состояние чекбокса по событию mouseover, типа так.

    Можно выставлять чекбоксы по зажатой кнопке мыши, а убирать по зажатой кнопке мыши + зажатой клавише ctrl, типа так.
    Ответ написан
    7 комментариев
  • Как динамически удалить и добавить компонент?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Попробовала показать работу тут.

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

    Из странных вещей, которые можно отметить сразу:

    1. Использование даты в качестве key - что, не может быть двух событий в одну дату? Ну и пересоздание экземпляра компонента при каждом изменении даты - тоже как-то стрёмно выглядит.

    2. Обновление данных (onDateInfo) - пишите присланные из компонента данные в какой-то непонятный объект, всегда один и тот же (а экземпляры компонента Date всё-таки разные). Это я вообще не понял, бред какой-то.

    Немного поправил ваш код - по крайней мере, добавление/удаление заработало, и данные обновляются какие надо (если я правильно всё понял). Теперь можете начинать рассказывать, как воспроизвести ваши проблемы - что делать, куда смотреть.
    Ответ написан
    Комментировать
  • SELECT NOT IN ошибка синтаксиса?

    0xD34F
    @0xD34F
    Что делаю не так?

    Пытаетесь подставлять значения посредством шаблонных строк вместо того, чтобы воспользоваться средствами форматирования, которые предоставляет pg-promise (точнее - смешиваете эти подходы).

    Как правильно подставить параметры в запрос

    Да как-то так, например:

    db.query(`
      SELECT *
      FROM table
      WHERE id NOT IN ($(list:csv))
      LIMIT $(limit)
    `, obj)
    Ответ написан
    7 комментариев
  • Как сделать чтобы компонент для vue устанавливался через npm?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Про npm publish слышали?

    Ну и примеры использования конкретно с vue - раз, два, три, ... тысячи их. В общем, погуглил за вас.
    Ответ написан
    Комментировать
  • Как сихронизировать содержимое input и p?

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

    Подходит. Достаточно сразу после назначении обработчика сгенерировать событие самостоятельно - текст скопируется:

    $('input').on('input', function() {
      $('p').text($(this).val());
    }).trigger('input');
    
    // или
    
    const input = document.querySelector('input');
    const p = document.querySelector('p');
    input.addEventListener('input', e => p.textContent = e.target.value);
    input.dispatchEvent(new Event('input'));

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

    что делать, если параграф содержит текст по умолчанию, который должен отображаться пока в поле ввода не начали что-то вводить?

    Проще говоря, когда инпут пустой, надо отображать текст параграфа.

    Текст по умолчанию засунуть в data-атрибут: <p data-default-text="Текст по умолчанию"></p>.

    Если инпут пустой, хватаем значение этого атрибута:

    $('p').text($(this).val() || $('p').data('default-text'));
    
    // или
    
    p.textContent = e.target.value || p.dataset.defaultText
    Ответ написан
    3 комментария
  • Как понять инкапсуляцию стилей?

    0xD34F
    @0xD34F
    Помогите пожалуйста написать учебный пример чтобы было видно действие и выгода инкапсуляции стилей. Мой вариант тут.

    "Помогите"? Да вы и сами справились. Только зачем-то сами же всё и поломали.

    непонятно какое действие осуществляет метааргумент encapsulation: ViewEncapsulation.None

    Это отключение инкапсуляции стилей компонента.

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

    Кажется, вы забыли о том, что у вас в стилях дочернего компонента background закомментирован - потому и применяется стиль из родительского компонента. Уберите комментирование - и оба элемента будут стилизованы в соответствие с правилом из дочернего компонента.

    А ещё лучше - прекратите вдобавок отключать инкапсуляцию, и тогда элементы из разных компонентов будут стилизованы каждый по-своему, несмотря на то, что имя класса - одно и то же. Собственно, в этом и состоит, как вы там выразились? - "выгода инкапсуляции" - вы можете в каждом из компонентов определять собственные правила стилей, не беспокоясь о том, что они будут пересекаться со стилями других компонентов.
    Ответ написан
    3 комментария
  • Можете объяснить проблему в примере css grid?

    0xD34F
    @0xD34F
    У вас в grid-template-areas область nav буквой "г" загнута. Опечатка? - наверное, имелось в виду что-то вроде этого.
    Ответ написан
    2 комментария
  • Как во Vue.js присвоить значение полученное из props переменной?

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

    Ну а так-то можно конечно использовать watch, чтобы следить за изменением props'ов, и переприсваивать что там вам нужно.
    Ответ написан
    Комментировать
  • Как переименовать свойства в объекте?

    0xD34F
    @0xD34F Куратор тега Vue.js
    В дополнительном вычисляемом свойстве, которое у вас является просто ссылкой на массив в хранилище, необходимости нет - сразу создавайте новый массив, свойства элементов которого будут переименованы так, как вы сочтёте необходимым:

    computed: {
      categories() {
        return this.$store.state.main_page.NEWS.map(n => ({
          value: n.id,
          label: n.name,
        }));
      },
    },
    Ответ написан
    Комментировать
  • Как отловить id строки и удалить ее?

    0xD34F
    @0xD34F Куратор тега React
    Передавайте в метод удаления индекс удаляемого элемента, например:

    deleteRow={() => this.deleteRow(i)}

    deleteRow(index) {
      const productsList = [...this.state.productsList];
      productsList.splice(index, 1);
      this.setState({
        productsList,
      });
    }
    Ответ написан
  • Как сгруппировать данные?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const grouped = data
      .reduce((acc, n, i, a) => {
        if (i && n.id === a[i - 1].id + 1) {
          acc[acc.length - 1][1][1] = n.id;
        } else {
          acc.push([ [], [ n.id ] ]);
        }
        acc[acc.length - 1][0].push(n);
        return acc;
      }, [])
      .reduce((acc, n) => {
        acc[n[1].join('-')] = n[0];
        return acc;
      }, {});
    Ответ написан
    1 комментарий
  • Как из вложенных пунктов меню возвращаться к родительским?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сохранять открытые пункты меню в стек. Верхний элемент стека - текущий список пунктов меню (оформляем в виде вычисляемого свойства). Надо перейти к вложенному - кладём его в стек. Надо закрыть текущий и вернуться к родительскому - удаляем элемент из стека.

    https://jsfiddle.net/dLyo3mkw/
    Ответ написан
    Комментировать
  • Как в v-model добавить computed?

    0xD34F
    @0xD34F Куратор тега Vue.js
    У computed свойств можно делать (а вам в данной ситуации и нужно) и сеттеры:

    dateStart: {
      get() {
        return moment().subtract(1, this.selectedPeriod).toDate();
      },
      set(value) {
        // ну, тут вам виднее, какой должен код быть
      },
    },
    Ответ написан
    6 комментариев
  • Как передать аргумент в обработчик?

    0xD34F
    @0xD34F Куратор тега React
    Во-первых, параметр state функции, переданной в setState, перекрывает параметр state, передаваемый в modalRun. Во-вторых, второй параметр функции, передаваемой в setState - это props, а вовсе не state. В общем, дурацким выбором имён параметров сами себя в заблуждение вводите. Делайте так:

    modalRun = (modalState) => {
      this.setState((prevState) => {
        return {
          modal: {
            ...prevState.modal,
            state: modalState,
          },
        };
      });  
    }
    Ответ написан
    2 комментария
  • Как при изменении значения input отследить что новое число меньше чем введенное ранее в этот же input?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('input').on('input', function() {
      const
        $this = $(this),
        newVal = +$this.val(),
        oldVal = +$this.data('oldVal') || 0;
    
      if (oldVal !== newVal) {
        console.log(`новое ${['больше', 'меньше'][+(oldVal > newVal)]}`);
      }
    
      $this.data('oldVal', newVal);
    });
    Ответ написан
  • Почему не работает калькулятор стоимости?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как я понимаю, при клике я каждый раз вызываю функцию и переменная val опять принимает значение равное нулю?

    Не совсем так. При каждом клике создаётся ещё один экземпляр val, подключаются ещё по одному обработчику клика к .value-btn-plus и .value-btn-minus, сами обработчики срабатывают в порядке подключения, поэтому в value-text последним будет записано значение val, к которому имеет доступ последний же подключенный обработчик - т.е. 0, или что там у вас.

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

    $(document).on('click', '.value-btn-plus, .value-btn-minus', function() {
      const $this = $(this);
      const change = $this.hasClass('value-btn-plus') ? 1 : -1;
    
      $this
        .closest('.input-box')
        .find('.value-text')
        .text((i, text) => Math.max(0, +text + change));
    });

    Или, к чёрту jquery:

    document.addEventListener('click', ({ target: t }) => {
      const change =
        t.classList.contains('value-btn-plus')  ?  1 :
        t.classList.contains('value-btn-minus') ? -1 :
                                                   0;
      if (change) {
        const valueEl = t.closest('.input-box').querySelector('.value-text');
        valueEl.innerText = Math.max(0, +valueEl.innerText + change);
      }
    });
    Ответ написан
    1 комментарий
  • Как проверить, что строка состоит исключительно из цифр?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Во первых - не нужны слэши в начале и конце, во-вторых - надо экранировать обратный слэш:

    new RegExp('^\\d+$')

    Ну или не надо использовать конструктор:

    const numberValidator = str => /^\d+$/.test(str);
    
    // можно и наоборот - вместо проверки, что все символы являются цифрами,
    // убедиться, что отсутствует хотя бы один не являющийся цифрой
    const numberValidator = str => !/\D/.test(str);
    Ответ написан
    Комментировать
  • Как правильно использовать js замыкание в примере?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Про let слышал, но нужно сделать без него

    Не нужно, но варианты есть такие:

    for (var i = 0; i < 10; i++) {
      (function(i) {
        setTimeout(function() { 
          console.log(i);
        }, 1000);
      })(i);
    }

    for (var i = 0; i < 10; i++) {
      setTimeout(function() { 
        console.log(+this);
      }.bind(i), 1000);
    }

    for (var i = 0; i < 10; i++) {
      setTimeout(console.log, 1000, i);
    }

    for (var i = 0; i < 10; i++) {
      setTimeout(new Function(`console.log(${i})`), 1000);
    }

    for (var i = 0; i < 10; i++) {
      setTimeout(function() {
        console.log(10 - i--);
      }, 1000);
    }
    Ответ написан
    Комментировать