kac*_*e91 8 javascript authentication reactjs react-context
我正在尝试使用新的React上下文来保存有关已登录用户的数据.
为此,我在一个名为的文件中创建一个上下文 LoggedUserContext.js:
import React from 'react';
export const LoggedUserContext = React.createContext(
);
Run Code Online (Sandbox Code Playgroud)
当然,现在我可以使用消费者访问其他组件中的所述上下文,就像我在这里所做的那样:
<LoggedUserContext.Consumer>
{user => (
(LoggedUserContext.name) ? LoggedUserContext.name : 'Choose a user or create one';
)}
</LoggedUserContext.Consumer>
Run Code Online (Sandbox Code Playgroud)
但显然,为了使这个系统有用,我需要在登录后修改我的上下文,这样它就可以保存用户的数据.我正在使用axios调用REST API,我需要将检索到的数据分配给我的上下文:
axios.get(`${SERVER_URL}/users/${this.state.id}`).then(response => { /*What should I do here?*/});
Run Code Online (Sandbox Code Playgroud)
我认为在React的文档中没有办法做到这一点,但他们甚至提到保存登录用户的信息是他们为上下文考虑的用例之一:
Context旨在共享可被视为React组件树的"全局"数据,例如当前经过身份验证的用户,主题或首选语言.例如,在下面的代码中,我们手动穿过"主题"道具来设置Button组件的样式:
那我该怎么办呢?
Shu*_*tri 13
为了使用Context,您需要一个Provider取值,该值可以来自组件的状态并进行更新
例如
class App extends React.Component {
state = {
isAuth: false;
}
componentDidMount() {
APIcall().then((res) => { this.setState({isAuth: res}) // update isAuth })
}
render() {
<LoggedUserContext.Provider value={this.state.isAuth}>
<Child />
</LoggedUserContext.Provider>
}
}
Run Code Online (Sandbox Code Playgroud)
关于动态上下文的部分解释了它
将您的消费组件包装在提供程序组件中:
import React from 'react';
const SERVER_URL = 'http://some_url.com';
const LoggedUserContext = React.createContext();
class App extends React.Component {
state = {
user: null,
id: 123
}
componentDidMount() {
axios.get(`${SERVER_URL}/users/${this.state.id}`).then(response => {
const user = response.data.user; // I can only guess here
this.setState({user});
});
}
render() {
return (
<LoggedUserContext.Provider value={this.state.user}>
<LoggedUserContext.Consumer>
{user => (
(user.name) ? user.name : 'Choose a user or create one';
)}
</LoggedUserContext.Consumer>
</LoggedUserContext.Provider>
);
}
}
Run Code Online (Sandbox Code Playgroud)
我给出了一个完整的例子,使其更加清晰(未经测试)。有关更好的组件组合的示例,请参阅文档。
| 归档时间: |
|
| 查看次数: |
10343 次 |
| 最近记录: |