オブジェクトタイプstate、ReduxによるCRUDの実装
最近TOYプロジェクトをやっていて、reduxを使ってオブジェクトタイプのstateを管理する必要があることがあります.この過程で学んだことをポスターに残して整理したいと思います.
私の国
本来はリストタイプでstateを管理していますが、時間の複雑さの観点からも、dickshernerタイプの開発も容易であるため、storeのstateを大幅に変更しました.
だからどんな顔をしているのか.
KeyValue、レンダリングValue
私の州にはclubの情報がたくさんあります.stateのタイプがKey:Valueタイプのオブジェクトでない場合、
Object.entries()
Object.entries:配列形式で[key,value]を返す
Object.keys:keyのみ戻る
Object.values:valuesのみを返します
ただし、readは
アクションの定義
また,各関数のパラメータは直感的に分かりやすいと考えられるので,さらなる説明は必要ない.これでactionが定義され、reduceが定義されて終わります!
create reducer
delete reducer
update reducer
次に、定義したcreate、delete、update reduceをすべて加算します.以下に示します. https://ywtechit.tistory.com/162 https://stackoverflow.com/questions/35404050/redux-how-to-store-and-update-a-key-value-pair https://stackoverflow.com/questions/59897667/delete-key-from-state-redux-reducer
私の国
本来はリストタイプでstateを管理していますが、時間の複雑さの観点からも、dickshernerタイプの開発も容易であるため、storeのstateを大幅に変更しました.
だからどんな顔をしているのか.
clubs: {
clubId : {
clubTitle: '제목',
clubDescription: '내용'
},
clubId : {
clubTitle: '제목',
clubDescription: '내용'
}
}
実はそんなに簡単ではありませんが、説明しやすいように簡単に表示します!stateには各クラブを区分するclubId
があり、クラブ情報を含む対象もある.つまり、clubID
はKey、{clubTitle, clubDescription}
はValueです.KeyValue、レンダリングValue
私の州にはclubの情報がたくさんあります.stateのタイプがKey:Valueタイプのオブジェクトでない場合、
map()
にマッピングして各要素を出力できますが、オブジェクトはより簡単な処理が必要です.Object.entries()
Object.entries:配列形式で[key,value]を返す
Object.keys:keyのみ戻る
Object.values:valuesのみを返します
map()
関数は、オブジェクトをリスト形式で返す必要があるリストに使用できます.したがって、オブジェクト.entriesとして[key,value]を返します.次に返される値をマッピングすると、所望の結果が得られます.{Object.entries(props.clubs).map(([key, value]) => (
<div key={key}>
<h1>{value.clubTitle}</h1>
<h1>{value.clubDescription}</h1>
</div>
))}
CRUDの正式実施ただし、readは
useSelector
を使用すればよいので、create、update、deleteについて説明します.アクションの定義
export const ADD_CLUB = 'ADD_CLUB';
export const DELETE_CLUB = 'DELETE_CLUB';
export const EDIT_CLUB = 'EDIT_CLUB';
let nextId = Math.floor(Math.random() * 10000000);
export const addClub = (clubTitle, clubDescription) => {
return {
type: ADD_CLUB,
clubId: nextId++,
club: {
clubTitle,
clubDescription
}
}
}
export const deleteClub = (clubId) => {
return {
type: DELETE_CLUB,
clubId
}
}
export const editClub = (clubId, clubTitle, clubDescription) => {
return {
type: EDIT_CLUB,
clubId: clubId,
club: {
clubTitle,
clubDescription
}
}
}
addClub
からclubId: nextId++
までの理由は、リフレッシュされていないときに他の値を入力するためです(オブジェクトのKey値をユニークにします).また,各関数のパラメータは直感的に分かりやすいと考えられるので,さらなる説明は必要ない.これでactionが定義され、reduceが定義されて終わります!
create reducer
case ADD_CLUB:
const newData = {};
newData[action.clubId] = action.club;
return Object.assign({}, state, newData);
新しく追加されたclubオブジェクトを作成し、Object.assign()
を使用して元のステータスと新しく追加されたclubオブジェクトをマージします.delete reducer
case DELETE_CLUB:
const deleteState = {...state};
delete deleteState[action.clubId];
return deleteState;
{...state}
で再割り当てを行い、stateに直接削除するのではなく、必要な値を削除します.重要なのはstateを直接操作しないことです!update reducer
case EDIT_CLUB:
const editState = {...state};
editState[action.clubId] = action.club;;
return editState;
updateはdeleteと非常に似た方法を有する.deleteの場合と同様に、{...state}
で再割り当てし、希望するclubIdにアクセスし、新しいclubに更新します.次に、定義したcreate、delete、update reduceをすべて加算します.以下に示します.
import { INITIAL_STATE } from '../store/store'
import { ADD_CLUB, DELETE_CLUB, EDIT_CLUB } from "../actions"
const clubs = (state = INITIAL_STATE, action) => {
switch (action.type) {
case ADD_CLUB:
const newData = {};
newData[action.clubId] = action.club;
return Object.assign({}, state, newData);
case DELETE_CLUB:
const deleteState = {...state};
delete deleteState[action.clubId];
return deleteState;
case EDIT_CLUB:
const editState = {...state};
editState[action.clubId] = action.club;;
return editState;
default:
return state;
}
};
export default clubs;
リファレンスReference
この問題について(オブジェクトタイプstate、ReduxによるCRUDの実装), 我々は、より多くの情報をここで見つけました https://velog.io/@1998yuki0331/오브젝트딕셔너리-타입-Redux로-CRUD-구현하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol