我有一個應用代碼
import React from "react";
import { Route, Switch } from "react-router-dom";
import Minidrawer from './components/Drawer/Minidrawer'
import { makeStyles } from '@mui/styles';
import Box from '@mui/material/Box';
import Main from "./components/Main/Main";
import {useSelector} from 'react-redux'
const useStyles = makeStyles({
container: {
display: "flex"
}
});
export default function App() {
const classes = useStyles();
const user = useSelector((state) => state.auth);
return (
<Box sx={{ display: 'flex' }}>
<Minidrawer currUser={user}/>
<Switch>
<Route exact from="/" render={props => <Main childText="home" currUser={user} {...props} />} />
<Route exact path="/auth" render={props => <Main childText="auth" currUser={user} {...props} />} />
<Route exact path="/register-client" render={props => <Main childText="registerClient" currUser={user} {...props} />} />
</Switch>
</Box>
);
}
我必須將currUser傳遞給 App 中匯入的所有子組件,但我不想復制代碼,有什么不同的方法可以實作這一點,以便所有組件都可以訪問currUser?
uj5u.com熱心網友回復:
如果我明白你想做什么,你想將 props 傳遞給組件的所有子組件,如果組件是簡單的組件,你可以這樣做:
import React from "react";
import Main from "./Main";
import PassPropsToNormalComponents from "./PassPropsToNormalComponents";
export default function App() {
const user = {
username: "lakhdar"
};
return (
<div style={{ display: "flex" }}>
<PassPropsToNormalComponents currUser={user}>
<Main childText="home" />
<Main childText="auth" />
<Main childText="registerClient" />
</PassPropsToNormalComponents>
</div>
);
這是 PassPropsToNormalComponents 檔案
import React from "react";
export default function PassPropsToNormalComponents({ children, ...props }) {
const childrenWithProps = React.Children.map(children, (child) => {
if (React.isValidElement(child)) {
return React.cloneElement(child, { ...child.props, ...props });
}
return child;
});
return <>{childrenWithProps}</>;
}
但是在您的情況下,將道具傳遞給路線不會使路線將道具傳遞給它們的渲染組件,因此我們需要在此處執行額外的步驟:
首先是我們向父級提供道具的檔案:
import React from "react";
import { Route, Switch } from "react-router-dom";
import Main from "./Main";
import PassPropsToRouteComponents from "./PassPropsToRouteComponents";
export default function App() {
const user = {
username: "lakhdar"
};
return (
<div style={{ display: "flex" }}>
<Switch>
<PassPropsToRouteComponents currUser={user}>
<Route
exact
from="/"
render={(props) => {
return <Main childText="home" {...props} />;
}}
/>
<Route
exact
path="/auth"
render={(props) => <Main childText="auth" {...props} />}
/>
<Route
exact
path="/register-client"
render={(props) => <Main childText="registerClient" {...props} />}
/>
</PassPropsToRouteComponents>
</Switch>
</div>
);
}
最后,額外的步驟是獲取渲染元素并將其自己的 props 來自父級的 props 傳遞給它,檔案如下所示:
import React from "react";
export default function PassPropsToRouteComponents({ children, ...props }) {
const childrenWithProps = React.Children.map(children, (child) => {
if (React.isValidElement(child)) {
const routerChild = child.props.render();
return React.cloneElement(child, {
...child.props,
render: () => {
return React.cloneElement(routerChild, {
...routerChild.props,
...props
});
}
});
}
return child;
});
return <>{childrenWithProps}</>;
}
鏈接到作業代碼和框:https ://codesandbox.io/s/gracious-meadow-dj53s
我希望這就是你一直在尋找的。
uj5u.com熱心網友回復:
您可以使用 redux 或背景關系 API。
Redux:https : //react-redux.js.org/
背景關系 API:https : //reactjs.org/docs/context.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/333499.html
標籤:javascript 反应 还原
上一篇:如何處理焦點和定義ARIA角色
