在我的React组件中,我显示了一个项目列表 - 每个项目都在其自己的DIV元素中,并且具有唯一ID,即<div id="abc-123">
。
我还使用react-perfect-scrollbar
让整个事情更好看。
我在名为activeElementId
的reducer中保留一个变量,当activeElementId
的值发生变化时,我想自动滚动到屏幕上的那个项目。
设置activeElementId
是很容易的部分,但我不确定如何滚动到该元素,并会欣赏一些指示。
这是包含ListComponent
。
class MyComponent extends Component {
constructor(props) {
super(props);
}
render() {
return(
<div>
{this.props.items.length > 0
?
<PerfectScrollBar>
<ListComponent items={this.props.items} />
</PerfectScrollBar>
: null}
</div>
);
}
}
我的ListComponent
是演示组件:
const ListComponent = ({ items }) => {
return(
<ul className="pretty-list">
{items.map(item => <ItemComponents item={item} />)}
</ul>
);
}
export default ListComponent;
ItemComponent
也是一个表现性成分:
const ItemComponent = ({ Item }) => {
return(
<li>
<div id={item.id}>
{item.someProperty}
</div>
</li>
);
}
export default ItemComponent;
我非常喜欢将ListComponent
和ItemComponent
分开并将其作为表示组件的想法,这有助于保持代码更简单,更易于管理。不确定这是否会使实现自动滚动逻辑变得困难。
答案 0 :(得分:0)
您使用的库有一个名为setScrollTop
的方法。您可以将其与getBoundingClientRect
一起使用。要使用getBoundingClientRect
,您需要拥有dom元素。您没有提供有关如何设置或获取活动元素的任何代码,但我会尝试给您一个示例。也许它可以帮助您实现代码。
示例强>
class MyComponent extends Component {
constructor(props) {
super(props);
}
_onListItemChange = (itemsPosition) => {
this.scrollbar.setScrollTop(itemsPosition.top);
}
render() {
return (
<div>
{this.props.items.length > 0 ?
<PerfectScrollBar ref={(scrollbar) => { this.scrollbar = scrollbar; }}>
<ListComponent
items={this.props.items}
onListItemChange={this._onListItemChange} />
</PerfectScrollBar>
: null}
</div>
);
}
const ListComponent = ({ items, onListItemChange }) => {
return(
<ul className="pretty-list">
{items.map(item => (
<ItemComponents
item={item}
onListItemClick={onListItemChange} />
))}
</ul>
);
}
export default ListComponent;
import { render, findDOMNode } from 'react-dom';
class ListItem extends React.Component {
_onClick = () => {
let domElement = findDOMNode(this.item);
this.props.onListItemClick(domElement.getBoundingClientRect());
}
render() {
const { item } = this.props;
return(
<li>
<div id={item.id} ref={(item) => { this.item = item; }} onClick={this._onClick}>
{item.someProperty}
</div>
</li>
);
}
}