我正在使用带有正常React组件(没有React Router)的react-url-query。
这是如此接近工作,但是有一个我无法弄清楚的细节:
?skills=beginner
->时,将从URL中解析出“ skills”参数,并且组件将this.props.filters.skills
正确设置为值['beginner']
。这按预期工作。 -这是由mapUrlToProps
完成的。 (按预期运行)filters
道具。 (按预期运行)onSkillsChange
并传递新技能,例如advanced
(按预期工作)onSkillsChange
被触发,pushInUrlQuery
有效,URL中的skills
参数被更新为advanced
(按预期工作)这是它的坏处,我希望由于URL的更改,可以识别URL的组件(列表)将使用新的URL重新呈现,并且我会看到mapUrlToProps
再次触发并重新设置url的道具,但不是。
URL发生变化,但没有其他反应,List组件的属性保持不变。
我可以看到this.forceUpdate()
会在历史记录更改时触发,因此我希望可以像从源仓库中的示例一样更新道具,但不会。
我在这里想念什么?
代码如下:
import React, { Component } from 'react';
import { addUrlProps, UrlQueryParamTypes, configureUrlQuery, pushInUrlQuery, encode } from 'react-url-query'
import createHistory from 'history/createBrowserHistory'
import FiltersForm from './FiltersForm'
const history = createHistory()
configureUrlQuery({ history })
const defaultFilters = { skills: ['beginner', 'intermediate'] }
class List extends Component {
componentDidMount () {
history.listen(() => this.forceUpdate())
}
render () {
return <FiltersForm
filters={this.props.filters}
onSkillsChange={this.props.onSkillsChange}
/>
}
}
const mapUrlToProps = (url, props) => {
const urlFilters = { skills: url.skills ? url.skills.split(',') : [] }
const filters = Object.assign(defaultFilters, urlFilters)
return { filters }
}
const mapUrlChangeHandlersToProps = (props) => {
return {
onSkillsChange: (value) => {
pushInUrlQuery('skills', value)
}
}
}
export default addUrlProps({ mapUrlToProps, mapUrlChangeHandlersToProps })(List)