[英]ReactJS: Pass sibling component data into conditional components
我有一個如下截圖的目錄結構。
從LoginComponent
登錄時,我想將登錄數據傳遞給UserProfileComponent
,如果未登錄,則默認情況下將加載DefaultCompoent
。
為此,我管理了以下組件。
LandingComponent.js
export default function LandingComponent(props) {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [userName, setUserName] = useState('')
useEffect(() => {
setIsLoggedIn(true)
});
return (
<main>
{
isLoggedIn ? <UserProfileComponent setUserName={setUserName} /> : <DefaultComponent userName={userName} />
}
</main>
)
}
DefaultComponent.js
export default function DefaultComponent(props) {
return (
<p>Hello User</p>
)
}
用戶配置文件組件.js
export default function UserProfileComponent(props) {
return (
<p>Hello {userName}</p>
)
}
登錄組件.js
export default function LoginComponent(props) {
const [email, setEmail] = useState("");
const [userPassword, setPassword] = useState("");
const loginUser = async event => {
event.preventDefault()
axios.post(`{api_endpoint}/login`, data)
.then((response) => {
const userDetails = response.data
})
})
return (
<form onSubmit={loginUser}>
<input
value={email}
type="email"
onChange={(e) => setEmail(e.target.value)}
/>
<input
value={userPassword}
onChange={(e) => setPassword(e.target.value)}
type="password"
id="password"
placeholder="Password"
required
/>
<div className="col-2">
<input type="submit" name="" value="Login" />
</div>
</form>
)
}
那么,如何使用鈎子將 login_api 響應數據從這個LoginComponent
給UserProfileComponent
?
使用上下文 api :
創建和導出上下文:
export const AuthContext = React.createContext();
添加一個新的 state 並將組件包裝到pages/index.js中的上下文提供程序中:
export default function Home() { const [userData, setUserData] = React.useState(null); return ( <React.Fragment> <Head> <title>Sample App</title> </Head> <AuthContext.Provider value={{ userData, setUserData }}> <HeaderComponent /> <LandingComponent /> </AuthContext.Provider> </React.Fragment> ); }
訪問和更新LoginComponent
中的上下文:
export default function LoginComponent(props) { const [email, setEmail] = useState(""); const [userPassword, setPassword] = useState(""); const { setUserData } = React.useContext(AuthContext); const loginUser = async event => { event.preventDefault(); axios.post(`{api_endpoint}/login`, data).then(response => { // Update the context variable setUserData(response.data); }); }; return <div />; }
訪問UserProfileComponent
中的上下文:
export default function UserProfileComponent(props) { const { userData } = React.useContext(AuthContext); if (.userData) { return "Loading..;"; } // do something with userData return <p>Hello {userName}</p>; }
如您所見,您可以使用useContext掛鈎來訪問這些值。 另一種方法是將相應的組件包裝在<AuthProvider.Consumer />
標記中。
編輯:
我更新了答案並將上下文移至Home組件。
你可以通過2種方法解決這個問題
方法一:
創建一個新組件,例如:Parent.js
export default function Parent() {
//Maintain State here
const [isLoggedIn, setIsLoggedIn] = useState(false);
return (
<main>
{/*Pass your state to childs as prop*/}
<ChildComponent1 isLoggedIn={isLoggedIn} />
<ChildComponent2 isLoggedIn={isLoggedIn} />
</main>
);
}
方法二:
State 使用 React Context 管理 API 或 Redux
對於React Context
檢查本教程: https://youtu.be/35lXWvCuM8o
對於Redux
請查看本教程: https://youtu.be/CVpUuw9XSjY
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.