reactjs - 如何通过 Reactjs ContextAPI 传递函数以将状态从一个组件更改为另一个组件
问题描述
我需要与其他几个人共享组件的状态,我相信执行此功能的最简单方法之一是使用 React 的 context api。
包含要操作的状态的组件是警报,遵循以下代码:
import React, { useState, createContext } from 'react';
import { Snackbar } from '@material-ui/core/';
import MuiAlert, { AlertProps } from '@material-ui/lab/Alert';
function Alert(props: AlertProps) {
return <MuiAlert elevation={6} variant="filled" {...props} />;
}
type PropsAlertContext = {
alertOpen: boolean;
setAlertOpen: React.Dispatch<React.SetStateAction<boolean>>;
};
const DEFAULT_VALUE = {
alertOpen: false,
setAlertOpen: () => {},
};
const AlertContext = createContext<PropsAlertContext>(DEFAULT_VALUE);
const AlertContextProvider: React.FC = ({ children }) => {
const [alertOpen, setAlertOpen] = useState(false);
const handleAlertClose = (event?: React.SyntheticEvent, reason?: string) => {
if (reason === 'clickaway') {
return;
}
setAlertOpen(false);
};
return (
<AlertContext.Provider
value={{
alertOpen,
setAlertOpen,
}}
>
<Snackbar
open={alertOpen}
autoHideDuration={6000}
onClose={handleAlertClose}
>
<Alert onClose={handleAlertClose} severity="error">
{children}
</Alert>
</Snackbar>
</AlertContext.Provider>
);
};
export { AlertContextProvider };
export default AlertContext;
以及可以访问在 Alert 中创建的上下文的任何其他组件的代码:
import React, { useContext, useCallback } from 'react';
import AlertContext from '../../hooks/Alert';
const OtherComponent: React.FC = () => {
const { alertOpen, setAlertOpen } = useContext(AlertContext);
const alert = useCallback(() => {
setAlertOpen(true);
console.log(alertOpen);
// Here return false..
}, [alertOpen, setAlertOpen]);
return (
<div>
<button onClick={alert} type="button">
alert
</button>
</div>
);
};
export default OtherComponent;
发生的情况如下:我可以通过“otherComponent”访问 alertOpen 内容,但是,我无法使用 setAlertOpen 更改状态。
解决方案
推荐阅读
- reactjs - 从 dispatch 中确定返回值的类型
- android - CompositeDisposable.clear() 不会停止 Observable 的执行
- microsoft-graph-api - Microsoft Graph API 在 calendarView 上使用 nextLink 导致 ErrorAccessDenied
- r - 如何从 R 中未定义和未知的点空间序列制作 SpatialLines 对象?
- wpf - Showing loading animation while dgv loads
- r - 如何在 R 中创建 R 降价文件列表?
- javascript - Firebase Auth:无法删除从 currentUser.delete() 返回的 Promise 中的 Firestore 文档
- pandas - toPandas csv 之后 pyspark 数据框中的问题
- angular - 找不到模块“@schematics/angular/utility/project”的声明文件
- oracle - TOP with index variable oracle