reduxのstateから取り出した値はコンポーネントで変更してはならない
現象
ComponentAでstate.datas
を使用しているとき、
ComponentBの中でstate.datas
の値(または配列)を操作すると、ComponentAが正しくレンダリングされない。
対処法
Object.assign
でstate.datas
をコピーする。
state.datas
は別のコンポーネントでも使用している。
そういった場合、下記のようにコンポーネント内でstate.datas
を操作すると、state.datas
を使用している別コンポーネントのレンダリングが正しく行われない。
(そもそも、state
の値の変更はreducer
のみが行うため、コンポーネント内で操作することが間違っている)
import React from 'react'; import { useSelector } from 'react-redux'; const ComponentB = () => { const datas = useSelector((state) => state.datas); const reverseDatas = datas.reverse(); return ( <> {reverseDatas.map(data => { // レンダリング })} </> ); }; export default ComponentB;
コンポーネント内でstate
の値を操作したいときは事前にObject.assign
でコピーする
import React from 'react'; import { useSelector } from 'react-redux'; const ComponentB = () => { const datas = Object.assign([], useSelector((state) => state.datas)); const reverseDatas = datas.reverse(); return ( <> {reverseDatas.map(data => { // レンダリング })} </> ); }; export default ComponentB;
redux
にはvuex
におけるgetters
みたいな概念がなさそうなので、
state
から条件に合ったデータの抽出とか書く場所に悩む。