【问题标题】:React Router changes URL but doesn't update the page unless it was refresh from browserReact Router 更改 URL 但不更新页面,除非它从浏览器刷新
【发布时间】:2020-06-22 07:42:27
【问题描述】:

所以我在 YouTube 上看了很多关于 React 初学者的教程, 但是,我在此 URL (localhost/) 并单击设置按钮将 URL 更改为 (localhost/settings) 并且不会在浏览器中自动执行,如果我使用 URL (localhost/settings) 刷新浏览器,则从 Settings.js 更新和呈现的页面

如果您介意帮助我,这是我的代码和 JS: header.js

class Header extends Component {

    state = {
        MainMenuAppeared:false
    }

    MainMenuShow = () =>{
        this.setState({
            MainMenuAppeared: true
        })
    }

    MainMenuHide = () =>{
        this.setState({
            MainMenuAppeared: false
        })
    }

    render() {
        return (
            <div className="Header">
              <header>
                  {this.state.MainMenuAppeared ? (
                    <div id="logo" onClick={this.MainMenuHide}><WebLogo /></div>
                  ) : (
                    <div id="logo" onClick={this.MainMenuShow}><WebLogo /></div>
                  )}

                {this.state.MainMenuAppeared ?(
                    <Router>
                <div id="MainMenu">
                    <Link to="/"><div className="MenuLists">Home</div></Link>
                    <Link to="/settings"><div className="MenuLists">Settings</div></Link>
                </div></Router>) : (<div></div>)}
              </header>
            </div>
          );
    }
}

Main.js(以前的 App.js)

function Main() {
  return (
    <div className="Main">
      <Header />
      <br></br>
      <br></br>
      <br></br>
      <Router>
        <Switch>
          <Route exact path="/" component={Home} />
          <Route path="/settings" component={Settings}/>
        </Switch>
      </Router>
    </div>
  );
}

Settings.js

function Settings() {
  return (
    <div className="Settings">
     Settings
    </div>
  );
}

【问题讨论】:

  • 不要将Link 包裹在Router 中,您的应用应该只有一个Router

标签: javascript reactjs react-router react-router-dom


【解决方案1】:

您的Header 组件应该在Router 组件内。 工作Codesandbox link

<div className="Main">
  <Router>
    <Header />
    <br />
    <br />
    <br />
    <Switch>
      <Route exact path="/" component={Home} />
      <Route path="/settings" component={Settings} />
    </Switch>
  </Router>
</div>

让我知道它是否有效!!!

【讨论】:

  • 这些不是方法,你要明白,应用程序只能有一个&lt;Router/&gt; wrapper,所以我们必须把Router 组件放在Header 组件上面并从@987654328 中移除@ 组件如代码框所示。两个答案都做了同样的事情。我只是在codesandbox中进行了第二步,而不是在这里写。
【解决方案2】:

组件树顶部应该有一个Router。因此,只需将您的 Header 移动到 Router 内即可

function Main() {
  return (
    <div className="Main">
      <Router>
        <Header />
        <br></br>
        <br></br>
        <br></br>
     
        <Switch>
          <Route path="/settings" component={Settings}/>
          <Route exact path="/" component={Home} />
        </Switch>
      </Router>
    </div>
  );
}

并从Header 本身中删除第二个Router

class Header extends Component {
  state = {
    MainMenuAppeared: false
  };

  MainMenuShow = () => {
    this.setState({
      MainMenuAppeared: true
    });
  };

  MainMenuHide = () => {
    this.setState({
      MainMenuAppeared: false
    });
  };

  render() {
    return (
      <div className="Header">
        <header>
          {this.state.MainMenuAppeared ? (
            <div id="logo" onClick={this.MainMenuHide}>
              <WebLogo />
            </div>
          ) : (
            <div id="logo" onClick={this.MainMenuShow}>
              <WebLogo />
            </div>
          )}

          {this.state.MainMenuAppeared && (
           
              <div id="MainMenu">
                <Link to="/">
                  <div className="MenuLists">Home</div>
                </Link>
                <Link to="/settings">
                  <div className="MenuLists">Settings</div>
                </Link>
              </div>
           
          )}
        </header>
      </div>
    );
  }
}

【讨论】:

  • 感谢第二种方法!我更喜欢这个
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 2020-12-08
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多