Задать вопрос
@iordania

Reselect и useMemo особенности использования на примере?

Правильно ли я понимаю, работая с reselect мы можем глобально вынести функцию, а используя useMemo делать соответственно локально в компоненте ?

Объясните пожалуйста на примере ниже в чём преимущественно разница вычислений в useSelector перед useMemo ?
В примере ниже мы избавляемся от лишнего ререндера компонента Items при клике по 3-ей кнопке и не совсем понятно в ч>м преимущество перед useMemo.

import React, { memo, PureComponent } from "react";

import { useSelector, useDispatch } from "react-redux";
import { createSelector } from "reselect";
import { add1, add2, add3 } from "../../store/actions/counter";

const Items = memo(({ items }) => {
  console.log("items rerender");
  return (
    <ul>
      {items.map((item) => (
        <Item item={item} key={item} />
      ))}
    </ul>
  );
});

class Italic extends PureComponent {
  render() {
    return <i>Item</i>;
  }
}

class Item extends PureComponent {
  render() {
    const Tag = this.props.item % 2 ? Italic : "li";
    return <Tag>Item</Tag>;
  }
}

const itemsSelector = createSelector(
  (state) => state.counter.counter1,
  (state) => state.counter.counter2,
  (counter1, counter2) => Array.from(Array(counter1 * counter2).keys())
);

const Reselect = () => {
  const dispatch = useDispatch();
  const items = useSelector(itemsSelector);

  const { counter1, counter2, counter3 } = useSelector(
    (state) => state.counter
  );

  // const items = useMemo(
  //   () => Array.from(Array(counter1 * counter2).keys()),
  //   [counter2, counter1]
  // );

  const handleAddCounter = () => {
    dispatch(add1());
  };
  const handleAddCounter2 = () => {
    dispatch(add2());
  };
  const handleAddCounter3 = () => {
    dispatch(add3());
  };

  return (
    <div>
      <button onClick={handleAddCounter}>Add ({counter1})</button>
      <button onClick={handleAddCounter2}>Add2 ({counter2})</button>
      <button onClick={handleAddCounter3}>Add3 ({counter3})</button>
      <Items items={items} />
    </div>
  );
};

export default Reselect;
  • Вопрос задан
  • 240 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
useSelector Это редакс. Если ты данные берешь из редакс, то тебе нужно использовать useSelector. Если тебе нужно вычислять какие то данные прямо в компоненте, тогда useMemo

Это разные хуки, они не взаимозаменяемы, каким образом ты перекрестил у себя их в голове - загадка
в случае
const items = useSelector(itemsSelector);
Ты берешь данные из общего стора
в случае
const items = useMemo(
     () => Array.from(Array(counter1 * counter2).keys()),
     [counter2, counter1]
   );

Вычисляешь прямо в компоненте, на основании других данных, конкретно в твоем примере это тоже данные из стора (counter1 * counter2)
С точки зрения читабельности кода, всю бизнес логику лучше держать поближе друг к другу, и вычислять items в том месте где ты устанавливаешь counter1 и counter2 а результтат читать при помощи useSelector, поэтому первый вариант предпочтителен
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