如何使用 React Router 将哈希添加到 url 而不重新渲染?

Tho*_*tre 8 javascript reactjs react-router

我想在路线内打开一个 popin,并且想在 url 中添加一个哈希值。

例如 onClick 之前https://www.example.com/homeonClick 之后https://www.example.com/home#send-me-an-email

好吧,它可以工作,但是React Router 会重新渲染整个路由

我在使用 React Router 时做错了什么吗?让我们看看下面我的代码(我简化了事情)

index.jsx我和大家一样使用 BrowserRouter

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router } from 'react-router-dom';

import App from './App';

const render = Component => {
  ReactDOM.render(
     <Router>
       <Component />
     </Router>,
    document.getElementById('root')
  );
};

render(App);
Run Code Online (Sandbox Code Playgroud)

App.jsx我正在使用 withRouter 因为我需要其他地方的历史记录和位置

import React from 'react';
import { Route, Switch, withRouter } from 'react-router-dom';
import Header from './components/Header';
import Footer from './components/Footer';
import Home from './views/Home';


const App = ({ ...props }) => {
  return (
    <Header />
      <section>
        <Switch>
          <Route exact path={"/"} component={() => <Home {...props} />} />
          <Route path={"/home"} component={() => <Home {...props} />} />
        </Switch>
      </section>
    <Footer />
  );
};

export default withRouter(App);
Run Code Online (Sandbox Code Playgroud)

Home.jsx不幸的是,当我这样做时,this.props.history.push({ hash: 'send-me-an-email' })它会重新渲染路由组件 Home,不好

...
render() {
  <div>
    <button onClick={() => this.props.history.push({ hash: 'send-me-an-email' })}>
      Send me and email
    </button>
    <Popin 
      isOpened={this.state.isPopinOpened} 
      handleClose={() => this.props.history.push({ hash: '' })} />
  </div>
}
...
Run Code Online (Sandbox Code Playgroud)

如何不仅仅因为我向相同的 url 添加了哈希而进行重新渲染?干杯。

Mos*_*ini 6

只需依赖普通 JS:

window.history.pushState("object or string", "Title", "/home#send-me-an-email");
Run Code Online (Sandbox Code Playgroud)

这将添加哈希/路由,而无需渲染或重新加载任何内容。

  • 我觉得我真的做对了。并且没有其他选择。我将使用 Redux 来保存我的反应状态,工作就完成了;) (2认同)