私はReactを使ってアイテムの長いスクロール可能なリスト(+1000)をレンダリングしています。私はこれを助けるのにReact Virtualizedを見つけました。不変性のメリットは何ですか?
だから、example hereを見て、私はアイテムリストコンポーネントの小道具としてそのリストを渡すべきです。私を引き裂くのは、この例ではリストが不変(Immutable.jsを使用しています)です。これは小道具の仕組みなので意味があると思いますが、行アイテムを変更したい場合は、行はリストを使用して再レンダリングされ、状態をスローします。
私がしようとしているのは、クリックしたときに行を強調表示して、ビューからスクロールして再びその行に戻すと、強調表示されます。今、リストが不変でない場合、私は行を表すオブジェクトを変更することができ、強調表示された行は強調表示されたままになりますが、それが正しい方法であるかどうかはわかりません。この小道具を突然変異させる以外の解決策はありますか?
class ItemsList extends React.Component {
(...)
render() {
(...)
return(
<div>
<VirtualScroll
ref='VirtualScroll'
className={styles.VirtualScroll}
height={virtualScrollHeight}
overscanRowCount={overscanRowCount}
noRowsRenderer={this._noRowsRenderer}
rowCount={rowCount}
rowHeight={useDynamicRowHeight ? this._getRowHeight : virtualScrollRowHeight}
rowRenderer={this._rowRenderer}
scrollToIndex={scrollToIndex}
width={300}
/>
</div>
)
}
_rowRenderer ({ index }) {
const { list } = this.props;
const row = list[index];
return (
<Row index={index} />
)
}
}
class Row extends React.Component {
constructor(props) {
super(props);
this.state = {
highlighted: false
};
}
handleClick() {
this.setState({ highlighted: true });
list[this.props.index].color = 'yellow';
}
render() {
let color = list[this.props.index].color;
return (
<div
key={this.props.index}
style={{ height: 20, backgroundColor: color }}
onClick={this.handleClick.bind(this)}
>
This is row {this.props.index}
</div>
)
}
}
const list = [array of 1000+ objects];
ReactDOM.render(
<ItemsList
list={list}
/>,
document.getElementById('app')
);
私はあなたに何が疑問ですか?あなたは2つの異なる質問をしたように、尋ねています。 – evolutionxbox
これは、行の状態を変更すると、次のようになります。http://output.jsbin.com/hopuhuhihu – schwift
あなたは正しいとは言えません。リスト内の行を強調表示したいのですが。私の解決策は、コンポーネント内の小道具として使用するリストを変更することです。私はこれをやるべきだとは思わないが、なぜか分からない。 – schwift