Düz liste nasıl yeniden oluşturulur?


88

ListView'den farklı olarak this.state.datasource'u güncelleyebiliriz. FlatList'i güncellemek veya yeniden oluşturmak için herhangi bir yöntem veya örnek var mı?

Amacım, kullanıcı düğmeye bastığında metin değerini güncellemek ...

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} />

8
FlatList için dokümanlar Bu bir" demek PureComponentsahne eşit sığ kalır eğer render yeniden etmeyeceğini hangi anlamına gelir. Emin herşey olun renderItemişlev değil figüran olarak geçirilir bağlıdır ===güncellemeler sonrasında, aksi takdirde UI güncellemesi olmayabilir değişiklikler üzerine. Bu, dataprop ve üst bileşen durumunu içerir. " Bu tavsiyeye uyuyor musunuz?
Jordan Running

3
Hayır ben birlikte çalıştık ne önemi extraDatave shouldItemUpdateben yeniden işlemek için liste alamadım. Sonunda yaptığım şey durumu temizlemek, bunun işlenmesini beklemek ve ardından durumu güncellemekti. this.setState({ data: null }, () => { this.setState({ data: actualData }) });
Joshua Pinter

Yanıtlar:


193

extraDataFlatList bileşeninizdeki özelliği kullanın .

Belgelerin belirttiği gibi:

Geçerek extraData={this.state}için FlatListbiz emin FlatListzaman kendini yeniden verecek state.selecteddeğişir. Bu pervaneyi ayarlamadan, FlatListherhangi bir öğeyi yeniden oluşturması gerektiğini bilemezsiniz çünkü bu aynı zamanda bir PureComponentve prop karşılaştırması herhangi bir değişiklik göstermez.


36
Redux kullanıyorum ve bu durumda veri gönderiyorum data={this.props.searchBookResults}ve ne işe yarıyor ne extraData={this.state}de extraData={this.props}benim için. Ve data={this.props.searchBookResults}çalışmıyor da. Ne yapalım ?
Sujit

11
<FlatList>... data={this.props.searchBookResults} extraData={this.state.refresh} onPress={()={this.setState({ refresh: !refresh})}
Hayır

9
Ben de aynı sorunla mücadele ediyorum. Neyi extraData
aktardığım önemli

2
@DenisCappelini, extraDataalt öğelerin yeniden oluşturulması gerektiğinde pervaneye aktarılan verilerin değiştiğinden emin olun . Örneğin, liste öğeleri etkin / devre dışı olabilirse, durum değişkeninin, ister this.statenesnenin bir parçası ister nesnenin this.propsiçeri girmesi gereken şey olduğundan emin olun extraData. Bir imleç veya bir dizi etkin öğe vb.
Olabilir

1
@Sujit Ben de aynı sorunla karşılaşıyordum ama sonra bunu shouldComponentUpdate()güncellediğimde veya tamamen yorum yaptığımda, işlerin dokümantasyonda anlatıldığı gibi çalıştığını fark ettim .
JanithaR

54

Hızlı ve basit çözüm için Deneyin:

  1. ekstra veriyi bir boole değerine ayarlayın.

    extraData = {this.state.refresh}

  2. Listeyi yeniden oluşturmak / yenilemek istediğinizde boole durumunun değerini değiştirin

    this.setState({ 
        refresh: !this.state.refresh
    })
    

Veri propuna veri ekleyeceğim için tam olarak ihtiyacım olan şey bu. Ayrıca, bu React-Native ekibi tarafından çok tuhaf bir uygulama ... veriler üzerinde bir yenileme işlevi veya özelliğine sahip olmak çok daha mantıklı olacaktır. IE: this.data.refresh(). Bunun yerine, bir boole ayarlayıp değiştiriyoruz. Boolean değerinin kendisinin bir anlamı yoktur, öyleyse var olan anlamı nedir? ... (Verileri doğru yenilemekten başka bir anlamı yok mu?)
YungGun

@HradeshKumar Yapıyorum ama Data'nın içindeki son öğe yok olamaz!
Devas

bu cazibe gibi this.state.usersçalışıyor, ancak bazı kullanıcılarda bayrağı değiştiriyor olmama rağmen neden çalışmadığını hala bilmiyorum .
shyammakwana.me

Benim için işe yaramıyor, lütfen yardım edebilir misiniz: stackoverflow.com/questions/65547030/…
Gayatri Dipali

21

Oh bu kolay, sadece kullan extraData

Ekstra verilerin perde arkasında nasıl çalıştığını görüyorsunuz , FlatList veya VirtualisedList , nesnenin normal bir onComponentWillReceivePropsyöntemle değişip değişmediğini kontrol ediyor .

Yani tek yapmanız gereken, 'a değişen bir şey verdiğinizden emin olmaktır extraData.

İşte yaptığım şey:

İmmutable.js kullanıyorum, bu yüzden tek yaptığım, izlemek istediğim şeyi içeren bir Harita (değişmez nesne) iletmek.

<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}
        />
    ))}
/>

Bu şekilde, ne zaman this.props.fooveya this.props.bardeğiştiğinde CustomComponentRowgüncelleniriz, çünkü değişmez nesne öncekinden farklı olacaktır.


