@observer
export class BookshelfComponent extends React.Component<{}, {}> {
@observable
libraryData: ILibraryBook[] = [{isSelected: false}, {isSelected: false}];
bookItemPress(index: number) {
this.libraryData[index].isSelected = !this.libraryData[index].isSelected;
}
render() {
return (
<FlatList
data={this.libraryData.slice()}
renderItem={this.renderItem}
numColumns={3}/>
);
}
renderItem = ({item, index}) => {
return (
<LibraryItemComponent
bookLibraryItem={item}
itemClick={() => {
this.bookItemPress(index)
}}
/>
);
}
}
当我按下清单列表项以调用bookItemPress
功能时,render
功能不会再次运行;
但是当我将一个项目推送到libraryData时,效果很好!
谢谢!
要更新@observable
,您也可以
@action.bound
bookItemPress(index: number) {
this.libraryData[index].isSelected = !this.libraryData[index].isSelected;
}
runInAction
bookItemPress(index: number) {
runInAction(() => {
this.libraryData[index].isSelected = !this.libraryData[index].isSelected;
})
}
传递给renderItem
的渲染回调FlatList
不是从装饰有BookshelfComponent
的组件@observer
中调用,而是从不是观察者的FlatList
中调用。
您可以使用Observer
component来解决此问题。
Observer
renderItem = ({item, index}) => {
return (
<Observer>{() => (
<LibraryItemComponent
bookLibraryItem={item}
itemClick={() => {
this.bookItemPress(index)
}}
/>
)}</Observer>
);
}
}
@observer
export class LibraryItemComponent extends React.Component<ILibraryItemProps> {
...
}
@observer
export class BookshelfComponent extends React.Component<{}, {}> {
@observable
libraryData: ILibraryBook[] = [{isSelected: false}, {isSelected: false}];
bookItemPress(index: number) {
this.libraryData[index].isSelected = !this.libraryData[index].isSelected;
}
render() {
return (
<FlatList
data={this.libraryData.slice()}
renderItem={this.renderItem}
numColumns={3}/>
);
}
renderItem = ({item, index}) => {
return (
<LibraryItemComponent
bookLibraryItem={item}
itemClick={() => {
this.bookItemPress(index)
}}
/>
);
}
组件装饰有观察者可以很好地工作。