Петля в реале
Я хочу создать список полей в зависимости от количества игроков, которые выбрал пользователь. Я хотел сделать что-то вроде этого:
generatePaymentField() {
var noGuest = this.state.guest;
var payment =
<View>
<View>
<View><Text>No</Text></View>
<View><Text>Name</Text></View>
<View><Text>Preference</Text></View>
</View>;
for (var i=0; i < noGuest; i++) {
payment = payment +
<View>
<View>
<TextInput />
</View>
<View>
<TextInput />
</View>
<View>
<TextInput />
</View>
</View>;
}
return payment;
}
render () {
var payment = this.generatePaymentField();
this.setState({payment : payment});
return (
<View>
{this.state.payment}
</View>;
)
}
Но реакция-родная рассматривала синтаксис выше как "неожиданный токен", указывающий на линию цикла for. Есть ли другой способ добиться этого?
Ответы
Ответ 1
Это должно работать
render(){
var payments = [];
for(let i = 0; i < noGuest; i++){
payments.push(
<View key = {i}>
<View>
<TextInput />
</View>
<View>
<TextInput />
</View>
<View>
<TextInput />
</View>
</View>
)
}
return (
<View>
<View>
<View><Text>No</Text></View>
<View><Text>Name</Text></View>
<View><Text>Preference</Text></View>
</View>
{ payments }
</View>
)
}
Ответ 2
Прежде всего, я рекомендую записать элемент, который вы хотите визуализировать несколько раз (в вашем списке дел полей) в качестве отдельного компонента:
function Field() {
return (
<View>
<View>
<TextInput />
</View>
<View>
<TextInput />
</View>
<View>
<TextInput />
</View>
</View>
);
}
Затем в вашем случае при рендеринге на основе некоторого числа, а не списка, я бы переместил цикл for вне метода render для более читаемого кода:
renderFields() {
const noGuest = this.state.guest;
const fields = [];
for (let i=0; i < noGuest; i++) {
// Try avoiding the use of index as a key, it has to be unique!
fields.push(
<Field key={"guest_"+i} />
);
}
return fields;
}
render () {
return (
<View>
<View>
<View><Text>No</Text></View>
<View><Text>Name</Text></View>
<View><Text>Preference</Text></View>
</View>
{this.renderFields()}
</View>;
)
}
Тем не менее, есть еще много способов рендеринга зацикленного содержимого в реакции native. Большинство способов описаны в в этой статье, поэтому, пожалуйста, проверьте это, если вы заинтересованы в более подробной информации! Примеры в статье из React, но все применимо и к React Native!
Ответ 3
render() {
var myloop = [];
for (let i = 0; i < 10; i++) {
myloop.push(
<View key={i}>
<Text>{i}</Text>
</View>
);
}
return (
<View >
<Text >Welcome to React Native!</Text>
{myloop}
</View>
);
}
}
Ответ 4
render() {
var myloop = [];
for (let i = 0; i < 10; i++) {
myloop.push(
<View key={i}>
<Text style={{ textAlign: 'center', marginTop: 5 }} >{i}</Text>
</View>
);
}
return (
<View >
<Text >Welcome to React Native!</Text>
{myloop}
</View>
);
}
Выход 1 2 3 4 5 6 7 8 9
Ответ 5
Вы можете создать результаты рендеринга (платежи) и использовать причудливый способ перебора элементов вместо добавления цикла for.
const noGuest = 3;
Array(noGuest).fill(noGuest).map(guest => {
console.log(guest);
});
Ответ 6
renderItem(item)
{
const width = '80%';
var items = [];
for(let i = 0; i < item.count; i++){
items.push( <View style={{ padding: 10, borderBottomColor: "#f2f2f2", borderBottomWidth: 10, flexDirection: 'row' }}>
<View style={{ width }}>
<Text style={styles.name}>{item.title}</Text>
<Text style={{ color: '#818181', paddingVertical: 10 }}>{item.taskDataElements[0].description + " "}</Text>
<Text style={styles.begin}>BEGIN</Text>
</View>
<Text style={{ backgroundColor: '#fcefec', padding: 10, color: 'red', height: 40 }}>{this.msToTime(item.minTatTimestamp) <= 0 ? "NOW" : this.msToTime(item.minTatTimestamp) + "hrs"}</Text>
</View> )
}
return items;
}
render() {
return (this.renderItem(this.props.item))
}