7. React Router

我们先来说说「Router」,大概的意思就是:「就是通过互联的网络把信息从源地址传输到目的地址的活动」。

我们用一个注册&登录的页面例子来说明。

function App() {
  let path = window.location.hash;
  let initialState = path === "#signUp" ? "signUp" : "signIn";
  let [n, setN] = useState(initialState);

  let onClickSignIn = () => {
    setN("signIn");
    window.location.hash = "signIn";
  };

  let onClickSignUp = () => {
    setN("signUp");
    window.location.hash = "signUp";
  };

  return (
    <div className="App">
      <div className="tab">
        <button onClick={onClickSignIn}>登录</button>
        <button onClick={onClickSignUp}>注册</button>
      </div>
      {n === "signIn" ? <SignInBox /> : <SignUpBox />}
    </div>
  );
}

我们一开始用hash来区分「登录」和「注册」页面。上述代码中,点击按钮还会修改网址,最后会多出「/#signUp」或者「/#signIn」。

那有人问:能不能地址末尾变成「/signUp」或者「/signIn」?

也可以,就是把「window.location.hash」改为「window.location.pathname」, 修改后你会发现一个「神奇现象」,就是「整个页面都刷新了」,因为浏览器以为你修改路径,是要跳转页面。

还有一种就是假装改了路径(不会刷新页面),就是「window.history.putState(obj, 'page 2', 'page2.html')」。

不过也存在一个问题,就是可能会报错,因为当前页面不存在。


image.png

那路由很多了怎么办?不可能一直反复「if...else」吧。接下来就是我们的主角「React Router」了。

「React Router 就是为了保持 UI 与 URL 同步」。

function SignInBox() {
  return <div className="box">登录!</div>;
}

function SignUpBox() {
  return <div className="box">注册!</div>;
}

function Welcome() {
  return <div className="box">欢迎!</div>;
}

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

const rootElement = document.getElementById("root");
ReactDOM.render(
  <Router>
    <div className="App">
      <div className="tab">
        <Link to="/signUp">
          <button>注册!</button>
        </Link>
        <Link to="/signIn">
          <button>登录!</button>
        </Link>
        <Link to="/welcome">
          <button>欢迎!</button>
        </Link>
      </div>
      <Route exact path="/" component={App} />
      <Route exact path="/signIn" component={SignInBox} />
      <Route exact path="/signUp" component={SignUpBox} />
      <Route exact path="/welcome" component={Welcome} />
    </div>
  </Router>
  , rootElement);

运用「Router」包在最外层,「Route」中的path属性来判断路径和对应的组件。「Link」可以导向所在路径。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在这个教程里,我们会从一个例子React应用开始学习react-router-dom。其中你会学习如何使用Link...
    uncle_charlie阅读 34,787评论 1 40
  • React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件。所...
    梁相辉阅读 97,875评论 24 195
  • <BrowserRouter> 使用 HTML5 提供的 history API (pushState, repl...
    强子_30fd阅读 87,837评论 0 59
  • React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件。所...
    world_7735阅读 5,416评论 0 2
  • 书名:《好好学习》字数:606 迅速看透问题本质的利器 什么是黄金思维圈?其实是我们认知世界的方式。分为三个层面:...
    吾爱庐阅读 1,049评论 0 1

友情链接更多精彩内容