#javascript #css #reactjs #typescript #react-native
#javascript #css #reactjs #typescript #react-native
Вопрос:
У меня есть список текстовых элементов, которые я хочу подчеркнуть при нажатии. Если я добавлю текстовое оформление tabText
, то, очевидно, оно будет применено ко всем элементам. Как я могу убедиться, что при нажатии на другую вкладку подчеркивание с предыдущей вкладки удаляется?
Есть ли какой-либо способ, которым я могу добавлять или удалять элементы из элемента стиля при нажатии на элемент?
//onPress={() => {}}>
const tabs = [
{
id: 1,
text: 'Alle List',
},
{
id: 2,
text: 'Second',
},
];
export const Tab: React.FunctionComponent = () => {
return (
<View style={styles.tabView}>
{tabs.map((item: any) => (
<View>
<Text style={styles.tabText}>{item.text}</Text>
</View>
))}
</View>
);
};
const styles = StyleSheet.create({
tabView: {
paddingTop: moderateScale(15),
paddingLeft: moderateScale(20),
paddingRight: moderateScale(20),
flexDirection: 'row',
justifyContent: 'space-between',
},
tabText: {
color: 'white',
paddingBottom: moderateScale(10),
//textDecorationLine: 'underline'
},
});
Codesandbox (с элементами tabText также в виде массива):
Ответ №1:
Вы можете использовать useState для сохранения выбранного индекса, а затем применить другой стиль на основе выбранного индекса. Вот быстрая модификация вашего скрипта, и ссылка на закуску находится в конце.
import * as React from 'react';
import { Text, View, StyleSheet, TouchableOpacity } from 'react-native';
const tabs = [
{
id: 1,
text: 'All Friends',
},
{
id: 2,
text: 'Second',
},
{
id: 3,
text: 'Third',
},
];
export default function App() {
const [selected, setSelected] = React.useState(null)
return (
<View style={styles.container}>
<View style={styles.tabView}>
{tabs.map((item: any, index) => (
<TouchableOpacity onPress={()=>setSelected(index)}>
<View>
<Text style={[styles.tabText,selected===index?styles.selected:null]}>{item.text}</Text>
</View>
</TouchableOpacity>
))}
</View>
</View>
);
}
const styles = StyleSheet.create({
tabView: {
paddingTop: 15,
paddingLeft: 20,
paddingRight: 20,
flexDirection: 'row',
justifyContent: 'space-between',
},
tabText: {
color: 'black',
paddingBottom: 10,
},
selected: {
textDecorationLine: 'underline'
},
});
Комментарии:
1. Можно ли также стилизовать подчеркивание? Например, я добавил к нему цвет, но я хочу увеличить его высоту или, возможно, увеличить расстояние между подчеркиванием и текстом.
textDecorationColor: 'green
,2. возможно, используйте
textUnderlinePosition: 'under'
, вот дополнительная информация css-tricks.com/almanac/properties/t/text-underline-position3. Обновлен Snack со стилями border-bottom
Ответ №2:
Вы можете добавлять разные стили для своей вкладки в зависимости от активного маршрута
<Text style={[(this.props.activeRouteName == route.routeName) ? styles.tabActiveText: styles.tabText]}>{item.text}</Text>
And then in the styles
tabActiveText: {
color: 'white',
paddingBottom: moderateScale(10),
textDecorationLine: 'underline'
}
Комментарии:
1. Спасибо за ваш вклад. Прямо сейчас нет «activeRoute». Это просто обычный текст. И этого нет. свойство здесь либо, поскольку я не использую классы