我使用的是React 16.4.1、React Router 4.3.1和React Redux 5.0.7。我有一个搜索路线,可以接收这样的查询参数:
https://example.com/search?q=foo
需要明确的是,React Router 4停止了对location.query
的支持,因此我们不得不手动解析React Routeer提供的location.search
道具中的查询参数。为此,我们可以使用类似Javascript的URLSearchParams
接口。
因此,我希望用户能够访问上面的URL,并立即开始搜索"foo"。因此,我需要在页面加载期间的某个时刻收集q
参数。但什么时候?
我的第一反应是让Search
组件在其componentDidMount
生命周期挂钩期间解析查询参数。这恰好也是从服务器检索数据的推荐挂钩,如果q
参数有值,我会这样做。
但我也考虑过将组件外的逻辑完全转移到通常在页面加载时运行的JS文件中,比如我的应用程序的index.js
文件。我可以访问那里的Redux存储,并可以使用"searchText"更新应用程序状态,然后我的Search
组件可以在安装过程中简单地检查该道具(通过Redux连接(。
在页面加载时从URL收集查询参数,然后对其采取行动,这对React开发人员来说是一个相对较新的问题,因为React Router在版本4之前就为我们处理了这个问题。但我肯定不是自第4版发布以来第一个不得不这样做的人。是否有既定的模式或最佳实践?
谢谢。
我的方法是创建一个初始化文件夹以及操作、减速器等
export default (dispatch, getState) => {
dispatch(urlQueryParams());
// Some other initializers
};
const urlQueryParams = () => {
// return json to reducer with the params
}
然后在你的主索引文件上,你可以触发它
import addQueryParamsInitialzer from 'redux/initialize/queryParam';
const store = configureStore(INITIAL_STATE);
addQueryParamsInitialzer(store.dispatch, store.getState);
这样,无论你在上使用什么组件,你都会把它放在你的商店里