Redux Toolkitの値を表示する
stateとして持っている値を表示する
FlutterのRiverpodを使ってる人の感覚だと、なかなか馴染めないが、Reduxと呼ばれてる状態管理ライブラリを使うときに、値を表示するだけやってみたかったが、どうしたらいいものかと思った。useState
だったらすぐわかるのだが、Reduxは難しいと思った。
クラスで書いてないしな。でも仕組みはなんとなくわかった。state
には、初期値があって、それを操作することができる。状態管理してくれるもの。試しにダミーの値を入れたものを表示するのをやってみた。
Storeを作成
アプリケーションの全ての場所から、アクセスすることができるStoreを作成する。1アプリケーション、1ストアらしい。1ファイル作ったら、もう1個作ることはない。このファイルに追加していく。
import { configureStore } from '@reduxjs/toolkit';
export const store = configureStore({
reducer: {},
});
全てのコンポーネントへアクセスできるように、Providerを作成する。FlutterでもProviderなるものを使って、他のクラスにアクセスして、値を参照するのをやったりするので、仕組みは同じですね。どこからでも呼べる。Appコンポーネントを囲んであげるだけで、どこからでもStoreへアクセスすることができるようになる。
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import './index.css'
import { store } from './redux/store/store'
import { Provider } from 'react-redux'
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
)
Reduxで状態を管理するときは、RiverpodのNotifierのようなもので、Sliceと呼ばれているものがある。TypeScrpit使ってるので、Stateには、データ型が必要だった。果物の絵文字と名前を連想配列で、初期値として、格納して表示するだけですが、これだけ難しかったですね😅
import { createSlice } from '@reduxjs/toolkit'
// data type
export interface Fruit {
emoji: string;
name: string;
}
// state
export interface FruitsState {
fruits: Fruit[];
}
// initial state
const initialState: FruitsState = {
fruits: [
{ emoji: '🍎', name: 'Apple' },
{ emoji: '🍊', name: 'Orange' },
{ emoji: '🍇', name: 'Grape' },
{ emoji: '🍌', name: 'Banana' },
{ emoji: '🍑', name: 'Peach' },
{ emoji: '🍍', name: 'Pineapple' },
{ emoji: '🥭', name: 'Mango' },
{ emoji: '🍓', name: 'Strawberry' },
{ emoji: '🍉', name: 'Watermelon' },
{ emoji: '🍒', name: 'Cherry' },
{ emoji: '🥝', name: 'Kiwi' },
{ emoji: '🍅', name: 'Tomato' },
{ emoji: '🥑', name: 'Avocado' },
],
};
export const fruitsSlice = createSlice({
name: 'fruits',
initialState,
reducers: {
},
});
export default fruitsSlice.reducer;
- initialStateには、初期値が入ります。
- reducersには、ロジックを書きます。今回はなし。
UIで表示するには、useSelector
と呼ばれているものを使います。引数に、RootState
を指定します。state.
と書くと、Storeの、オブジェクト内のkeyで指定している場所から、参照することができます。
import { useSelector } from "react-redux"
import { RootState } from "../../store/store"
export const Fruits = () => {
const fruits = useSelector((state: RootState) => state.fruits)
return (
<div>
{fruits.fruits.map((fruit, index) => (
<div key={index}>
{fruit.emoji} {fruit.name}
</div>
))}
</div>
)
}
export default Fruits
App.tsx
でコンポーネントを読み込むと、UIに、フルーツをブラウザに表示できると思われます。
import Fruits from "./redux/features/fruits/Fruits";
function App() {
return (
<div className="App">
<Fruits />
</div>
);
}
export default App;
こんな感じですね
感想
値を表示するだけも多くコードを書くから、難しいと感じますが、他のコンポーネントでも状態を共有できるので、便利なパッケージだと思いました。
Discussion