【发布时间】:2018-08-03 12:19:38
【问题描述】:
我正在尝试使用新的 ReactJs Context 作为 Redux 的替代品,但是我收到了一个错误。
Invariant Violation:元素类型无效:预期为字符串(对于内置组件)或类/函数(对于复合组件),但得到:对象。
https://reactjs.org/docs/context.html
这是我在 MyProvider 标记中包装的布局代码
import React, { Component } from "react";
import { NavMenu } from "./NavMenu";
import { MyProvider } from "../contexts/context";
export class Layout extends Component {
render() {
return (
<MyProvider>
<div className="container-fluid">
<div className="row">
<div className="col-sm-3">
<NavMenu />
</div>
<div className="col-sm-9">
{this.props.children}
</div>
</div>
</div>
</MyProvider>
);
}
}
这是我要导入的上下文代码
import React, { Component } from "react";
export const MyContext = React.createContext();
export class MyProvider extends Component {
state = {
name: 'test name'
}
render() {
return (
<MyContext.Provider value="{this.state}">
{this.props.children}
</MyContext.Provider>
)
}
}
这里是提供者被消费的地方
import React, { Component } from "react";
import { RouteComponentProps } from "react-router";
import { MyProvider } from "../contexts/context";
export class Counter extends Component {
render() {
return <div className="m-2">
<MyContext.Consumer>
{(c) => (<p>My name is {c.state.name}</p>)}
</MyContext.Consumer>
</div>;
}
}
任何帮助将不胜感激。
【问题讨论】:
-
NavMenu是否导出正确?能否请您显示它的代码? -
您没有在任何地方使用
MyProvider.Consumer。MyProvider是React.createContext()的输出,所以它本身不是一个有效的 React 元素 -
对不起,我在某处使用了 MyProvider.Consumer,只是没有添加它以缩短问题,我会修改
-
@LucaFabbri
MyProvider是反应组件。这里的命名真的很混乱。MyContext是React.createContext()的输出。 @user3284707 你应该解决这个问题。 -
很遗憾,我目前无法测试这个,但我会更新
标签: javascript reactjs react-context