ReactJS 使用在其他 ReactDOM 上呈现的按钮更改路由

Posted

技术标签:

【中文标题】ReactJS 使用在其他 ReactDOM 上呈现的按钮更改路由【英文标题】:ReactJS Changing the route using a button that is rendering on other ReactDOM 【发布时间】:2019-04-05 20:17:30 【问题描述】:

我的index.js 有两个渲染 ReactDOM

ReactDOM.render(<Header />, document.getElementById('header'));
ReactDOM.render(<App />, document.getElementById('root'));

现在,在我的 App.js 内,我有 3 条路线

<Router>
    <Switch>
        <Route exact path = "/" component =  page1 />
        <Route path = "/page1" component =  page1 />
        <Route path = "/page2" component =  page2 />
    </Switch>
</Router>

然后在我的Header.js 文件中,我有一个按钮,我想用来导航到另一条路线或页面

<button onClick=() => this.props.history.push('/page2')> Next </button>

但问题是我有一个错误提示

TypeError: Cannot read property 'push' of undefined

我知道它不在react路由器中所以我不能使用链接,但我不知道我应该做什么, 问题是,如何使用从另一个 ReactDOM 呈现的按钮从一个路由导航到另一个路由,而不是在我想要更改路由的 ReactDOM 内部?

【问题讨论】:

【参考方案1】:

您可以使用history 库手动创建history 对象,然后将其从一个单独的模块中导出,您可以将其提供给您的Router 组件并在您的Header 组件中使用。

示例

// history.js
import createHistory from 'history/createBrowserHistory';

const history = createHistory();

export default history;

// App.js
import history from './history';

export default () => (
  <Router history=history>
    <Switch>
      <Route exact path = "/" component =  page1 />
      <Route path = "/page1" component =  page1 />
      <Route path = "/page2" component =  page2 />
    </Switch>
  </Router>
);

// Header.js
import history from './history';

export default () => (
  <button onClick=() => history.push('/page2')> Next </button>
);

【讨论】:

我在那里使用import BrowserRouter as Router, Route, Switch from 'react-router-dom';,但它不起作用,然后我在我的代码中删除了BrowserRouter as,它仍然有效,但我仍然困惑为什么它在 BrowserRouter 上不起作用跨度> @MarkDylanBMercado BrowserRouter 创建一个自己的 history,并且不使用 history 属性。只有Router 可以传递history 属性。【参考方案2】:

为什么不用“withRouter”封装头部组件?

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/withRouter.md

【讨论】:

以上是关于ReactJS 使用在其他 ReactDOM 上呈现的按钮更改路由的主要内容,如果未能解决你的问题,请参考以下文章

2ReactJs基础知识02

reactJS详细介绍之

reactJS详细介绍之

为啥不能用 ReactJS 渲染 HTML

如何使用 expressJS 提供 ReactJS 静态文件?

Unity Sprite Sheet 在 Android 设备上呈锯齿状