Прежде всего, я благодарю @tudor за его усилия. Все его слова верны.
Но я хочу показать, что Реселект работает.
СЦЕНАРИЙ 1 - НЕ ПАМЯТИ
import React, { memo } from "react";
import { useSelector, useDispatch } from "react-redux";
// import { catsDataMemo, dogsDataMemo } from "./selectors";
// Components
const Dogs = memo(({ dogsData }) => {
console.log("Dogs rendering..");
return <h1>{dogsData}</h1>;
});
const Cats = memo(({ catsData }) => {
console.log("Cats rendering..");
return <h1>{catsData}</h1>;
});
function ReduxDeneme() {
// Standart useSelector without MEMOIZED
const dogsData = useSelector(
state => state.pets.dogs,
console.log("dogsData Selector çalıştı.")
);
const catsData = useSelector(
state => state.pets.cats,
console.log("catsData Selector çalıştı.")
);
// Actions
const dispatch = useDispatch();
const changeDogs = () => dispatch({ type: "CHANGE_DOGS" });
const changeCats = () => dispatch({ type: "CHANGE_CATS" });
const noChangeCats = () =>
dispatch({ type: "NO_CHANGE_CATS", payload: catsData });
return (
<div>
<Dogs dogsData={dogsData} />
<Cats catsData={catsData} />
<button onClick={changeDogs}>Change Dogs</button>
<button onClick={changeCats}>Change CATS</button>
<button onClick={noChangeCats}>No Change</button>
</div>
);
}
export default memo(ReduxDeneme);
Будьте осторожны! Когда вы нажимаете кнопку " Change Dogs ", в консоли выводится:
dogsData Selector çalıştı.
catsData Selector çalıştı.
Dogs rendering..
или когда вы нажимаете " Кнопка Change Cats", на выходе будет:
dogsData Selector çalıştı.
catsData Selector çalıştı.
Cats rendering..
. Независимо от того, какую кнопку вы нажмете, оба из useSelectors будут работать, как вы можете видеть из console.log
SCENARIO 2 - MEMOIZED С ПОМОЩЬЮ СРЕДНЕГО ОБЕСПЕЧЕНИЯ
Во-первых, мы выделяем запомненные селекторы для другого файла, как упоминалось @ tudor.gergely.
БУДЬТЕ ОСТОРОЖНЫ! Вы должны определить правильный путь к объекту.
// selectors.js
import { createSelector } from "reselect";
export const dogsDataMemo = createSelector(
state => state.pets.dogs, // BE CAREFULL while defining..
dogs => {
console.log("DogsDataMemo has worked.");
return dogs;
}
);
export const catsDataMemo = createSelector(
state => state.pets.cats, // BE CAREFULL while defining..
cats => {
console.log("CatsDataMemo has worked.");
return cats;
}
);
Затем мы импортируем этот файл в основной файл. js и снова используем useSelector с нашими запомненными селекторами:
import React, { memo } from "react";
import { useSelector, useDispatch } from "react-redux";
import { catsDataMemo, dogsDataMemo } from "./selectors";
// Components
const Dogs = memo(({ dogsData }) => {
console.log("Dogs rendering..");
return <h1>{dogsData}</h1>;
});
const Cats = memo(({ catsData }) => {
console.log("Cats rendering..");
return <h1>{catsData}</h1>;
});
function ReduxDeneme() {
const dogsData = useSelector(dogsDataMemo);
const catsData = useSelector(catsDataMemo);
// Actions
const dispatch = useDispatch();
const changeDogs = () => dispatch({ type: "CHANGE_DOGS" });
const changeCats = () => dispatch({ type: "CHANGE_CATS" });
const noChangeCats = () =>
dispatch({ type: "NO_CHANGE_CATS", payload: catsData });
return (
<div>
<Dogs dogsData={dogsData} />
<Cats catsData={catsData} />
<button onClick={changeDogs}>Change Dogs</button>
<button onClick={changeCats}>Change CATS</button>
<button onClick={noChangeCats}>No Change</button>
</div>
);
}
export default memo(ReduxDeneme);
и окончательный результат:
- При нажатии кнопки «Изменить собак»:
DogsDataMemo has worked.
Dogs rendering
- При нажатии кнопки «Изменить кошек»:
CatsDataMemo has worked.
Cats rendering..