Как циклически и визуализировать элементы в React-native?
Можно ли закодировать идентичный компонент в функции Render?
Что-то вроде этого:
...
onPress = () => {
...
};
initialArr = [["blue","text1"],["red","text2"]];
buttonsListArr = [];
for (let i = 0; i < initialArr.length; i++)
{
buttonsListArr.push(
<Button style={{borderColor:{initialArr[i][0]}}} onPress={this.onPress.bind(this)}>{initialArr[i][1]}</Button>
);
}
...
render() {
return (
<View style={...}>
{buttonsListArr}
</View>
)};
Я имею в виду, что это всего лишь конечный список компонентов, поэтому в этом конкретном случае любые компоненты, такие как ListView/ScrollView и т.д., Неприменимы. Это просто вопрос синтаксиса.
Ответы
Ответ 1
Обычно вы использовали карту для такого рода вещей.
buttonsListArr = initialArr.map(buttonInfo => (
<Button ... key={buttonInfo[0]}>{buttonInfo[1]}</Button>
);
(ключ является необходимой поддержкой всякий раз, когда вы выполняете сопоставление в React. Ключ должен быть уникальным идентификатором для сгенерированного компонента)
В качестве стороны я бы использовал объект вместо массива. Я считаю, что это выглядит лучше:
initialArr = [
{
id: 1,
color: "blue",
text: "text1"
},
{
id: 2,
color: "red",
text: "text2"
},
];
buttonsListArr = initialArr.map(buttonInfo => (
<Button ... key={buttonInfo.id}>{buttonInfo.text}</Button>
);
Ответ 2
render() {
return (
<View style={...}>
{initialArr.map((prop, key) => {
return (
<Button style={{borderColor: prop[0]}} key={key}>{prop[1]}</Button>
);
})}
</View>
)
}
должен сделать трюк
Ответ 3
Для исходного массива лучше использовать объект вместо массива, так как тогда вы не будете беспокоиться об индексах, и будет намного понятнее, что это такое:
const initialArr = [{
color: "blue",
text: "text1"
}, {
color: "red",
text: "text2"
}];
Для фактического сопоставления используйте карту JS Array вместо цикла loop-for, которая должна использоваться в случаях, когда нет определенного массива, например отображения некоторого определенного количества раз:
onPress = () => {
...
};
renderButtons() {
return initialArr.map((item) => {
return (
<Button
style={{ borderColor: item.color }}
onPress={this.onPress}
>
{item.text}
</Button>
);
});
}
...
render() {
return (
<View style={...}>
{
this.renderButtons()
}
</View>
)
}
Я переместил отображение в отдельную функцию вне метода render для более читаемого кода. Есть много других способов перебрать список элементов в реакции native, и каким образом вы будете использовать, зависит от того, что вам нужно сделать. Большинство этих способов описаны в этой статье о циклах React JSX, и, хотя он использует примеры React, все, что от него может быть использовано в React Native. Пожалуйста, проверьте это, если вы заинтересованы в этой теме!
Кроме того, не на тему цикла, но поскольку вы уже используете синтаксис массива для определения функции onPress, нет необходимости связывать его снова. Это снова применяется только в том случае, если функция определена с использованием этого синтаксиса внутри компонента, так как синтаксис стрелки автоматически связывает функцию.