【问题标题】:react router 4 query parameters example not working反应路由器4查询参数示例不起作用
【发布时间】:2019-05-10 22:44:53
【问题描述】:

问题:尝试在我的本地环境中实现反应路由器查询参数示例。下面的代码来自他们的网站。

import React from "react";
import { BrowserRouter as Router, Link } from "react-router-dom";

function ParamsExample({ location }) {
  let params = new URLSearchParams(location.search);

  return (
    <Router>
      <div>
        <p>
          React Router does not have any opinions about how your parse URL query
          strings. Some applications use simple key=value query strings, but
          others embed arrays and objects in the query string. So it's up to you
          to parse the search string yourself.
      </p>
        <p>
          In modern browsers that support{" "}
          <a href="https://developer.mozilla.org/en-US/docs/Web/API/URL">
            the URL API
        </a>
          , you can instantiate a <code>URLSearchParams</code> object from{" "}
          <code>location.search</code> and use that.
      </p>
        <p>
          In{" "}
          <a href="https://caniuse.com/#feat=url">
            browsers that do not support the URL API (read: IE)
        </a>{" "}
          you can use a 3rd party library such as{" "}
          <a href="https://github.com/sindresorhus/query-string">query-string</a>.
      </p>
        <div>
          <h2>Accounts</h2>
          <ul>
            <li>
              <Link to={{ pathname: "/account", search: "?name=netflix" }}>
                Netflix
            </Link>
            </li>
            <li>
              <Link to={{ pathname: "/account", search: "?name=zillow-group" }}>
                Zillow Group
            </Link>
            </li>
            <li>
              <Link to={{ pathname: "/account", search: "?name=yahoo" }}>
                Yahoo
            </Link>
            </li>
            <li>
              <Link to={{ pathname: "/account", search: "?name=modus-create" }}>
                Modus Create
            </Link>
            </li>
          </ul>

          <Child name={params.get("name")} />
        </div>
      </div>
    </Router>
  );
}

function Child({ name }) {
  return (
    <div>
      {name ? (
        <h3>
          The <code>name</code> in the query string is "{name}"
        </h3>
      ) : (
          <h3>There is no name in the query string</h3>
        )}
    </div>
  );
}

export default ParamsExample;

渲染时我收到以下错误消息
TypeError: Cannot read property 'search' of undefined
这很简单,但是当我在 console 中执行 location.search 时,我得到以下输出 "?name=zillow-group"
据说location.search 是一个有效的属性,但不确定为什么 react 没有看到它。

【问题讨论】:

  • 你能在函数 paramsExample 中试试 console.log(location)。并刷新组件。因此,我们可以检查是否从刷新的初始时间开始获取搜索属性。请告诉我结果

标签: javascript reactjs ecmascript-6 react-router


【解决方案1】:

当您在控制台中记录位置时,您正在记录 window.location 对象。但是,在您的组件中,定义了一个 location 属性优先。它没有在react-router example 中明确显示,但它们在某处渲染 ParamsExample 组件并传入 location 属性。

您可以使用withRouter hocRoute component 访问react-router location 属性(以及其他)。这里是an example

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Link, Route } from "react-router-dom";

function ParamsExample() {
  return (
    <Router>
      <div>
        <p>
          React Router does not have any opinions about how your parse URL query
          strings. Some applications use simple key=value query strings, but
          others embed arrays and objects in the query string. So it's up to you
          to parse the search string yourself.
        </p>
        <p>
          In modern browsers that support{" "}
          <a href="https://developer.mozilla.org/en-US/docs/Web/API/URL">
            the URL API
          </a>
          , you can instantiate a <code>URLSearchParams</code> object from{" "}
          <code>location.search</code> and use that.
        </p>
        <p>
          In{" "}
          <a href="https://caniuse.com/#feat=url">
            browsers that do not support the URL API (read: IE)
          </a>{" "}
          you can use a 3rd party library such as{" "}
          <a href="https://github.com/sindresorhus/query-string">
            query-string
          </a>
          .
        </p>
        <div>
          <h2>Accounts</h2>
          <ul>
            <li>
              <Link to={{ pathname: "/account", search: "?name=netflix" }}>
                Netflix
              </Link>
            </li>
            <li>
              <Link to={{ pathname: "/account", search: "?name=zillow-group" }}>
                Zillow Group
              </Link>
            </li>
            <li>
              <Link to={{ pathname: "/account", search: "?name=yahoo" }}>
                Yahoo
              </Link>
            </li>
            <li>
              <Link to={{ pathname: "/account", search: "?name=modus-create" }}>
                Modus Create
              </Link>
            </li>
          </ul>

          <Route
            render={({ location }) => {
              let params = new URLSearchParams(location.search);
              return <Child name={params.get("name")} />;
            }}
          />
        </div>
      </div>
    </Router>
  );
}

function Child({ name }) {
  return (
    <div>
      {name ? (
        <h3>
          The <code>name</code> in the query string is "{name}"
        </h3>
      ) : (
        <h3>There is no name in the query string</h3>
      )}
    </div>
  );
}

function App() {
  return <ParamsExample />;
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 2017-08-20
    • 1970-01-01
    • 2020-01-04
    • 2016-12-04
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多