ফ্ল্যাটলিস্টটি কীভাবে পুনরায় রেন্ডার করবেন?


88

লিস্টভিউয়ের বিপরীতে আমরা এই.স্টেট.ডেটাসোর্স আপডেট করতে পারি। ফ্ল্যাটলিস্ট আপডেট বা পুনরায় রেন্ডার করার জন্য কি কোনও পদ্ধতি বা উদাহরণ রয়েছে?

আমার লক্ষ্যটি যখন ব্যবহারকারীদের বোতাম টিপুন তখন পাঠ্য মানটি আপডেট করা ...

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 এর জন্য দস্তাবেজ বলুন "এই হল PureComponentযার মানে এটা না পুনরায় রেন্ডার হবে সাজসরঞ্জাম shallow- সমান থাকা। নিশ্চিত করুন যে সবকিছু আপনার করুন renderItemফাংশন উপর একটি ঠেকনা নয় যেমন পাস করা হয়েছে নির্ভর ===আপডেট পরে, অন্যথায় আপনার ইউআই আপডেট নাও হতে পারে পরিবর্তনের জন্য This dataএটিতে প্রোপ এবং প্যারেন্ট উপাদান উপাদান অন্তর্ভুক্ত "" আপনি কি এই পরামর্শ অনুসরণ করছেন?
জর্দান

4
আমি কী দিয়ে চেষ্টা করেছি extraDataএবং shouldItemUpdateতা পুনরায় রেন্ডার করার জন্য তালিকাটি পেলাম না। আমি যা করে শেষ করেছি তা ছিল রাজ্যকে সাফ করা, রেন্ডার হওয়ার অপেক্ষায় এবং তারপরে রাষ্ট্র আপডেট করা। this.setState({ data: null }, () => { this.setState({ data: actualData }) });
জোশুয়া পিন্টার 4

উত্তর:


193

extraDataআপনার ফ্ল্যাটলিস্ট উপাদানটিতে সম্পত্তিটি ব্যবহার করুন ।

নথি হিসাবে বলা হয়েছে:

পাস extraData={this.state}করার মাধ্যমে FlatListআমরা নিশ্চিত হয়েছি FlatListযে state.selectedপরিবর্তনগুলি যখন নিজেকে পুনরায় রেন্ডার করবে । এই প্রপ সেট FlatListনা করে , এটি কোনও আইটেমকে পুনরায় রেন্ডার করতে হবে তা জানতেন না কারণ এটিও একটি PureComponentএবং প্রপসের তুলনাটি কোনও পরিবর্তন দেখায় না।


36
আমি redux ব্যবহার করছি এবং যে ক্ষেত্রে মত ডেটা প্রেরণ data={this.props.searchBookResults}এবং কেউই extraData={this.state}কিংবা extraData={this.props}আমার জন্য কাজ করে যাচ্ছে। এবং data={this.props.searchBookResults}খুব কাজ করছে না। কি করো ?
সুজিত

