reactjs - 登录后如何在上下文中保存用户
问题描述
我正在尝试使用上下文提供程序文件中的函数,以便将当前用户信息保存在上下文中并在组件之间传递
这是我的提供者代码:
class UIContext extends Component {
state = {
userId: "",
userName: ""
}
saveUser = (id, name) => {
this.setState({
userId: id,
userName: name
})
}
render(){
return(
<UserContext.Provider value={{
state: this.state,
saveUser: this.saveUser
}}>
{this.props.children}
</UserContext.Provider>
)
}
}
这是我的登录页面渲染功能代码:
render() {
return (
<UserContext.Consumer>
{({context}) => (
<>
<input className="main_input" onChange={this.onChangeHandlerTz} id="tz" placeholder='ID'/>
<input className="main_input" type="password" onChange={this.onChangeHandlerPass} id="pass" placeholder='Password'/>
<button className="main_btn" id="save" onClick={this.onClickLogin}>login</button>
<button className="main_btn" id="save" onClick={this.onClickRegister}>register</button>
</>)}
</UserContext.Consumer>
)}
我想在这里使用 this.context.saveUser :
onClickLogin = (e) => {
e.preventDefault();
if (this.validate(this.state.id)) {
fetch('/api/v1/login',
{
method: 'POST',
body: JSON.stringify({
id: this.state.id,
password: this.state.pass
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
}
}).then(res => res.json())
.then(data => {
if (data.status === 0) {
this.context.saveUser(this.state.id, this.state.fullName)
} else {
this.setState({loginError: true})
}
}).catch(error => {
// this.setState({loading: false})
this.setState({error: error})
console.log(error)
})
} else {
this.setState({idError:true})
}
};
这是我得到的错误:
TypeError: _this.context.saveUser is not a function
如何在渲染函数之外使用上下文?
解决方案
首先,我认为您可能在这里解构了错误的论点:
<UserContext.Consumer>
{({ context }) => {}}
</UserContext.Consumer>
由于value
您提供给UserContext.Provider
包含的state
and saveUser
,您可能希望将它们拉出而不是context
:
{({ state, saveUser }) => {}}
其次,如果您onClickLogin
在共享方法的同一组件上定义render
,您希望将组件包装在 中,<UserContext.Consumer>
以便整个组件可以访问state
并saveUser
作为道具。像这样的东西:
class LoginPage extends React.Component {
onClickLogin = () => {
console.log(this.props.user.state)
console.log(typeof this.props.user.saveUser)
}
render() {
<button onClick={this.onClickLogin}>Login</button>
}
}
export default props =>
<UserContext.Consumer>
{user => <LoginPage user={user} {...props} />}
</UserContext.Consumer>
推荐阅读
- arrays - Vue 突变变更实例(MyArray 到 Array)
- unix - diff unix 如何在输出中显示源文件的行号
- qt - /usr/lib/x86_64-linux-gnu/libQt5Core.so.5:找不到版本“Qt_5.12”
- r - “iden”列应包含组中每个成员的个人编号
- google-apps-script - Google Docs Scripts:如何从一个文档中复制列表并用它替换另一个文档中的列表?
- java - 如何使用 JAVA 从 Azure 的 Cosmos DB 集合中获取所有文档?
- erlang - 如何在 shell 中使用 rebar3 创建 Erlang 应用程序?
- ios - c文件可以读取Xcode中的本地化字符串吗?
- java - 如何根据系统环境属性更改枚举值
- windows - 在 Windows 机器上构建 docker 映像时出现 chmod CommandNotFoundException