【问题标题】:React Query String showing 404 when provided with query parameter提供查询参数时显示 404 的反应查询字符串
【发布时间】:2020-04-04 04:33:00
【问题描述】:

我是 React 新手,并尝试根据名称查询呈现页面,例如 http://localhost:3000/show?name=james

所以我最初将路线添加为:

<BrowserRouter>
<Switch>    
<Route path='*' component={ErrorComponent} />} />
<Route path="show(/:name)" name="name" component={Show}></Route>
</Switch>
</BrowserRouter>

然后我尝试渲染组件显示如下:

import React, { Component } from 'react';
import queryString from 'query-string';
class Show extends Component {
  componentDidMount(){
    console.log(this.props.location.search);
    const values = queryString.parse(this.props.location.search);
    console.log(values.name);
  }


  render() {
    const { params } = this.props.match;
    return <div>
      <h4>About</h4>
      <p>This is About page.</p>
      {params.id ? <b>ID: {params.id}</b> : <i>ID is optional.</i>}
    </div>
  }
}

export default Show;

然后当我尝试显示页面时

http://localhost:3000/show?name=james

它总是显示 404。不确定我做错了哪一部分。任何帮助表示赞赏。 我也在使用 react-router-dom 5.1.2 。 谢谢。

【问题讨论】:

    标签: javascript reactjs react-router-dom


    【解决方案1】:

    path="show(/:name)"

    这不是要匹配的有效 URL 路径。

    重新定义["/show/:id", "/show"]的路径

    <Route path={["/show/:id", "/show"]} name="name" component={Show} />
    

    由于Route是直接渲染组件,它可以直接从props(this.props.match.params&this.props.location.search)拉取查询参数和匹配参数。指定两个匹配路径等效于定义两个单独的Routes,它们呈现相同的组件。相同的规则适用于路径特异性,因此首先在数组中定义更复杂的匹配项。

    class Show extends Component {
      componentDidMount(){
        console.log(this.props.location.search);
        const values = queryString.parse(this.props.location.search);
        console.log(values.name);
      }
    
      render() {
        const { params } = this.props.match;
        return <div>
          <h4>About</h4>
          <p>This is About page.</p>
          {params.id ? <b>ID: {params.id}</b> : <i>ID is optional.</i>}
        </div>
      }
    }
    

    【讨论】:

      【解决方案2】:

      编辑:不敢相信我最初没有注意到这一点......

      您需要将您的path="*" 路由放在Switch 的底部,否则它将匹配所有内容,并且它下面的任何内容甚至都没有机会匹配,因为Switches 只匹配一个路由。当然,确保正确设置路由路径的描述(如下)也适用。

            <Switch>
              <Route path="/show/:name?" component={ShowRouteParam} />
              <Route path="*">ERROR 404</Route>
            </Switch>
      

      https://codesandbox.io/s/elated-browser-d0sew?file=/src/App.js


      路由与查询参数不匹配。

      "请注意:path-to-regexp 返回的 RegExp 用于 与路径名或主机名一起使用。它无法处理查询字符串 或 URL 的片段。”

      根据你想怎么做,你可以让 id 成为路由的可选部分,或者让它成为一个普通的查询参数

      选项 1:

      <Route path="/show/:name?" component={Show}></Route>
      

      组件:

      import React, { Component } from 'react';
      import queryString from 'query-string';
      class Show extends Component {
        componentDidMount(){
          console.log(this.props.location.search);
          const values = queryString.parse(this.props.location.search);
          console.log(values.name);
        }
      
      
        render() {
          const { params } = this.props.match;
          return <div>
            <h4>About</h4>
            <p>This is About page.</p>
            {params.name ? <b>ID: {params.name}</b> : <i>Name is optional.</i>}
          </div>
        }
      }
      
      export default Show;
      

      选项 2:

      <Route path="/show" component={Show}></Route>
      

      组件:

      import React, { Component } from 'react';
      import queryString from 'query-string';
      class Show extends Component {
        componentDidMount(){
          console.log(this.props.location.search);
          const values = queryString.parse(this.props.location.search);
          console.log(values.name);
        }
      
      
        render() {
          const values = queryString.parse(this.props.location.search);
          return <div>
            <h4>About</h4>
            <p>This is About page.</p>
            {values.name ? <b>ID: {values.name}</b> : <i>Name is optional.</i>}
          </div>
        }
      }
      
      export default Show;
      

      工作示例:https://codesandbox.io/s/silent-rain-n61zs

      【讨论】:

      • 您好 Zachary,感谢您的解释,但在尝试了您的 2 个解决方案后,它仍然抱怨 404。这与路由有关吗?
      • 好的,我修复了这个错误。我们在路由路径中缺少初始路由 / 。我还包括了一个关于代码沙盒的工作示例。希望这会有所帮助:)
      • 我可以理解逻辑,但是当我在我的应用程序中尝试这个并使用localhost:3000/show?name=james 调用浏览器时,它应该正确呈现页面。但它仍然是 404。而且我也在使用浏览器路由器那个情况
      • @UsmanJ,我更新了我的答案,因为我意识到我有点傻。如果更新不能解决您的问题,我真的需要查看可重现的示例才能提供帮助。
      • @UsmanJ 您需要将查询字符串分隔到 to 参数的搜索属性中:&lt;Link to={pathname:'/a',search:'q=hi'} /&gt;。似乎反应路由器试图假设路径名实际上是一个路径,即使其中包含查询参数。 codesandbox.io/s/recursing-platform-q6ry7
      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 2017-02-06
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多