【发布时间】:2019-09-23 11:22:56
【问题描述】:
我正在尝试使用 React 的上下文 api 来管理全局状态。当我尝试调用上下文方法或访问上下文属性时,我收到错误消息“this.context.setUser 函数不存在”或“未定义”。
然而,我已经能够将值硬编码到上下文的状态中并检索硬编码的值。
Feed 上下文
import React, { Component } from 'react'
const FeedContext = React.createContext({
Feed: [],
user: '',
error: null,
setError: () => {},
clearError: () => {},
setFeed: () => {},
setUser: () => {}
})
export default FeedContext
export class FeedProvider extends Component {
state = {
feed: [],
error: null,
user: ''
};
setUser = user => {
this.setState({ user })
}
setFeed = Feed => {
this.setState({ Feed })
}
setError = error => {
console.error()
this.setState({ error })
}
clearError = () => {
console.log('context is accessed')
this.setState({ error: null })
}
render() {
const value = {
feed: this.state.feed,
error: this.state.error,
setError: this.setError,
clearError: this.clearError,
setFeed: this.setFeed,
setUser: this.setUser
}
return (
<FeedContext.Provider value={value}>
{this.props.children}
</FeedContext.Provider>
)
}
}
AccountPanel.js
import React from 'react';
import FeedContext from "../../contexts/FeedContext";
// functional component
class AccountPanel extends React.Component {
static contextType = FeedContext
renderUserInfo(){
const { user = [] } = this.context;
//this returns "undefined"
console.log(user.user)
//this returns "user.setUser() is not a function"
user.setUser('newUser')
//this returns ' '
this.context.setUser('y')
console.log(user)
}
render(){
return (
<section>
{ this.renderUserInfo() }
AccountPanel
</section>
)
}
}
export default AccountPanel;
我希望能够通过 this.context.setUser('newUser) 更新上下文状态/用户,然后在我的导航栏组件中使用该值
【问题讨论】:
-
我最好的猜测是
AccountPanel是 not 由上下文提供程序包装的。你能分享一下呈现AccountPanel和提供者的代码吗? -
另一个猜测是静态属性没有正确编译。你能检查一下你的
.babelrc插件中有@babel/plugin-proposal-class-properties吗? -
@Matthieu Account panel.js(第二个 sn-pt)并且提供者是从 sn-pt 底部的 FeedContext 中返回的。这段代码实际上来自我正在学习的一门课程,我正在尝试实现他们使用的模式。但这不是我通常看到的实现方式。
-
我的意思是你的应用程序的某些部分应该
import { FeedProvider }并使用它。AccountPanel应位于应用层次结构中的FeedProvider之下。 -
当我们这样做时:上下文提供者的值似乎缺少
user: this.state.user,。
标签: reactjs state react-context