2
sonunda anladım extraData! VirtualisedListkoda bağlantı için teşekkürler !
Tushar Koul

merhaba, @ SudoPiz Son öğeyi sildikten sonra Düz Listeyi yeniden işlemek istiyorum, bu Q stackoverflow.com/questions/58780167/…
Oliver D

6

Tamam, şimdi öğrendim ki, FlatList'in veri propunun dışındaki veri değişimini bilmesini istiyorsak, onu extraData olarak ayarlamamız gerekiyor, bu yüzden bunu şimdi yapıyorum:

<FlatList data={...} extraData={this.state} .../>

bakın: https://facebook.github.io/react-native/docs/flatlist#extradata


2
En iyi uygulama ... Ben onu data prop ile aynı şekilde ayarlamayı tercih ettim, bu yüzden durumdaki herhangi bir şey değiştiğinde yenilenmiyor, ama bu açık ara EN KOLAY uygulama. Teşekkürler!
Robert Kehoe

merhaba, @MahdiBashirpour Son öğeyi sildikten sonra Düz Listeyi yeniden oluşturmak istiyorum, bu Q stackoverflow.com/questions/58780167/…
Oliver D

4

Bir Düğmeye sahip olacaksanız, verileri onPress içindeki bir setState ile güncelleyebilirsiniz. SetState daha sonra FlatList'inizi yeniden işleyecektir.


3
dokunulabilir vurgulayıcımda bir setState var. setState iyi çalışıyor ancak düz liste durum değerinin güncellemesini göstermiyor -> this.state.value
shalonteoh

FlastList'inizdeki değerler, veri kaynağını doğrudan güncellemediğiniz için güncellenmiyor. this.state.data, FlatList ile işlenen şeydir, ancak onPress'te yalnızca this.state.value'yu güncelliyorsunuz.
WilliamC

üzgünüm hatam, soru yazım hatası. this.state.data olmalıdır [index] .value
shalonteoh

4

Pek çok arama yaptıktan ve gerçek cevabı aradıktan sonra sonunda cevabı aldım ki bunun en iyisi olduğunu düşünüyorum:

       <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 }**
              />
    .....

ana problemim (KeyExtractor) bunu böyle kullanmıyordum. çalışmıyor: keyExtractor = {(item) => item.ID} bunu değiştirdikten sonra cazibe gibi çalıştı umarım bu birine yardımcı olur.


değerini this.state.refreshingve işlevini koyabilir misin handleRefresh?
DevAS

2

Buradaki önceki cevapların bir uzantısı. Emin olmak için iki bölüm, extraData eklediğinizden ve keyExtractor'ınızın benzersiz olduğundan emin olun. KeyExtractor'ınız sabitse, yeniden oluşturucu tetiklenmeyecektir.

<FlatList
data={this.state.AllArray}
extraData={this.state.refresh}
renderItem={({ item,index })=>this.renderPhoto(item,index)}
keyExtractor={item => item.id}
>
                                    </FlatList>

1

Bu sorunu ekleyerek extraData={this.state}çözdüm Daha fazla ayrıntı için lütfen aşağıdaki kodu kontrol edin

render() {
    return (
      <View style={styles.container}>
        <FlatList
          data={this.state.arr}
          extraData={this.state}
          renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}
        />
      </View>
    );
  }

0

Ben yerini almıştır FlatListile SectionListve devlet değişikliği düzgün güncellemeleri.

<SectionList
  keyExtractor={(item) => item.entry.entryId} 
  sections={section}
  renderItem={this.renderEntries.bind(this)}
  renderSectionHeader={() => null}
/>

Akılda tutulması gereken tek şey section, diff yapısına sahip olmasıdır:

const section = [{
  id: 0,
  data: this.state.data,
}]

0

Benim için işin püf noktası extraData ve öğe bileşenini bir kez daha incelemek oldu

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 });
    }
  }
}

0

Etkileşiminizle değiştirilecek değişkenleri şuraya koyun: extraData

Yaratıcı olabilirsiniz.

Örneğin, üzerlerinde onay kutuları bulunan değişen bir listeyle uğraşıyorsanız.

<FlatList
      data={this.state.data.items}
      extraData={this.state.data.items.length * (this.state.data.done.length + 1) }
      renderItem={({item}) => <View>  


0

React-native-flatlist'te, extraData olarak adlandırılan bir özelliktir. Aşağıdaki satırı düz listenize ekleyin.

 <FlatList
          data={data }
          style={FlatListstyles}
          extraData={this.state}
          renderItem={this._renderItem}
       />

0

Bu örnekte, yeniden oluşturmayı zorlamak için değişkeni değiştirin machine

const [selected, setSelected] = useState(machine)

useEffect(() => {
    setSelected(machine)
}, [machine])

-1

Sadece kullan:

onRefresh={true}

flatListbileşeninizin içinde .


1
bu bir hata yaratır, o zaman refreshingpervane kullanmanız gerekir
mahmoudafer

-1

Flatlist'in extraData benim için çalışmıyordu ve redux'ten bir destek kullanıyordum. Bu, ED209'un cevabındaki yorumlardan gelen sorunlara benziyordu. Pervaneyi aldığımda setState'i manuel olarak çağırdım.

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 kullananlar için getDerivedStateFromProps kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.