使用 ReactJS 新上下文时 React-router-V4 呈现错误 API
React-router-V4 render error when using ReactJS new context API
我正在尝试将 React Router V4 与新的 React 上下文一起使用 API。这是我的代码:
class App extends Component {
static propTypes = {
router: PropTypes.func.isRequired,
module: PropTypes.string.isRequired,
sideMenuConfig: PropTypes.string
};
render() {
let baseName = "/" + this.props.module;
// This will get my dashboard component, loading context from database
let navComponent = (
<MyCustomAppContextProvider>
<AppContext.Consumer>
{context =>
<Dashboard
context={context}
module={this.props.module}
router={router}
sideMenuConfig={this.props.sideMenuConfig}
/>
}
</AppContext.Consumer>
</MyCustomAppContextProvider>
);
let routes = null;
if (!isAuthenticated()) {
routes = <Auth
baseName={baseName}
/>;
} else {
routes = (
<Switch>
<Route exact path="/logout" component={Logout} />
<Route exact path="/auth" component={Logout} />
<Route exact path="/" component={navComponent} />
<Route
exact
path="/:screen"
component={navComponent}
/>
<Route
exact
path="/:screen/:action"
component={navComponent}
/>
<Route
exact
path="/:screen/:action/:id"
component={navComponent}
/>
<Route component={PageNotFoundError} />
</Switch>
);
}
return (
<BrowserRouter basename={baseName}>
{routes}
</BrowserRouter>
);
}
}
export default App;
router
包含一个路由器功能,它将根据导航路径加载我的屏幕。
module
是模块名称。
sideMenuConfig
是我侧边菜单的 json 配置。
尝试 运行 时,我从 React 路由器收到以下错误:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object
Check the render method of `Route`.
我希望在 Dashboard 中接收所有传递的道具以及匹配 属性 到 运行 路由器。
问题是您没有将组件传递给 Route
// THIS IS NOT A COMPONENT
let navComponent = (
<MyCustomAppContextProvider>
<AppContext.Consumer>
{context => (
<Dashboard
context={context}
module={this.props.module}
router={router}
sideMenuConfig={this.props.sideMenuConfig}
/>
)}
</AppContext.Consumer>
</MyCustomAppContextProvider>
)
组件可以是扩展 React.Component
的 class
或函数:
// THIS IS A COMPONENT
let NavComponent = props => (
<MyCustomAppContextProvider>
<AppContext.Consumer>
{context => (
<Dashboard
context={context}
module={this.props.module}
router={router}
sideMenuConfig={this.props.sideMenuConfig}
/>
)}
</AppContext.Consumer>
</MyCustomAppContextProvider>
)
更新您的更新:
你对什么是组件感到困惑
// THIS IS A COMPONENT
let Foo = props => <div />
// THIS IS NOT A COMPONENT
let Foo = <div />
你需要传递一个 component 给 Route 的组件 prop:
let NavComponent = props => <MyCustomAppContextProvider>...
// YES
<Route component={NavComponent} />
// NO
<Route component={<NavComponent />} />
我也遇到了同样的情况,正是上下文 api 导致了冲突。我还必须检查 render 方法中的每个内部组件,以确保其中 none 使用上下文 api 并且其中没有 this.context
可用。然后我删除了上下文 api 的东西并写了一个替代的 react-redux 状态,没有上下文 api,没问题
检查您正在导入的表单。有必要将 BrowserRouter 放在导入中。看:
import { BrowserRouter as Router, switch, route } from "react-router-dom";
我正在尝试将 React Router V4 与新的 React 上下文一起使用 API。这是我的代码:
class App extends Component {
static propTypes = {
router: PropTypes.func.isRequired,
module: PropTypes.string.isRequired,
sideMenuConfig: PropTypes.string
};
render() {
let baseName = "/" + this.props.module;
// This will get my dashboard component, loading context from database
let navComponent = (
<MyCustomAppContextProvider>
<AppContext.Consumer>
{context =>
<Dashboard
context={context}
module={this.props.module}
router={router}
sideMenuConfig={this.props.sideMenuConfig}
/>
}
</AppContext.Consumer>
</MyCustomAppContextProvider>
);
let routes = null;
if (!isAuthenticated()) {
routes = <Auth
baseName={baseName}
/>;
} else {
routes = (
<Switch>
<Route exact path="/logout" component={Logout} />
<Route exact path="/auth" component={Logout} />
<Route exact path="/" component={navComponent} />
<Route
exact
path="/:screen"
component={navComponent}
/>
<Route
exact
path="/:screen/:action"
component={navComponent}
/>
<Route
exact
path="/:screen/:action/:id"
component={navComponent}
/>
<Route component={PageNotFoundError} />
</Switch>
);
}
return (
<BrowserRouter basename={baseName}>
{routes}
</BrowserRouter>
);
}
}
export default App;
router
包含一个路由器功能,它将根据导航路径加载我的屏幕。
module
是模块名称。
sideMenuConfig
是我侧边菜单的 json 配置。
尝试 运行 时,我从 React 路由器收到以下错误:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object
Check the render method of `Route`.
我希望在 Dashboard 中接收所有传递的道具以及匹配 属性 到 运行 路由器。
问题是您没有将组件传递给 Route
// THIS IS NOT A COMPONENT
let navComponent = (
<MyCustomAppContextProvider>
<AppContext.Consumer>
{context => (
<Dashboard
context={context}
module={this.props.module}
router={router}
sideMenuConfig={this.props.sideMenuConfig}
/>
)}
</AppContext.Consumer>
</MyCustomAppContextProvider>
)
组件可以是扩展 React.Component
的 class
或函数:
// THIS IS A COMPONENT
let NavComponent = props => (
<MyCustomAppContextProvider>
<AppContext.Consumer>
{context => (
<Dashboard
context={context}
module={this.props.module}
router={router}
sideMenuConfig={this.props.sideMenuConfig}
/>
)}
</AppContext.Consumer>
</MyCustomAppContextProvider>
)
更新您的更新:
你对什么是组件感到困惑
// THIS IS A COMPONENT
let Foo = props => <div />
// THIS IS NOT A COMPONENT
let Foo = <div />
你需要传递一个 component 给 Route 的组件 prop:
let NavComponent = props => <MyCustomAppContextProvider>...
// YES
<Route component={NavComponent} />
// NO
<Route component={<NavComponent />} />
我也遇到了同样的情况,正是上下文 api 导致了冲突。我还必须检查 render 方法中的每个内部组件,以确保其中 none 使用上下文 api 并且其中没有 this.context
可用。然后我删除了上下文 api 的东西并写了一个替代的 react-redux 状态,没有上下文 api,没问题
检查您正在导入的表单。有必要将 BrowserRouter 放在导入中。看:
import { BrowserRouter as Router, switch, route } from "react-router-dom";