[英]localStorage value doesn't get updated automatically
我有一個簡單的React App。 我定義了幾個路由,其中之一是Login。 用戶成功登錄“登錄”組件后,我想在頂部菜單中顯示其用戶名。 我正在使用localStorage來存儲值,並且我希望它會在值更改時自動更新。 但是,我需要刷新頁面才能看到更改。 我想念什么?
這是主要App組件的代碼:
import React, { Component } from 'react';
import {
BrowserRouter as Router,
Route,
Link,
Redirect
} from 'react-router-dom';
import Login from './Login.js'
import Register from './Register.js'
import About from './About.js'
class App extends Component {
render() {
return (
<Router>
<div className="topMenu">
<Link to="/">Login</Link>
<span> </span>
<Link to="/register">Register</Link>
<span> </span>
<Link to="/about">About</Link>
<span> </span>
<span>Logged in user: {localStorage.getItem("username")}</span>
</div>
<div className="container">
<Route exact path="/" component={Login}/>
<Route path="/register" component={Register}/>
<Route path="/about" component={About}/>
</div>
</Router>
);
}
}
export default App;
在login()方法的Login組件中,我只是將用戶名添加到localStorage中:
localStorage.setItem("username", username);
更新App組件中的顯示值是否足夠?
您可以使用Context API,並以應用程序狀態存儲本地存儲中的所有數據,因此,無論何時更新本地存儲,請確保更新應用程序的狀態,React將檢測到應用程序狀態的變化並觸發render
生命周期。
請參閱此處有關如何使用Context API
文檔,該文檔非常易於實現,也可以與localstorage
一起使用,您可以使用此包ngx-webstorage
更多信息,請參見https://www.npmjs.com/package/ngx-webstorage
一種實現方式是在應用程序組件狀態下存儲用戶名,並在應用程序組件中創建一個函數,該功能更新狀態下的用戶名並將該函數作為回調傳遞給登錄組件。 登錄成功后,登錄頁面將調用此函數並更新應用程序組件中的用戶名。 由於狀態已更改,因此將使用新狀態(更新的用戶名)再次呈現應用程序組件。
import React, { Component } from 'react'; import { BrowserRouter as Router, Route, Link, Redirect } from 'react-router-dom'; import Login from './Login.js' import Register from './Register.js' import About from './About.js' class App extends Component { state = { username: "" }; updateUsername = () => { const username = localStorage.getItem("username"); this.setState({ username: username }); }; render() { return ( <Router> <div className="topMenu"> <Link to="/">Login</Link> <span> </span> <Link to="/register">Register</Link> <span> </span> <Link to="/about">About</Link> <span> </span> <span>Logged in user: {localStorage.getItem("username")}</span> </div> <div className="container"> <Route path="/login" render={props => <Login {...props} updateUsername={updateUsername} />} /> <Route path="/register" component={Register}/> <Route path="/about" component={About}/> </div> </Router> ); } } export default App;
現在, updateUsername
函數應該可以通過this.props.updateUsername
在登錄組件中使用。 登錄成功后,可以調用此函數以更新應用程序組件中的狀態。
當狀態或屬性值更改時,React重新渲染。 您需要將從localStorage獲得的值存儲到App組件中的狀態。
由於這看起來像一個應用程序,需要在許多組件之間共享數據,而這些組件不一定是父子關系,因此使用Redux可能是個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.