Список разделов React native не отображается повторно при изменении элемента

#reactjs #react-native #react-native-sectionlist

#reactjs #react-native #react-native-sectionlist

Вопрос:

У меня есть список разделов в моем проекте react native. он не рендерится повторно при изменении элемента. Мой код:

test.js

 class Test extends React.Component {
started = false;
causeData=[];
showLess=false;
items = [];

_start = () => {
    const { ws } = this.props;

    this.showLess = false;
    if (ws.causes.length) {
  this.causeData = {
    title: Language.causes,
    key: "cause",
    data: []
  };

  ws.causes.forEach(cause => {
    let causeDetails = {
      key: "cause_"   cause.id,
      name: "",
      value: cause.name,
      sortIndex: cause.sortIndex,
      progress: cause.progress
    };
    this.causeData.data.push(causeDetails);

    if (this.causeData.data.length > 4) {
      this.causeData.data = this.causeData.data.slice(0, 4);
    }
  });
  this.items.push(this.causeData);
  console.log("causeData", this.causeData);
  }  
  }
  }

 _renderItem = ({ item }) => {
     return (
          <View>
          <Text key={item.key} style={styles.text}>{`${item.name}  ${
            item.value
          }`}</Text>
        </View>
  );
 };

_renderSectionHeader = ({ section }) => {
   const { ws } = this.props;
   const showMore = ws.causes.length > 0 amp;amp; !this.showLess;

  return (
    <View style={styles.sectionHeader}>
      <Text key={section.key} style={styles.header}>
        {section.title}
      </Text>
      {showMore amp;amp; (
        <Button
          onPress={this._afterCauseAnswered}
          title={Language.showMore}
          data={this.items}
          accessibilityLabel={Language.causeDoneAccessibility}
        />
      )}
      </View>
    );
    };

   _keyExtractor = (item, index) => item.key;

  _afterCauseAnswered = () => {

    const { stepDone, ws } = this.props;
    this.causeData.data = { ...ws.causes };

    stepDone("showMoreAnswered");
    this.showLess = true;
  };

  render = () => {
  if (!this.started) {
  this.started = true;
  this._start();
  }
  return (
  <View style={styles.container}>
    <SectionList
      sections={this.items}
      extraData={this.items}
      renderItem={this._renderItem}
      renderSectionHeader={this._renderSectionHeader}
      keyExtractor={this._keyExtractor}
    />
  </View>
);
};
}
  

в заголовке моего списка разделов есть кнопка с именем ShowMore. При первоначальном рендеринге он будет отображать только 5 элементов, при нажатии ShowMore он должен отображать весь список. Это моя функциональность. но при нажатии кнопки ShowMore он не будет отображать весь список, только показывает 5 элементов, что означает, что список разделов не будет повторно отображаться. Как это решить? я новичок в react native. Есть идеи, чего мне не хватает? Любая помощь была бы высоко оценена!

Ответ №1:

Сохраняйте items и showLess в состоянии и после нажатия кнопки вызывайте setState с новыми значениями. Он повторно отобразит SectionList . Кроме того, если вы хотите отобразить несколько элементов с отображаемым списком, вам нужно перейти showLess к элементу item, чтобы каждый элемент знал, как его отображать.

Комментарии:

1. на самом деле я не использую setState, я использую redux в своем проекте. «ws.cause» находится в состоянии redux. итак, как это решить

2. Вы можете вызвать this.forceUpdate() , но это не очень хороший подход. Вам нужно передать измененные элементы в SectionList as sections или extraData непосредственно из реквизита. В вашем случае вы меняете элементы, но поскольку значение SectionList sections не поступает из this.state или this.props оно не должно обновлять SectionList

Ответ №2:

Вам просто нужно повторно отобразить свой экран с помощью state, и все готово

 this.setState({})
  

Комментарии:

1. что, если данные поступают из prop?

Ответ №3:

Вы SectionList всегда должны читать из state … поскольку это должен быть ваш единственный источник истины

и вот как:

 class YourComponent extends React.Component {
  state = {
    items: [],
  };

  // This will be called after your action is executed,
  // and your component is about to receive a new set of causes...
  componentWillReceiveProps(nextProps) {
    const {
      ws: { causes: nextCauses },
    } = nextProps;
    if (newCauses) {
      // let items = ...
      // update yout items here
      this.setState({ items });
    }
  }
}