javascript - 反应保持数据同步
问题描述
我在页面上有一个实时过滤器结构。我输入的数据保存在我的状态中,但也作为 URL 查询保存,因此当有人打开带有 URL 中的过滤器的页面时,已经选择了正确的过滤器。
我正在努力寻找一种稳定的方法来保持这两个同步。目前,我在加载时从我的 URL 获取数据,并在我更改状态时在我的 URL 中设置数据,但是这种结构几乎不可能重用所涉及的组件,并且错误很容易导致无限循环,它实际上也是不可能扩大。是否有更好的架构来处理保持这些同步?
解决方案
我建议从查询参数管理视图中过滤器的状态。如果您使用 react-router,您可以使用查询参数而不是状态,并在渲染方法中获取视图元素所需的参数。更改过滤器后,您需要实施重定向。为了更方便,最好使用qs 模块。使用这种方法,您还将收到一个用于请求后端的现成参数。
示例容器:
const initRequestFields = {someFilterByDefault: ''};
class Example extends Component{
constructor(props) {
super(props);
this.lastSearch = '';
}
componentDidMount() {
this.checkQuery();
}
componentDidUpdate() {
this.checkQuery();
}
checkQuery() {
const {location: {search}, history} = this.props;
if (search) {
this.getData();
} else {
history.replace({path: '/some-route', search: qs.stringify(initRequestFields)});
}
}
getData() {
const {actionGetData, location: {search}} = this.props;
const queryString = search || `?${qs.stringify(initRequestFields)}`;
if (this.lastSearch !== queryString) {
this.lastSearch = queryString;
actionGetData(queryString);
}
}
onChangeFilters = (values) => {
const {history} = this.props;
history.push({path: '/some-route', search: qs.stringify(values)});
};
render() {
const {location: {search}} = this.props;
render(<Filters values={qs.parse(search)} onChangeFilers={this.onChangeFilters} />)
}
}
此逻辑最好保存在将值传递给组件的最高容器中。
获取更多信息:
推荐阅读
- python - 芹菜组和链
- android - notificationBuilder.setSound() 到铃声不起作用
- go - Hyperledger Fabric 链码在执行期间面临错误
- tomcat - Tomcat 8如何实现热部署?
- c# - 在pdfsharp中使用字体Times New Roman粗体时出错
- c# - Caliburn Micro Conductor.Collection.AllActive 不工作
- node.js - 在 s3 amazon 问题上将图像直接上传到存储桶
- ios - 推送通知 - 来自 Today Extension - iOS
- python - 对象之间通配符匹配的简洁方法?
- mysql - 此代码显示用户列表 bt 如何将其转换为 Nodejs 和 mysql 中的 MVC 模型?