2016-03-10 12 views
7

, ben sadece referansla sahne olarak, bu liste öğesine sahne hareketli, aynı değildirReact-Native ListView renderDüzenleme sorunları sahne alır. Doğru yol ya Tepki-Native bir ListView ile çalışma yanlış yol

  1. Geçiş fonksiyonları gördük ve çocuk bileşeni parametreleri çağırmak veya

  2. Geçiş fonksiyonları tanımlanmış parametrelerle sahne olarak ve çözümleri

yok çalışır çocukta hiçbir parametrelerle işlevi çağırmak.

Çağrılan işlev, Redux öğesinin yaratıcılarıdır ve gönderilir. Bu Redux veya bir konudur

Bu // hata olarak snippet'itir pazar (belki ReactJS)-Doğalöğesini tepki

class App extends Component { 

    // On props 
    // data: an Array 
    // doThis: an action creator of Redux 
    // doThat: idem 

    constructor(){ 
    super(); 
    this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 
    } 

    render() { 
    const dataSource = this.ds.cloneWithRows(this.props.data); 

    return (
     <View> 
     <ListView style={{flex:1}} 
      dataSource={dataSource} 
      renderRow={(rowData, sectionID, rowID) => 
       <Item rowData={rowData} 
       //ERROR 
       //onPress={this.props.doThis} 
       //onLongPress={this..props.doThat} 
       //RIGHT NO ERROR TOO 
       onPress={() => this.props.doThis(rowData)} 
       onLongPress={() => this.props.doThat(rowData)} 
       /> 
      } 
      /> 
     </View> 
    ) 
    } 
} 

class Item extends Component { 
    render() { 
    return (
     <View> 
     <TouchableHighlight 
      //ERROR 
      //onPress={() => { this.props.onPress(this.props.rowData) }} 
      //onLongPress={() => { this.props.onLongPress(this.props.rowData) }} 
      //WRONG TOO 
      onPress={this.props.onPress} 
      onLongPress={this.props.onLongPress} 
      > 
      <Text> 
      {rowData} 
      </Text> 
     </TouchableHighlight> 
     </View> 
    ); 
    } 
} 

yoktur iyi olanlar tarafından takip çalışmaları does'nt kod satırları Bu sorunla ilgili bir repo burada https://github.com/srlopez/test Şimdiden teşekkürler

cevap

0

Muhtemelen this kapağınızda ayarlanamayan bir sorun olabilir.

bu şekilde bağlayıcı deneyin: üst düzey geri aramaları bir parametre kabul edersek

class Item extends Component { 
    render() { 
    return (
     <View> 
     <TouchableHighlight 
      onPress={this.props.onPress.bind(this, this.props.rowData)} 
      onLongPress={this.props.onLongPress.bind(this, this.props.rowData)} 
      > 
      <Text> 
      {rowData} 
      </Text> 
     </TouchableHighlight> 
     </View> 
    ); 
    } 
} 
+0

Merhaba @Moti Azu, Gerçekten bilmiyorum Cevabım ve seninkiyle ilgili sorun nedir? İkisi de yanlış. CallRow öğesinin işleyişini doğru bir şekilde geçirmeyi düşünüyordum ve Öğe sadece işlevi çağırıyor. Ama işe yaramıyor. Bu test için bir repo, bana yardımcı olabilirsiniz: [https://github.com/srlopez/test](https://github.com/srlopez/test) – Santi

+0

Hi @Moti Azu önlemek için Genişletilmiş tartışmalar burada (yorumcular gibi) yorumlarımı kaldırdım. Uzun açıklama repoda. Ana bileşenin üzerindeki düğmelere tıklamak iyi çalışır (listeye ekleme, kaldırma, güncelleme vb.), Ancak Listedeki öğelere tıklar, aynı davranışı yapmaz ve tıklatılmış olandan tüm öğeleri kaldırır. İstenen davranış, bir öğenin durumunu değiştirmektir, ancak durum değişir ve kalan öğeleri kaldırın. Benim kötü ingilizce için üzgünüm Moti. – Santi

4

, kendi anonim fonksiyonlar yanı (bir parametre kabul emin olmak gerekir Not: Ok sözdizimi kullanılarak anonim fonksiyonları yaratır işlevimizi otomatik olarak geçerli bağlamdaki this değerine bağlar). Ben ya da geri aramaları yanlış bağlamda (pencere) veya geçirilen argümanları kabul değildi bağlı sorunların bir arada tanık düşünüyorum:

class App extends Component { 

    // On props 
    // data: an Array 
    // doThis: an action creator of Redux 
    // doThat: idem 

    constructor(){ 
    super(); 
    this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 
    } 

    render() { 
    const dataSource = this.ds.cloneWithRows(this.props.data); 

    return (
     <View> 
     <ListView style={{flex:1}} 
      dataSource={dataSource} 
      renderRow={(rowData, sectionID, rowID) => 
       <Item rowData={rowData} 
        onPress={(data) => this.props.doThis(data)} 
        onLongPress={(data) => this.props.doThat(data)} /> 
      }/> 
     </View> 
    ) 
    } 
} 

class Item extends Component { 
    render() { 
    return (
     <View> 
     <TouchableHighlight 
      onPress={() => this.props.onPress(this.rowData)} 
      onLongPress={() => this.props.onLongPress(this.rowData)}> 
      <Text> 
      {rowData} 
      </Text> 
     </TouchableHighlight> 
     </View> 
    ); 
    } 
} 
+0

Teşekkürler @ calvin-belden, Bu [repo] (https://github.com/srlopez/test) onayınızı denerim, ancak sonuç davranışı aynıdır. Kodda 'onPress = {(rowID) => {this.props.update (rowID)}} 'yazarak ListView içinde renderRow ve Item üzerinde' onPress = {() => this.props.onPress (rowID)} ' ve Öğe değişikliği ancak kalan öğeler silinir. – Santi

+0

Öğe bileşeninin "render" işlevinde rowID tanımlandı mı? Üst işleyicinin çağrılıp çağrılmadığını görmek için bir kesme noktası (veya bir şekilde hata ayıklama) kurabilir misiniz? –

+1

Tekrar merhaba @ calvin-belden @ moti-azu. Bitti! Doğru yol, bu 'onPress = {() => this.props.update (parseInt (rowID))} 'üzerinde renderRow ve' onPress = {this.props.onPress} 'öğesindeki gibi.Ama önemli olan, repoda 'rowID 'parse'si. RowID bir dize ve bir sayı değil !. Ardından redüktördeki (Redux) fonksiyon her zaman 0'a dönüşür ve sonra hepsi yanlış! İkinize de çok teşekkürler! – Santi