#react-native #styles #mapping #border-radius
#react-native #стили #сопоставление #граница-радиус
Вопрос:
Я создал три кнопки, используя map
, а 1-я и 3-я кнопки расположены borderRadius
сбоку.
Вот как это выглядит :
Хотя я в любом случае отображал кнопки, как ожидалось, но я чувствую, что этот код должен быть лучше, чем я сделал. Кроме того, я не уверен, можно ли сопоставлять кнопки таким образом..
Мой код ниже :
const styles = StyleSheet.create({
row: {
flexDirection: 'row',
justifyContent: 'flex-end',
marginRight: 15,
marginTop: 15,
},
btnWrap: {
width: 50,
height: 24,
backgroundColor: colors.white_two,
borderWidth: 0.5,
borderColor: colors.very_light_pink_five,
justifyContent: 'center',
alignItems: 'center',
},
textStyle: {
fontSize: 10,
fontWeight: 'normal',
color: colors.very_light_pink_five,
},
btnLeft: {
borderTopLeftRadius: 6,
borderBottomLeftRadius: 6,
},
btnRight: {
borderTopRightRadius: 6,
borderBottomRightRadius: 6,
},
btnMiddle: {
borderLeftWidth: 0,
borderRightWidth: 0,
},
selected: {
backgroundColor: colors.black,
},
selectedText: {
color: colors.white_two,
},
});
const pointType = ['one', 'two', 'three'];
const MypagePoint = ({ totalPoint }) => {
const [btnClicked, setBtnClicked] = useState(null);
return (
<View style={[styles.container]}>
<View style={[styles.row, { marginBottom: 15 }]}>
{pointType.map((type, index) => (
<TouchableOpacity
style={[
styles.btnWrap,
btnClicked === index amp;amp; styles.selected,
// This is the part I doubt
index === 0 amp;amp; styles.btnLeft,
index === 1 amp;amp; styles.btnMiddle,
index === 2 amp;amp; styles.btnRight,
]}
onPress={() => setBtnClicked(index)}
>
<Text
style={[
styles.textStyle,
btnClicked === index amp;amp; styles.selectedText,
]}
>
{type}
</Text>
</TouchableOpacity>
))}
</View>
</View>
);
};
Не могли бы вы сообщить мне лучший способ кодирования?
Ответ №1:
Старое решение: вместо этого используйте тернарный оператор.
Обновлено: создайте вспомогательную функцию и используйте стиль закругленных углов только для первой и последней кнопок.
Рабочий пример: закуска на выставке
import React, { useState, useEffect } from 'react';
import {
Text,
View,
StyleSheet,
TouchableOpacity,
FlatList,
} from 'react-native';
import Constants from 'expo-constants';
const styles = StyleSheet.create({
row: {
flexDirection: 'row',
justifyContent: 'flex-end',
marginRight: 15,
marginTop: 15,
},
btnWrap: {
width: 50,
height: 24,
backgroundColor: 'white',
borderWidth: 1,
borderColor: 'pink',
justifyContent: 'center',
alignItems: 'center',
margin: -2,
},
textStyle: {
fontSize: 10,
fontWeight: 'normal',
color: 'pink',
},
btnLeft: {
borderTopLeftRadius: 6,
borderBottomLeftRadius: 6,
},
btnRight: {
borderTopRightRadius: 6,
borderBottomRightRadius: 6,
},
selected: {
backgroundColor: 'black',
},
selectedText: {
color: 'white',
},
});
const pointType = ['one', 'two', 'three', 'four', 'five', 'six'];
export default MypagePoint = ({ totalPoint }) => {
const [btnClicked, setBtnClicked] = useState(null);
const buttonStyle = (index) => {
if (index === 0) return styles.btnLeft;
else if (index === pointType.length - 1) return styles.btnRight;
};
return (
<View style={[styles.container]}>
<View style={[styles.row, { marginBottom: 15 }]}>
{pointType.map((type, index) => (
<Button
index={index}
btnClicked={btnClicked}
buttonStyle={buttonStyle}
setBtnClicked={setBtnClicked}
type={type}
/>
))}
</View>
</View>
);
};
const Button = ({ index, btnClicked, buttonStyle, setBtnClicked, type }) => {
return (
<TouchableOpacity
style={[
styles.btnWrap,
btnClicked === index amp;amp; styles.selected,
buttonStyle(index),
]}
onPress={() => setBtnClicked(index)}>
<Text
style={[styles.textStyle, btnClicked === index amp;amp; styles.selectedText]}>
{type}
</Text>
</TouchableOpacity>
);
};
Комментарии:
1. Правильно.. Я могу использовать троичный оператор, чтобы выглядеть аккуратно. Могу ли я спросить, можно ли использовать
map
для кнопок ..?2. карта выглядит аккуратно для меня. но поскольку кнопок всего три, вы могли бы также создать новый компонент и отобразить его без использования map.
3. Это то, что я сделал сначала, но проблема, с которой я столкнулся, заключалась в том, что я не мог изменить стиль кнопки, которая выбрана, поскольку нет
index
, если я не использую map..4. Спасибо, но у меня есть еще один вопрос. Итак, в любом случае, мне нужно использовать map даже после создания компонента button, чтобы изменить цвет выбранной кнопки? Что делать, если есть только две кнопки, но их все равно нужно сопоставить ..?
5. Мы можем использовать условный рендеринг, где мы сравним первую и последнюю кнопки. Подождите, я покажу вам пример