11
ব্যবহারের extraData: আপনার <FlatList> রিফ্রেশ করতে... data={this.props.searchBookResults} extraData={this.state.refresh} onPress={()={this.setState({ refresh: !refresh})}
বরং

9
আমি একই সমস্যা নিয়ে লড়াই করছি। আমি কী পাস করি তা extraDataনিয়ে কিছু যায় আসে না, উপাদানটি আপডেট হয় না :(
ডেনিস ক্যাপেলিনি

4
@ ডেনিসক্যাপেলিনি, নিশ্চিত করুন যে extraDataযখন শিশু আইটেম [গুলি] পুনরায় রেন্ডার করতে হবে তখন প্রপ পরিবর্তনগুলিতে ডেটা প্রেরণ হয়েছে । উদাহরণস্বরূপ, যদি তালিকাগুলি আইটেমগুলি সক্রিয় / নিষ্ক্রিয় হতে পারে তবে স্থিতি পরিবর্তনশীল কিনা তা নিশ্চিত করুন, this.stateবস্তু বা this.propsবস্তুর অংশটি ভিতরে থাকা উচিত কিনা extraData। এটি একটি কার্সার, বা সক্রিয় আইটেমগুলির একটি অ্যারে ইত্যাদি হতে পারে
সম্রাট_ আর্থ

4
@ সুজিৎ আমি একই ইস্যুতে চলছিলাম তবে আমি বুঝতে পেরেছিলাম যে আমি বাস্তবায়ন করেছি shouldComponentUpdate(), একবার আমি এটি আপডেট করেছি বা সম্পূর্ণ মন্তব্য করার পরে ডকুমেন্টেশনে বর্ণিত জিনিসগুলি ঠিক কাজ করছে।
জনিথআর

54

দ্রুত এবং সহজ সমাধানের জন্য চেষ্টা করুন:

  1. একটি বুলিয়ান মান অতিরিক্ত তথ্য সেট করুন।

    অতিরিক্তডাটা = {this.state.refresh resh

  2. আপনি পুনরায় রেন্ডার / তালিকা রিফ্রেশ করতে চাইলে বুলিয়ান রাষ্ট্রের মান টগল করুন

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

আমি ঠিক প্রোপগুলিতে ডেটা যুক্ত করব তাই এটি আমার প্রয়োজন। এছাড়াও, এটি প্রতিক্রিয়া-নেটিভ টিমের একটি দুর্দান্ত অদ্ভুত বাস্তবায়ন ... এটি ডেটাতে রিফ্রেশ ফাংশন বা সম্পত্তি রাখার উপায়টিকে আরও বোঝাতে চাই। অর্থাৎ, this.data.refresh()। পরিবর্তে, আমরা একটি বুলিয়ান সেট করি এবং এটি পরিবর্তন করি। বুলিয়ান্স মানটির নিজস্ব কোনও অর্থ নেই, সুতরাং এটির মধ্যে কী কী বিদ্যমান? ... (ডেটা রিফ্রেশ করার অধিকার ছাড়া অন্য কোনও মানে নেই?)
ইউংগুন

@ হরেশকুমার আমি এটি করি তবে ডেটার অভ্যন্তরে শেষ আইটেমটি অদৃশ্য হতে পারে না!
ডিভাস

এটি মোহন এর মতো কাজ করে, তবে আমি এখনও this.state.usersকিছুটা কেন জানি না কেন কাজ করছিলাম না, যদিও আমি কিছু ব্যবহারকারীর মধ্যে একটি পতাকা পরিবর্তন করছি।
shyammakwana.me

আমার জন্য কাজ করে না, আপনি দয়া করে সহায়তা করতে পারেন: stackoverflow.com/questions/65547030/…
গায়ত্রী দিপালি

21

ওহ এটি সহজ, কেবল ব্যবহার করুন extraData

আপনি দেখতে পাচ্ছেন যে অতিরিক্ত ডেটা পর্দার আড়ালে কাজ করে তা হ'ল ফ্ল্যাটলিস্ট বা ভার্চুয়ালাইজডলিস্ট কেবলমাত্র ওয়েদারকে পরীক্ষা করে যা কোনও সাধারণ onComponentWillReceivePropsপদ্ধতির মাধ্যমে বস্তুটি পরিবর্তিত হয়েছিল

সুতরাং আপনাকে যা করতে হবে তা হ'ল নিশ্চিত করুন যে আপনি এমন কিছু দিয়েছেন যা এর পরিবর্তিত হয় extraData

আমি যা করি তা এখানে:

আমি অপরিবর্তনীয়.জেএস ব্যবহার করছি তাই আমি যা করি তা হ'ল আমি একটি মানচিত্র (অপরিবর্তনীয় বস্তু) পাস করি যা আমি যা দেখতে চাই তা ধারণ করে।

<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পরিবর্তন CustomComponentRowহবে , আমাদের আপডেট হবে, কারণ অপরিবর্তনীয় বস্তু আগেরটির চেয়ে আলাদা হবে।


4
অবশেষে বুঝলাম extraData! VirtualisedListকোড লিঙ্কের জন্য ধন্যবাদ !
তুষার কাউল

হ্যালো, @ SudoPiz আমি চাই শেষ আইটেম মুছে ফেলার পর Flatlist পুনরায় রেন্ডার, এই প্রশ্ন পরীক্ষা করতে পারবেন stackoverflow.com/questions/58780167/...
অলিভার ডি

6

ঠিক আছে I

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

এখানে দেখুন: https://facebook.github.io/react-native/docs/flatlist#extradata


4
সর্বোত্তম বাস্তবায়ন ... আমি এটিকে ডেটা প্রপের মতোই সেট করতে পছন্দ করেছি, তাই রাজ্যের কোনও কিছু পরিবর্তিত হলে তা রিফ্রেশ হয় না, তবে এটি এতদূর EASIEST বাস্তবায়ন। ধন্যবাদ!
রবার্ট কেহো

হ্যালো, @MahdiBashirpour আমি গত আইটেমটি মুছে ফেলার পর Flatlist পুনরায় প্রদান করতে চান, এই প্রশ্ন পরীক্ষা করতে পারবেন stackoverflow.com/questions/58780167/...
অলিভার ডি

4

আপনি যদি একটি বাটন রাখতে চলেছেন তবে আপনি অনপ্রেসের অভ্যন্তরে সেটস্টেটের সাহায্যে ডেটা আপডেট করতে পারেন। সেটস্টেট তারপরে আপনার ফ্ল্যাটলিস্টকে পুনরায় রেন্ডার করবে।


4
আমার স্পর্শযোগ্য হাইটলাইটে একটি সেটস্টেট রয়েছে। সেটস্টেটটি ঠিকঠাক কাজ করছে তবে ফ্ল্যাটলিস্ট রাষ্ট্রীয় মূল্য -> this.state.value
shalonteoh

আপনার ফ্লস্টলিস্টের মানগুলি আপডেট হচ্ছে না কারণ আপনি সরাসরি ডেটা উত্সটি আপডেট করছেন না। এই.স্টেট.ডেটা ফ্ল্যাটলিস্টের সাথে রেন্ডার করা হয় তবে অনপ্রেসে আপনি কেবলমাত্র এই স্টেট.ভ্যালু আপডেট করছেন।
উইলিয়ামসি

দুঃখিত, আমার ভুল, প্রশ্ন টাইপ। এই.স্টেট.ডেটা [সূচক] হওয়া উচিত। মূল্য
শ্যালনটহো

4

প্রচুর অনুসন্ধান এবং বাস্তব উত্তর সন্ধানের পরে অবশেষে আমি উত্তর পেয়েছি যা আমি মনে করি এটি সেরা:

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

আমার মূল সমস্যাটি ছিল (কীেক্সট্র্যাক্টর) আমি এটি এটি ব্যবহার করছিলাম না। কাজ করছে না: কী এক্সট্রাক্টর = {(আইটেম) => আইটেম.আইডি i আমি এতে পরিবর্তিত হওয়ার পরে এটি মনোমুগ্ধকর মতো কাজ করেছে আশা করি আশা করি এটি কাউকে সাহায্য করবে।


আপনি কি মূল্য this.state.refreshingএবং ফাংশন রাখতে পারেন handleRefresh?
ডেভাস

2

পূর্ববর্তী উত্তরের এখানে কেবল একটি এক্সটেনশন। দুটি অংশ নিশ্চিত করার জন্য, আপনি অতিরিক্ত ডেটা যুক্ত করেছেন এবং আপনার কী-এক্সেক্টরেক্টরটি অনন্য sure যদি আপনার কী-এক্সট্রাক্টর স্থির থাকে তবে একটি রিরেন্ডার ট্রিগার হবে না।

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

1

আমি আরও যুক্ত করার 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>
    );
  }

0

আমি এর FlatListসাথে প্রতিস্থাপন করেছি SectionListএবং এটি রাষ্ট্র পরিবর্তন সম্পর্কে সঠিকভাবে আপডেট।

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

একমাত্র জিনিসটি মনে রাখা দরকার যেগুলি sectionবিভিন্ন কাঠামোযুক্ত:

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

0

আমার জন্য, কৌশলটি অতিরিক্ত ডেটা ছিল এবং আইটেমের উপাদানটিতে আরও একবার ড্রিল করা হয়েছিল

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

ভেরিয়েবলগুলি রাখুন যা আপনার ইন্টারঅ্যাকশন দ্বারা পরিবর্তিত হবে extraData

আপনি সৃজনশীল হতে পারেন।

উদাহরণস্বরূপ, যদি আপনি সেগুলিতে চেকবক্সগুলির সাথে পরিবর্তিত তালিকার সাথে সম্পর্কিত হন।

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

0

যদি আমরা ফ্ল্যাটলিস্টটি ডেটা প্রপ এবং রাজ্য উভয়ই পরিবর্তন করে তা জানতে চাই , আমরা প্রোপ এবং রাজ্য উভয়কেই উল্লেখ করে একটি অবজেক্ট তৈরি করতে পারি এবং ফ্ল্যাটলিস্টটি রিফ্রেশ করতে পারি।

const hasPropOrStateChange = { propKeyToWatch: this.props, ...this.state};
<FlatList data={...} extraData={this.hasPropOrStateChange} .../>

দস্তাবেজ: https://facebook.github.io/react-native/docs/flatlist#extradata


0

প্রতিক্রিয়া-নেটিভ-ফ্ল্যাটলিস্টে, এগুলি অতিরিক্ত সম্পত্তি হিসাবে পরিচিত একটি সম্পত্তি D আপনার ফ্ল্যাটলিস্টে নীচের লাইনটি যুক্ত করুন।

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

0

এই উদাহরণে, পুনরায় রেন্ডার করতে বাধ্য করতে, কেবল পরিবর্তনশীল পরিবর্তন করুন able machine

const [selected, setSelected] = useState(machine)

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


-1

ফ্ল্যাটলিস্টের এক্সট্রাটাটা আমার জন্য কাজ করছিল না এবং আমি ঘটনাকে রিডুএক্স থেকে প্রপ ব্যবহার করছিলাম। এটি ED209 এর উত্তরের মন্তব্যগুলিতে সমান মনে হয়েছিল। আমি যখন প্রপসটি পেয়েছি তখন আমি ম্যানুয়ালি সেটস্টেট কল করে শেষ করেছি।

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

আপনারা যারা ব্যবহার করছেন> 17 প্রতিক্রিয়া ব্যবহারের জন্য getDerivedStateFromProp ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.