我有四個反應的組分:陣營更新父組件時,孩子變化的背景下
- 的總體父(
App
或類似) - 一個
Header
孩子,通過App
- 一個
Profile
頁 稱爲
- A
LogoutLink
,由Profile
調用
我正在使用Auth0實施用戶驗證/登錄系統。當用戶登錄時(通過Header
中的登錄按鈕),App
將User
對象的Context
更改爲包括從Auth0檢索到的所有數據。這個用戶數據可以被需要它的系統的任何部分訪問。
登錄後,UI會自動更新(使用Context
更改),以便Header
現在顯示「Hey there {name}」而不是「Login」。這也是通向Profile
頁面/組件的鏈接(使用React Router的<Link to="/profile></Link>
元素)。
在Profile
頁面有LogoutLink
。點擊後,會將用戶註銷,並返回主頁。它還應該自動更新UI,將Header
中的消息從「Hey there {name}」更改爲「Login」。這是通過Context
再次更改完成的。但是,此功能實際上不起作用 - 用戶已成功註銷,但要查看上述更改,用戶需要刷新整個頁面。 this.context.user
沒有被更新併發送回Profile
和Header
。我知道這是因爲Redux和它的單向數據流(即數據只能向下,而不是向上),但我需要找到解決方法。
這是基本的代碼,我有:
LogoutLink.js
export default class LogoutLink extends React.Component {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
this.state = {
user: null,
};
}
static propTypes = {
value: React.PropTypes.string,
}
static contextTypes = {
user: React.PropTypes.object,
} // get context so this.context is available to get initial user data (before logout)
static childContextTypes = {
user: React.PropTypes.object,
}
getChildContext() {
return {user: this.state.user}
} // these two are for updating context
componentWillMount() {
this.setState({ user: this.context.user });
} // set the internal LogoutLink state
onClick() {
this.setState({ user: null }); // set the internal user state to null following logout
}
renderLogoutLink() {
const {value} = this.props;
const {user} = this.state;
if (user != null) {
return <Link to="/profile" onClick={this.onClick}>{value}</Link>
} else {
return <span>You're already logged out!</span>
}
}
render() {
return <span>{this.renderLogoutLink()}</span>
}
}
Header.js
:
export default class Header extends React.Component { // eslint-disable-line react/prefer-stateless-function
constructor(props) {
super(props);
this.showLock = this.showLock.bind(this); // lock is the Auth0 module responsible for Login, also passed down by context
}
static contextTypes = {
user: React.PropTypes.object,
lock: React.PropTypes.object,
}
showLock() {
const {lock} = this.context;
lock.show();
}
shouldComponentUpdate(nextProps, nextState, nextContext) {
if (this.context.user == null && nextContext.user != null) {
return true;
} else if (this.context.user != null && nextContext.user == null) {
return true;
}
return false;
} // after the LogoutLink is clicked, this still returns false
renderLoginButton() {
const {user} = this.context;
if (user) {
const name = user.nickname;
return <Link to="/profile">Hey there {name}!</Link>
} else {
return <button onClick={this.showLock}>Login</button>
}
}
render() {
return (
<header>
{this.renderLoginButton()}
</header>
);
}
}
我下面的官方作出反應有關語境和更新它的文檔,發現這裏:https://facebook.github.io/react/docs/context.html
正如我所說我知道爲什麼這不起作用:數據只能以一種方式發送。但我需要找到一種方法來完成這項工作,說實話,我認爲我一直盯着這個太長時間,現在已經沒有選擇,我的大腦有點疲憊。
是什麼nextContext在頭部的值應爲ComponentUpdate。它應該是th e更新了一個 shouldComponentUpdate可能是這裏的罪魁禍首。請檢查nextContext.user –
Hi Piyush - 'nextContext.user'與'this.context.user'等同於'Header'組件'shouldComponentUpdate' - 當'LogoutLink'更改時,它不會改變上下文。 –