gpt4 book ai didi

javascript - 使用Reducer React 方法

转载 作者:行者123 更新时间:2023-11-29 18:38:50 34 4
gpt4 key购买 nike

我正在玩 useReducer react 的 api,想知道理论(文档)部分和我实现的部分之间的区别。

带有 useReducer 钩子(Hook)的组件的初始状态:

const [fields, dispatch] = React.useReducer(formReducer, {
firstName: { value: '', isValid: false },
lastName: { value: '', isValid: false },
});

理论变体

 const formActionTypes = {
firstName: 'FIRST_NAME',
lastName: 'LAST_NAME',
};
....
function formReducer(state, action) {
switch (action.type) {
case formActionTypes.firstName:
return { ...state, firstName: { ...action.payload } };
case formActionTypes.lastName:
return { ...state, lastName: { ...action.payload } };
default:
return state;
}
}
....
dispatch({
type: formActionTypes[name], //name is input name
payload: { value, isValid } //value is e.target.value
});

我的暗示

function formReducer(state, action) {
return { ...state, [action.name]: { ...action.payload } };
}
....
dispatch({
name, //name is input name
payload: { value, isValid } //value is e.target.value
});

最佳答案

如果您要求的话,您展示的两个 reducer 都可以工作并产生相同的结果。我认为你从文档中获得的理论版本是为了展示一个特定的概念,但是,你的 reducer 可以说违反了(虽然这没什么大不了的;我们的工作是制作工作代码,而不是通过一些纯度测试!)。

具体来说,您通常希望在某种程度上解耦操作与状态。该操作不应该只是状态数据结构的镜像;如果你想要这种耦合,你也可以使用 useState 并直接设置状态。 reducer 旨在通过对操作的描述进行建模来解决这个问题,然后只有 reducer 决定该操作如何作用于状态。例如,您可能决定添加一个清除表单按钮。使用您当前的模式,您必须分派(dispatch)两个操作,这将导致两个状态更新,因为您的操作与状态密切相关。 switch 语句模式允许您根据不同类型的操作轻松应用不同类型的逻辑。

没有错误的答案,只有不同的方法各有所长。这是我认为通过让 reducer 逻辑负责了解字段是否有效来引入更好的解耦的方法:

const SET_FIRST_NAME = Symbol();
const SET_LAST_NAME = Symbol();
const CLEAR_FORM = Symbol();

// Call action creators instead, like: dispatch(setFirstName(e.target.value));
const setFirstName = name => { type: SET_FIRST_NAME, value: name };
const setLastName = name => { type: SET_LAST_NAME, value: name };
const clearForm = () => { type: CLEAR_FORM };

const initialState = {
firstName: { value: '', isValid: false },
lastName: { value: '', isValid: false }
};

const notEmpty = value => !!(value && value.trim().length);

const validateFirstName = notEmpty; // Or replace with different logic
const validateLastName = notEmpty;

const reducer = (state, action) => {
switch (action.type) {
case SET_FIRST_NAME:
return {
...state,
firstName: {
value: action.value,
isValid: validateFirstName(value)
}
}
case SET_LAST_NAME:
return {
...state,
lastName: {
value: action.value,
isValid: validateLastName(value)
}
}
case CLEAR_FORM:
return initialState;
default:
return state;
}
};

关于javascript - 使用Reducer React 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58662592/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com