英文:
Should I mix variable and constant data inside a react state?
问题
I have some data that will be defined inside my code (without fetching) and won't change during the lifecycle of my app. Let's say that this data is a list of objects representing streets
, that have properties such as name
, size
etc that are permanent.
But related to each street
there are, for example, number of houses
inside it, and it might change.
Is it better to use number of houses
as a property and keep the entire streets
list inside the app state, or have only a list of number of houses
in the app state and associate them with streets
based on indexes/keys?
Sorry, I couldn't figure out a better generical example. Thanks
英文:
I'm trying to think about the data structure of my app and came into an interesting question:
I have some data that will be defined inside my code (without fetching) and won't change during the lifecycle of my app. Let's say that this data is a list of objects representing streets
, that have properties such as name
, size
etc that are permanent.
But related to each street
there are, for example, number of houses
inside it, and it might change.
Is it better to use number of houses
as a property and keep the entire streets
list inside the app state, or have only a list of number of houses
in the app state and associate them with streets
based on indexes/keys?
Sorry, I couldn't figure out a better generical example. Thanks
答案1
得分: 1
我认为对于您的情况,最佳方法是使用**useReducer钩子,它非常适用于数组/对象格式的状态。因此,对于streets
常量,您可以将其声明在一个单独的文件中(例如 consts.js),以便在需要时在多个组件中重用,然后将其导入到您想要处理房屋数量**的组件中:
import { STREETS } from "consts";
const Actions = {
ADD_HOUSE: 'ADD_HOUSE',
REMOVE_HOUSE: 'REMOVE_HOUSE',
UPDATE_HOUSES: 'UPDATE_HOUSES',
RESET: 'RESET'
};
const initialState = {
streets: STREETS
}
function reducer(state, {type, payload}) {
switch(type){
case Actions.ADD_HOUSE:{
//您的逻辑
}
//其他情况...
}
}
function YourComponent() {
const [{ streets }, dispatch] = useReducer(reducer, initialState);
//其他代码...
}
注意:最好将 reducer 逻辑与您的组件分开,您可以使用另一个文件,例如reducer.js,然后导出Actions、initialState 和 reducer 函数。
英文:
I think the best approach for your case is to use useReducer hook which is efficient for states in format of Array/Object. So for the streets constant you can declare it in a separate file (consts.js for example) so you can reuse it in multiple components if needed then import it to your component where you want to handle the number of houses:
import { STREETS } from "consts";
const Actions = {
ADD_HOUSE: 'ADD_HOUSE',
REMOVE_HOUSE: 'REMOVE_HOUSE',
UPDATE_HOUSES: 'UPDATE_HOUSES'
RESET: 'RESET'
};
const initialState = {
streets: STREETS
}
function reducer(state, {type, payload}) {
switch(type){
case Actions.ADD_HOUSE:{
//You logic
}
...
}
}
function YourComponent() {
const [{ streets }, dispatch] = useReducer(reducer, initialState);
...
}
NOTE: It's better to separate the reducer logic from your component you can use another file called reducer.js for example then export Actions, initialState, reducer func.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论