Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何更新match.params?_Reactjs_Search_React Router Dom - Fatal编程技术网

Reactjs 如何更新match.params?

Reactjs 如何更新match.params?,reactjs,search,react-router-dom,Reactjs,Search,React Router Dom,react应用程序具有搜索页面。这里有输入。 路径是“search/:query”,默认情况下,您将看到零个结果。 如果您转到“搜索/星球大战%20”,您将看到一些结果。在componentDidMount()中,我添加了if语句,以在匹配时加载结果。params.query不为空 如果我键入搜索输入蜘蛛侠并单击提交-我将触发搜索并显示结果。但如果你重新加载页面,你会看到关于《星球大战》的结果。那么如何更新match.params.query呢?或者可能有其他解决办法来解决这个问题 @misha

react应用程序具有搜索页面。这里有输入。 路径是“search/:query”,默认情况下,您将看到零个结果。 如果您转到“搜索/星球大战%20”,您将看到一些结果。在
componentDidMount()
中,我添加了if语句,以在匹配时加载结果。params.query不为空

如果我键入搜索输入蜘蛛侠并单击提交-我将触发搜索并显示结果。但如果你重新加载页面,你会看到关于《星球大战》的结果。那么如何更新match.params.query呢?或者可能有其他解决办法来解决这个问题

@misha来自lviv我认为您的问题陈述有两个真实来源,一个是查询参数,您应该使用它更新您的状态,另一个是默认状态,它由过滤器的默认值填充

正如@Akash bhandwarkar所建议的,您确实需要在使用中更新路由。但是,您还需要一个用于应用程序状态的顶级orchestrator,它将允许您读取和写入历史api(更改路由),并为您执行XHR/fetch以获得结果

我的方法是从父组件开始,即FiltersContainer,它实际上执行这个编排来读取和写入url。这个容器将具有获取和更新路由的所有副作用知识(包括错误处理)。现在,所有子组件(过滤器和搜索结果可能)将只读取这样编排的状态并重新呈现


希望这能引导你的思考。如果您需要进一步指导,请在此处回复 您还需要更新历史对象

您所做的是更改可用的历史对象,并基于该对象计算结果。但是当您刷新页面时,它仍然保存原始历史对象

一种方法是,您需要推送或替换历史记录中的新路线。

因为evert搜索页面是一个新页面,所以如果要保留以前的页面,应使用history.push或history.replace

这样实施:

var routeObj = {
pathname: samePath,
state: sameState,
query: newQuery
}
//push it in your history using which ever routing library you are using.

//For Example: 
router.history.replace(routeObj);
注意:不要担心更改历史记录时的渲染速度。React足够聪明来处理这个问题。基本上,当你推送一个已经挂载了组件的路由时,它不会再次卸载和重新挂载相同的组件,而只是改变道具并重新渲染。
这种情况下的回调将是=>componentWillReceiveProps

添加一些代码,这样我们可以更好更快地帮助您