代码之家  ›  专栏  ›  技术社区  ›  productioncoder

React Router:组件未在URL搜索参数更改时更新

  •  2
  • productioncoder  · 技术社区  · 7 年前

    我有一个 React 使用 URL search params . 取决于 search parameter v ,组件应该显示不同的内容。

    可能的 URL 可能是这样的:

    http://localhost:3000/hello?v=12345
    

    一旦 v query parameter 中的更改 统一资源定位地址 ,我想更新我的组件。

    http://localhost:3000/hello?v=6789
    

    我在用 react-router 在“我的应用程序”组件中,根据路由显示不同的组件。这个 App 组件被包装成 BrowserRouter 组件。

    render() {
      return (
        <Switch>
          <Route path="/hello" component={Hello}></Route>
          <Route path="/" component={Home}></Route>
        </Switch>
      );
    }
    

    如果用户点击了某个东西 URL search param v 更改后,我希望组件显示不同的内容。目前, URL search param 确实会更改,但组件不会再次渲染。有什么想法吗?

    2 回复  |  直到 7 年前
        1
  •  3
  •   productioncoder    7 年前

    正如@forj正确指出的,主要思想是在 URL 参数改变。我是这样做到的:

    render() {
      return (
        <Switch>
          <Route path="/hello" render={() => (<Hello key={this.props.location.key}/>)}></Route>
          <Route path="/" component={Home}></Route>
        </Switch>
      );
    }
    

    this.props.location.key 每次 统一资源定位地址 更改(如果查询参数更改)。因此,如果将其作为道具传递给组件,则组件将重新呈现 统一资源定位地址 参数更改,即使 base URL (the 统一资源定位地址 没有 统一资源定位地址 params)没有改变。

    我还得用 withRouter 使其工作的高阶组件。

    export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Hello));
    
        2
  •  1
  •   forJ    7 年前

    你没有提供足够的信息,所以我不能百分之百确定你哪里出错了,但我现在可以看到你的代码中有一个问题。首先,你必须让路由器知道你将使用参数。例如下面的代码

    render() {
      return (
        <Switch>
          <Route path="/hello/:yourParam" component={Hello}></Route> // you need the colon here
          <Route path="/" component={Home}></Route>
        </Switch>
      );
    }
    

    上面将告诉该参数调用的路由 yourParam 可从 URL

    然后必须在组件中访问它并以某种方式将其放入render函数(使用它从数据库中检索数据以呈现数据,只需直接呈现参数,等等)。

    例如下面

    render(){
        <div>
            {this.props.match.params.yourParam}
        </div>
    }
    

    这样,组件将在每次参数更改时重新呈现。

    编辑

    因为您想使用查询而不是参数,所以必须通过执行以下操作来检索它。 this.props.match.query.v . 仍然需要确保根据查询更改呈现变量