#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
assections
или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 });
}
}
}