#javascript #react-native #jsx
#javascript #react-native #jsx
Вопрос:
У меня есть страница профиля для пользователей, у каждого пользователя есть скорость от 0 до 5. Я хочу заполнить звезды на основе ранга пользователя. например, если скорость пользователя равна 4, мне нужно заполнить 4 звезды, а 1 звезда должна быть пустой
вот мой код в методе рендеринга:
<Text>{item.rate}</Text> // here I get the rate from api 0 to 5
<View>
<Icon name="star" color="#9fa1a7" type="solid" size={16}/>
<Icon name="star" color="#9fa1a7" type="solid" size={16}/>
<Icon name="star" color="#9fa1a7" type="solid" size={16}/>
<Icon name="star" color="#9fa1a7" type="solid" size={16}/>
<Icon name="star" color="#ffffff" type="solid" size={16}/>
</View>
Ответ №1:
Поскольку количество звездочек не меняется, а меняются только их цвета, используйте color={item.rate >= X ? 'color on' : 'color off'}
для каждого значка:
<Text>{item.rate}</Text>
<View>
<Icon name="star" color={item.rate >= 1 ? '#9fa1a7' : '#ffffff'} type="solid" size={16}/>
<Icon name="star" color={item.rate >= 2 ? '#9fa1a7' : '#ffffff'} type="solid" size={16}/>
<Icon name="star" color={item.rate >= 3 ? '#9fa1a7' : '#ffffff'} type="solid" size={16}/>
<Icon name="star" color={item.rate >= 4 ? '#9fa1a7' : '#ffffff'} type="solid" size={16}/>
<Icon name="star" color={item.rate >= 5 ? '#9fa1a7' : '#ffffff'} type="solid" size={16}/>
</View>
Или генерировать звезды из массива, чтобы уменьшить повторение:
<Text>{item.rate}</Text>
<View>{
[1, 2, 3, 4, 5].map(score =>
<Icon
name="star"
color={item.rate >= score ? '#9fa1a7' : '#ffffff'}
type="solid"
size={16}
/>
)
}</View>
Комментарии:
1. Или, более элегантным способом (я думаю), вы можете использовать
[...Array(5)].map(...)
вместо записи весь массив из пяти элементов2. @Milore, хорошее предложение, однако,
[1, 2, 3, 4, 5]
короче. Также я бы использовалArray.from({ length: 5 }, (_, i) => i)
вместо этого, чтобы получить диапазон.3. Да, мое предложение разумно в другом конкурсе, например, в одном с большим количеством элементов для рендеринга
4. @Milore, безусловно, но вы получите только массив
undefined
значений, хотя
Ответ №2:
Примечание: это отвечает на вопрос «как условно отобразить компонент» (т. Е. Заголовок вопроса), но подход, который изменяет цвет звезды, лучше решит проблему OPs.
Вы можете условно отобразить компонент, как показано ниже:
<View>
{condition amp;amp; <Component />}
</View>
Здесь вы хотите отобразить каждую звезду, покрытую rate, поэтому вы ищете что-то вроде этого:
<View>
{item.rate > 0 amp;amp; <Icon name="star" color="#9fa1a7" type="solid" size={16}/>}
{item.rate > 1 amp;amp; <Icon name="star" color="#9fa1a7" type="solid" size={16}/>}
{item.rate > 2 amp;amp; <Icon name="star" color="#9fa1a7" type="solid" size={16}/>}
{/* etc. */}
</View>
Комментарии:
1. Количество звездочек не меняется, только их цвета
2. @jo_va верно, и ваш ответ лучше решает проблему OPs (отсюда и мой голос). Однако вопрос заключается в том, как условно отображать компоненты, поэтому я решил оставить это здесь, поскольку он отвечает на этот аспект.
3. Вы правы, вопрос не так ясен, это правильное решение, 1
Ответ №3:
const itemarry=new Array().fill(item.rate);
render(){
<Text>{item.rate}</Text> // here I get the rate from api 0 to 5
<View>
{itemarry.map((item,index),()=>
<Icon name="star" color="#9fa1a7" type="solid" size={16} />
)}
</View>
}
Комментарии:
1. Как это может работать, каждая звезда будет иметь одинаковый цвет
2. Я думал, что он спрашивает только о печатной звезде. нет звездочек серого цвета. если рейтинг равен 3, то будет напечатано 3 звезды.