私は小さなReactNativeアプリケーションを書いています。これは、ユーザーが人々をイベントに招待できるようにするものです。React Nativeのステート更新を正しく行うにはどうすればいいですか?
このデザインには招待者の一覧が含まれています。招待者の一覧には、招待者を招待/招待するためのチェックボックスが付いています。リストの一番上にあるもう1つのチェックボックス。すべての招待者を一斉に招待/招待しません。最後に、ボタンが最終的に招待状を送信するために使用されます。
これらの要素のそれぞれの状態は、他の要素による状態の変化に依存するため、ユーザーがそのいずれかで操作を行うたびにUI全体を再レンダリングする必要があります。しかし、これは正しく動作している間、それはas shown in this video
、私はかなりの数のパフォーマンスの問題を引き起こしているここで私が使用しているコードだ:
import React, { Component } from 'react';
import { Container, Header, Title,
Content, Footer, FooterTab,
Button, Left, Right,
Center, Body, Text, Spinner, Toast, Root , CheckBox, ListItem, Thumbnail} from 'native-base';
import { FlatList, View } from 'react-native';
export default class EventInviteComponent extends Component {
constructor(props) {
super(props);
console.disableYellowBox = true;
this.state = {
eventName: "Cool Outing!",
invitees:[]
}
for(i = 0; i < 50; i++){
this.state.invitees[i] = {
name: "Peter the " + i + "th",
isSelected: false,
thumbnailUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Purple111/v4/62/08/7e/62087ed8-5016-3ed0-ca33-50d33a5d8497/source/512x512bb.jpg'
}
}
this.toggelSelectAll = this.toggelSelectAll.bind(this)
}
toggelSelectAll(){
let invitees = [...this.state.invitees].slice();
let shouldInviteAll = invitees.filter(invitee => !invitee.isSelected).length != 0
let newState = this.state;
newState = invitees.map(function(invitee){
invitee.isSelected = shouldInviteAll;
return invitee;
});
this.setState(newState);
}
render() {
let invitees = [...this.state.invitees];
return (
<Root>
<Container>
<Content>
<Text>{this.state.eventName}</Text>
<View style={{flexDirection: 'row', height: 50, marginLeft:10, marginTop:20}}>
<CheckBox
checked={this.state.invitees.filter(invitee => !invitee.isSelected).length == 0}
onPress={this.toggelSelectAll}/>
<Text style={{marginLeft:30 }}>Select/deselect all</Text>
</View>
<FlatList
keyExtractor={(invitee, index) => invitee.name}
data={invitees}
renderItem={(item)=>
<ListItem avatar style={{paddingTop: 20}}>
<Left>
<Thumbnail source={{ uri: item.item.thumbnailUrl}} />
</Left>
<Body>
<Text>{item.item.name}</Text>
<Text note> </Text>
</Body>
<Right>
<CheckBox
checked={item.item.isSelected}/>
</Right>
</ListItem>}/>
</Content>
<Footer>
<FooterTab>
<Button full
active={invitees.filter(invitee => invitee.isSelected).length > 0}>
<Text>Invite!</Text>
</Button>
</FooterTab>
</Footer>
</Container>
</Root>);
}
}
私はここにいくつかの提案をしています:#1。レンダー機能で配列を複製する必要はありません。 #2。あなたがしたようなものはすべて国家に入れてはいけません。私はそれが招待者のIDの配列であると思う。 #3。 FlatListがここで何も改善していないのは変だ。チェックボックスへの参照を取得し、すべてを再レンダリングする代わりに、それぞれを切り替えることができます。助けてくれることを願っています。 –