React|ステータス管理:Redux
7734 ワード
Reduxの核心原則
👉 変更を作成するにはdispatchを使用する必要があります.
1. Action
const action1 = {
type: "namespace/getMyData",
payload : {
id: 123
}
};
👉 分割は小さな状態の変更を表し,複数のactionを結合して複合形状を表すのに非常に有用である.2. Action Creator
👉 idを取得してaction objectを作成する
👉 別の形式のlayer(id:String(id))です.slice(1)部分
👉 addObject(id)を超えるとアクション
const addObj = (id) => {
type: 'namespace/getMyData',
payload: {
id: String(id).slice(1)
}
}
3. Store
const store = createStore(reducer, initialState);
4. Reducer
👉 console.log, axios.get()ランプは入るべきではありません.
const Reducer = (state, action) => {
switch (action.type) {
case "namespcae/getMyData":
const obj = {id: action.payload.id}
return {
...state, obj
};
default:
return state;
}
};
5. Dispatch
👉 dispatch(action object) -> middleware -> reducer
function MyApp() {
const dispatch = useDispatch()
return (
<button onClick={
() => dispatch(addObj(1234))
}>Submit</button>
)
}
6. Selector
storeから特定のステータスセグメントを取得する関数
function MyApp() {
const dispatch = useDispatch()
const obj = useSelector(state => state.obj)
return (
<button onClick={
() => dispatch(addObj(1234))
}>Submit</button>
)
}
⚡ flux : action -> dispatch -> reducer -> store -> selector👉 Actionが入るとdispatchはreduceで渡され、reduceはactionタイプに応じて新しいstateを返します.これはstoreに保存され、セレクタを使用して保存されたステータスが使用されます.
Reduxの構造
👉 例はMiddlewareです.
👉 Middlewareは、actionオブジェクトがpromiseを返すかどうかを確認します.
Redux-toolkitの利用
👉 あらかじめredux-devtools、immerjs、redux-thunk、reselectなどのライブラリが含まれています.
1. configureStore
パッケージ
👉 createStoreを使用する場合よりも簡単に作成できます.
const store = configureStore({
reducer : {
posts: postsReducer,
users: usersReducer
}
})
2. createAction
const addPost = createAction('post/addPost')
addPost({title: 'post 1'})
3. createReducer
const postsReducer = createReducer(initState,
builder => {
builder.addCase(addPost, (state, action) => {
state.posts.push(action.payload)
})
}
)
4. createSlice
const postsSlice = createSlice({
name:'posts',
initialState,
reducers: {
addPost(state, action) {
state.postsSlice.push(action.payload)
}
}
})
// 사용
const { addPost } = postsSlice.actions
const reducer = postsSlice.reducer
5. createSelector
const postsSelector = state => state.posts
const userSelector = state => state.user
const postsByUserIdSelector = createSelector(
postsSelector,
userSelector,
(posts, user) => {
posts.filter(post => post.username == user.username)
}
)
ReduxをReactに接続する
1. Provider
function App() {
return (
<Provider store={store}>
<div>소개글입니다.</div>
</Provider>
);
}
2. useDispatch
API
ステータス変更のためにactionオブジェクトを
const dispatch = useDispatch();
<Button onClick={() =>
dispatch(changeTheme(theme === "light" ? "dark" : "light"))
}>
3. useSelector
API
function Header() {
const dispatch = useDispatch();
const theme = useSelector((state) => state.theme);
<Button onClick={() =>
dispatch(changeTheme(theme === "light" ? "dark" : "light"))
}>
Reduxによる非同期処理
👉 このほか、redux-saga、redux-observableなどがあります.
1. createAsyncThunk
使用方法
👉 addPost:async関数の割り当て関数
👉 addPost.pending:承諾の作成時に発生するアクション
👉 addPost.完了:完了時に発生するアクション
👉 addPost.拒否:拒否されたときに発生する動作
const addPost = createAsyncThunk('posts/addPost',
async (title) => {
const result = await PostAPI.addPost({ title })
return result.data
}
)
useEffect(() => {
dispatch(addPost("post 1"))
}, [])
👉 すなわちpending,defected,reduserにそれぞれのケースのreduserを追加することができる.
2.連続非同期処理
Reference
この問題について(React|ステータス管理:Redux), 我々は、より多くの情報をここで見つけました https://velog.io/@combi_jihoon/React-상태관리-Redux3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol