플랫리스트를 다시 렌더링하는 방법
ListView와 달리 이 . state . datasource는 갱신할 수 있습니다.Flat List를 업데이트하거나 다시 렌더링하는 방법이나 예가 있습니까?
제 목표는 사용자가 버튼을 눌렀을 때 텍스트 값을 업데이트하는 것입니다...
renderEntries({ item, index }) {
return(
<TouchableHighlight onPress={()=> this.setState({value: this.state.data[index].value+1})>
<Text>{this.state.data[index].value}</Text>
</TouchableHighlight>
)
}
<FlatList
ref={(ref) => { this.list = ref; }}
keyExtractor={(item) => item.entry.entryId}
data={this.state.data}
renderItem={this.renderEntries.bind(this)}
horizontal={false} />
하다를 사용하세요.extraData
속성을 지정합니다.
설명서에 기재되어 있는 바와 같이:
extraData={this.state}
로로 합니다.FlatList
은 합니다.FlatList
state.selected
이 하지 않으면 이 소품을 할 수 없습니다.FlatList
가 없다는 을 알 수 .PureComponent
프로포트의 비교는 변경되지 않습니다.
빠르고 심플한 솔루션을 원하시면 됩니다.
추가 데이터를 부울 값으로 설정합니다.
extraData={this.state.refresh}
목록을 다시 렌더링/새로 고치려는 경우 부울 상태 값 전환
this.setState({ refresh: !this.state.refresh })
쉽네요. ,, 건, 냥, 용, 용, 용으로 쓰면 돼요.extraData
Flat List 또는 Virtualized List가 정상에서 객체가 변경되었는지 확인하는 추가 데이터가 백그라운드에서 작동하는 방식을 볼 수 있습니다.onComponentWillReceiveProps
★★★★★★ 。
여러분이 할 꼭 수 있는 것입니다.extraData
.
제가 하는 일은 다음과 같습니다.
저는 불변의.js를 사용하고 있기 때문에 보고 싶은 것이 모두 포함된 지도(불변의 객체)를 전달하기만 하면 됩니다.
<FlatList
data={this.state.calendarMonths}
extraData={Map({
foo: this.props.foo,
bar: this.props.bar
})}
renderItem={({ item })=>((
<CustomComponentRow
item={item}
foo={this.props.foo}
bar={this.props.bar}
/>
))}
/>
하면, ★★★★★★★★★★★★★★★★★★★★★★.this.props.foo
★★★★★★★★★★★★★★★★★」this.props.bar
변변, 리 changeCustomComponentRow
불변의 객체가 이전과 다른 객체가 되기 때문에 갱신됩니다.
알겠습니다. FlatList가 데이터 프로펠러 이외의 데이터 변경을 인식하도록 하려면 이를 extraData로 설정해야 합니다.그래서 지금 이렇게 하겠습니다.
<FlatList data={...} extraData={this.state} .../>
참조처: https://facebook.github.io/react-native/docs/flatlist#extradata
많은 검색과 진정한 답을 찾던 끝에 마침내 나는 그것이 가장 좋다고 생각하는 답을 얻었다.
<FlatList
data={this.state.data}
renderItem={this.renderItem}
ListHeaderComponent={this.renderHeader}
ListFooterComponent={this.renderFooter}
ItemSeparatorComponent={this.renderSeparator}
refreshing={this.state.refreshing}
onRefresh={this.handleRefresh}
onEndReached={this.handleLoadMore}
onEndReachedThreshold={1}
extraData={this.state.data}
removeClippedSubviews={true}
**keyExtractor={ (item, index) => index }**
/>
.....
주요 문제는 (KeyExtractor) 이렇게 사용하지 않았다는 것입니다.keyExtractor={(항목) => item.아이디(ID) 이렇게 바꾸면 마법처럼 작동했어요. 이게 누군가에게 도움이 됐으면 좋겠어요.
버튼을 사용할 경우 onPress 내부의 setState로 데이터를 업데이트할 수 있습니다.그런 다음 SetState가 플랫리스트를 다시 렌더링합니다.
이전 답변의 연장선입니다.두 가지 사항을 확인해야 합니다. extraData를 추가하고 keyExtractor가 고유해야 합니다.keyExtractor가 일정할 경우 렌더는 트리거되지 않습니다.
<FlatList
data={this.state.AllArray}
extraData={this.state.refresh}
renderItem={({ item,index })=>this.renderPhoto(item,index)}
keyExtractor={item => item.id}
>
</FlatList>
const [itemSelected, setItemSelected] = setState(null);
....
const FlatListItem = (item) => {
return (
<TouchableOpacity onPress={() => setItemSelected(item.id)}>
<View style={ (itemSelected === item.id) ? style.itemWrapperActive : style.itemWrapper }>
<Text>{ item.label }</Text>
</View>
</TouchableOpacity>
)
}
....
<FlatList
ItemSeparatorComponent={() => <View style={{ width: 20 }} />}
data={ flatListData }
renderItem={ ({item}) => FlatListItem(item) }
keyExtractor={ (item) => item.id }
extraData={ itemSelected }
/>
는 이 를 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★extraData={this.state}
내용은 아래 해 주세요.
render() {
return (
<View style={styles.container}>
<FlatList
data={this.state.arr}
extraData={this.state}
renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}
/>
</View>
);
}
예에서는 .machine
const [selected, setSelected] = useState(machine)
useEffect(() => {
setSelected(machine)
}, [machine])
교체했습니다.FlatList
SectionList
상태 변경에 대한 올바른 업데이트입니다.
<SectionList
keyExtractor={(item) => item.entry.entryId}
sections={section}
renderItem={this.renderEntries.bind(this)}
renderSectionHeader={() => null}
/>
해야 할 은 ''입니다.section
구조를 :diff 구조:
const section = [{
id: 0,
data: this.state.data,
}]
저에게는 extraData와 아이템 컴포넌트를 한 번 더 드릴다운하는 것이 비결이었습니다.
state = {
uniqueValue: 0
}
<FlatList
keyExtractor={(item, index) => item + index}
data={this.props.photos}
renderItem={this.renderItem}
ItemSeparatorComponent={this.renderSeparator}
/>
renderItem = (item) => {
if(item.item.selected) {
return ( <Button onPress={this.itemPressed.bind(this, item)}>Selected</Button> );
}
return ( <Button onPress={this.itemPressed.bind(this, item)}>Not selected</Button>);
}
itemPressed (item) {
this.props.photos.map((img, i) => {
if(i === item.index) {
if(img['selected') {
delete img.selected;
} else {
img['selected'] = true;
}
this.setState({ uniqueValue: this.state.uniqueValue +1 });
}
}
}
을 '다'에 넣어주세요.extraData
창의적일 수 있어요.
예를 들어, 체크 박스가 있는 리스트의 변경을 취급하고 있는 경우.
<FlatList
data={this.state.data.items}
extraData={this.state.data.items.length * (this.state.data.done.length + 1) }
renderItem={({item}) => <View>
FlatList가 프로포트와 스테이트의 양쪽 모두의 데이터 변화를 인식하도록 하려면 프로포트와 스테이트를 모두 참조하는 오브젝트를 작성하고 플랫 리스트를 갱신할 수 있습니다.
const hasPropOrStateChange = { propKeyToWatch: this.props, ...this.state};
<FlatList data={...} extraData={this.hasPropOrStateChange} .../>
문서: https://facebook.github.io/react-native/docs/flatlist#extradata
react-native-flatlist에서는 extraData라고 하는 속성입니다.아래 행을 플랫리스트에 추가합니다.
<FlatList
data={data }
style={FlatListstyles}
extraData={this.state}
renderItem={this._renderItem}
/>
저는 기능 컴포넌트를 사용하고 있습니다.즉, Flatlist와 redux data를 사용하고 있습니다.저는 Redux 스토어와 함께 모든 주를 관리하고 있습니다.API 호출 후 Flatlist 데이터를 업데이트하기 위한 솔루션입니다.
처음에는 이렇게 하고 있었어요.-
const DATA = useSelector((state) => state.address.address);
<FlatList
style = {styles.myAddressList}
data = {DATA}
renderItem = {renderItem}
keyExtractor = {item => item._id}
ListEmptyComponent = {EmptyList}
ItemSeparatorComponent={SeparatorWhite}
extraData = {refresh}
/>
하지만 데이터는 플랫리스트 데이터를 다시 렌더링하지 않았습니다.
솔루션으로서 다음과 같은 것이 마음에 들었습니다.-
<FlatList
style = {styles.myAddressList}
data = {useSelector((state) => state.address.address)}
renderItem = {renderItem}
keyExtractor = {item => item._id}
ListEmptyComponent = {EmptyList}
ItemSeparatorComponent={SeparatorWhite}
/>
Redux 상태를 변수에 할당하지 않고 플랫리스트 데이터 소스에 직접 전달합니다.
감사해요.
를 사용하는 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.extraData
소품 및 추가 로딩 작업도 수행했습니다.usePrevious
import {useEffect, useRef} from 'react';
export const usePrevious = <T>(value: T): T | undefined => {
const ref = useRef<T>();
useEffect(() => {
ref.current = value;
});
return ref.current;
};
제 아이템에 이렇게 사용했어요.
const prevData = usePrevious({data});
//CODES...
useEffect(() => {
if (prevData?.data === undefined) {
return;
}
if (prevData?.data?.someID !== data?.someId) {
// do something.
showSubChildren(false)
}
}, [data?.AuctionName, prevData, resetItemStates]);
이 일어났냐면요,의 항목이 가 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네.undefined
() 데이터 속성이 변경되었을 .그런 다음 일부 데이터 속성이 변경되었는지 여부를 확인하고 변경되었으면 작업을 수행해야 합니다.
아래와 같이 하면 플랫리스트 아이템 변경이 즉시 반영됩니다.redux를 사용하지 않는 경우에도 컴포넌트에서 이와 유사하게 수행할 수 있습니다.
let list = Object.assign([], state.auctionList);
let objIndex;
//Find index of specific object using findIndex method.
objIndex = list.findIndex(
obj => obj.auction_vehicles.vehicle_id == payload.vehicle_id,
);
// //Update object's property.
list[objIndex].auction_vehicles.time_left = payload.offer_expiry_time;
list[objIndex].auction_vehicles.starting_price = payload.amount;
list[objIndex].auction_vehicles.bidding_status =
payload.highest_bidder_flag;
return { ...state, auctionList: list };
나는 위의 모든 해결책을 시도했다.하나도 안 먹혀.결국 나는 두 가지 선택을 했다.
- 섹션 목록 시도
- 하려면 , 「」를 호출해 주세요.
setState(undefined)
에 다시 를 해서 해 주세요.setState(value)
이렇게 하면 전체 목록이 다시 렌더링됩니다.
두 번째 걸 해봤는데 효과가 있었어요.
사용방법:
onRefresh={true}
면 insideflatList
요소.
Flatlist의 extraData가 작동하지 않아 우연히 redux의 소품을 사용하고 있었습니다.이는 ED209의 답변에 있는 코멘트의 문제와 비슷하게 들렸다.소품을 받았을 때 수동으로 setState를 호출하게 되었습니다.
componentWillReceiveProps(nextProps: StateProps) {
if (this.props.yourProp != null && nextProps.yourProp) {
this.setState({ yourState: processProp(nextProps.yourProp) });
}
}
<FlatList
data={this.state.yourState}
extraData={this.state.yourState}
/>
React 17을 사용하는 사용자는 get Derived State From Props를 사용합니다.
언급URL : https://stackoverflow.com/questions/43397803/how-to-re-render-flatlist
'itsource' 카테고리의 다른 글
angularjs에서의 조건부 ng-model 바인딩 (0) | 2023.02.26 |
---|---|
angular js의 web api에서 csv 파일 다운로드 (0) | 2023.02.26 |
Angular가 DOM에 스코프 업데이트를 추가한 후 메서드를 트리거하는 방법은 무엇입니까? (0) | 2023.02.26 |
Oracle Date Time in Where 절? (0) | 2023.02.26 |
Django에서 템플릿을 사용하지 않고 JSON을 반환하려면 어떻게 해야 하나요? (0) | 2023.02.18 |