reactjs - 增强调度导致身份不稳定
问题描述
我正在像这样增强 Context 的调度功能:
const augmentDispatch = (
dispatch: React.Dispatch<Action | ApiAction>,
state: AppState,
) => (action: Thunk | Action | ApiAction) => {
if (typeof action === "object" && action.type === CALL_API) {
return callApi(action as ApiAction, dispatch);
}
return action instanceof Function
? action(dispatch, state)
: dispatch(action as Action);
};
它允许我为某些操作触发 API 调用。然后我像这样使用它:
export function App(): JSX.Element {
const [state, dispatch] = useReducer(rootReducer, defaultState);
const augmentedDispatch = augmentDispatch(dispatch, state);
return (
<GlobalContext.Provider
value={{ state, dispatch: augmentedDispatch }}
>
这对事件处理程序很有用,但是当我尝试在以下位置使用它时遇到了无限重新渲染useEffect
:
export const EditForm: React.FC = () => {
const { dispatch, state } = useContext(GlobalContext);
const dispatchLoadDetails = useCallback(
() => dispatch(loadDetails()),
[dispatch],
);
useEffect(() => {
dispatchLoadDetails();
}, [dispatchLoadDetails]);
return (
<Form
我似乎已经通过捕获对增强调度的引用来解决它:
export function App(): JSX.Element {
const [state, dispatch] = useReducer(rootReducer, defaultState);
/**
* Note the usage of useRef here - without it we'd generate a new reference to
* augmentedDispatch with every call within useEffect, which would cause an
* indfinite re-render
*/
const augmentedDispatch = useRef(augmentDispatch(dispatch, state));
return (
<GlobalContext.Provider
value={{ state, dispatch: augmentedDispatch.current }}
>
这是解决这个问题的最好方法吗?文档表明useRef
应该作为最后的手段使用......
解决方案
推荐阅读
- npm - 使用 NPM 安装后无法在我的 main.js 文件中使用 Axios
- html - HTML/CSS 边框随着溢出而增长
- wordpress - 无需用户登录和权限回调的 WP REST API creting 和端点
- flutter - Flutter 图像悬停叠加效果
- sql-server - 在mac上访问数据库备份文件?(.bak)
- php - Input Data Based on Another Input - Laravel
- mongodb - MongoDB: Aggregate query to sum duration field
- xml - powershell write xml with no escaping
- asp.net-mvc - ASP.NET 3.1 MVC: Displaying UserIdentity details in View() when clicking their names on the website
- java - Tapestry 中通用链接的 JUnit 测试