На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> сортировка массива , immutable-helper vs legacy react-addons-update
    Перейду сразу к вопросу. См ниже код
    ExpandedWrap disabled
      // import update from 'react-addons-update';
      import update from 'immutability-helper';
      import sortBy from 'sort-by';
       
      const items = [
        { name: 'Edward', value: 21 },
        { name: 'Sharpe', value: 37 },
        { name: 'And', value: 45 },
        { name: 'The', value: -12 },
        { name: 'Magnetic', value: 13 },
        { name: 'Zeros', value: 37 }
      ];
       
      const newItems = update(items, {
        $apply: items => {
          return items.sort(sortBy('name'))
        }
      });
       
      console.log(items);
      console.log(newItems);

    Если юзать immutability-helper, то исходный массив всеравно изменяется! а если react-addons-update, то все пучком исходный массив не изменяется.

    В доках пишут что react-addons-update устарел и надо юзать immutability-helper
    https://reactjs.org/docs/update.html

    В чем подвох? Как то не понятен :D
      Сам все порешал :D

      Короче пришлось капаться в исходниках immutability-helper и react-addons-update и сравнивать их.
      Вот что я обнаружил оказывается в react-addons-update вначале c исходного объекта или массива делают его копию! А уже потом идет вызов $apply или других $... . В случае immutability-helper копия не делается.

      Итак фиксим след образом:
      ExpandedWrap disabled
        const newItems = update(items, {
          $splace: [[0,0]], // делаем копию items
          $apply: items => {
            return items.sort(sortBy('name'))
          }
        });


      Гениально! :lool:

      пс. $splice можно заменить на любую $... все они кроме $apply предварительно делают копию исходного объекта
      Сообщение отредактировано: Cfon -
        ExpandedWrap disabled
          const newItems = update(items.slice(0), { ... });


        :whistle:
          Цитата Serafim @
          ExpandedWrap disabled
            const newItems = update(items.slice(0), { ... });
          :whistle:

          Гениально! :lool:
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0189 ]   [ 15 queries used ]   [ Generated: 28.03.24, 15:57 GMT ]