在 React/Redux 中管理同级组件之间的滚动状态
Managing scroll state between sibling components in React/Redux
React 组件如何控制同级组件的滚动位置?
Parent
是父组件,它有子List
(包含可滚动的div(和Actions
带有一个按钮,该按钮应该控制List
可滚动div 的滚动。
一些选项:
- 在 Redux 存储中维护对可滚动div 和滚动位置的 DOM 元素的引用。在状态更改时触发化简器中的滚动。
Parent
管理滚动。不知何故,Parent
需要对List
中的可滚动div 有一个 DOM 引用,不确定List
如何传递引用。- 使用类似 反应虚拟化 (
VirtualScroll
( 的东西来显示List
中的虚拟内容。实际上不要滚动,只需将内容更新为新滚动位置上看到的内容即可。这意味着我们无法为卷轴设置动画?
选项 #2 似乎是最合理的(动画滚动对于这种情况很重要(,但我对 React/Redux 中的最佳实践不够熟悉,无法做出良好的架构决策。
我会选择选项 2。但是,父级不必保留对 List 项的引用,而是将它们作为子组件。您可以将滚动位置保存在 redux 存储中,让父级控制它,然后将其作为道具传递给您的列表项。
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
import List from './List';
class Parent extends Component {
static propTypes = {
dispatch: PropTypes.func.isRequired,
scrollPos: PropTypes.number.isRequired
};
updateScrollPos() {
const value = getValueFromSomewhere();
this.dispatch({ type: UPDATE_SCROLLPOS, value })
}
render() {
return <div>
<button onClick={::this.updateScrollPos}>Update scrollPos</button>
<List scrollPos={this.props.scrollPos} />
<List scrollPos={this.props.scrollPos} />
<List scrollPos={this.props.scrollPos} />
</div>
}
}
const select = (state) => ({
scrollPos: state.scrollPos
})
export default connect(select)(Parent);
相关文章:
- 是否有任何JavaScript UI组件可以显示字符串之间的差异
- 设置两个反应组件之间状态的正确方式
- Ember.js:接受的子组件和父组件之间通信的最佳实践
- angular2@组件和类之间的关系
- Angular 2,在没有直接关系的两个组件之间共享一个对象
- 在 React/Redux 中管理同级组件之间的滚动状态
- 如何更新angular2中组件之间的事件数据
- Aurelia中HTML组件和普通组件之间的区别
- Vuejs中同级组件之间的通信
- 尝试在组件之间传递数据时未定义
- React组件之间共享属性
- 如何在不让web组件的原型进入全局命名空间的情况下维护它们之间的依赖关系
- 在页面之间共享组件,而无需重新加载
- Reactjs:如何在组件之间共享 websocket
- 在两个组件之间传输状态
- Reactjs 组件之间的通信
- AngularJS:在组件之间进行通信的最佳实践是什么?
- 如何管理独立反应组件之间的通信
- 响应组件之间的交互
- 两个网络组件之间的绑定:谷歌地图+地理定位