#react-native
Вопрос:
У меня есть изображение в каждом TouchableOpacity, и я хотел бы изменить изображение в каждой функции onPress, чтобы она выглядела так, как будто она нажата (например: удалите цвет из изображения и измените его на черно-белый или сделайте светло-серую тень на изображении). и наоборот (когда вы нажимаете, она возвращается к исходному изображению (нажмите: true / false). У меня есть компонент без состояния и нет класса.
Мой компонент :
export default function Recipie({ navigation, route }) {
const recipies = GetRecipies();
return (
<View style={{ flexGrow: 1, flex: 1 }}>
<ScrollView>
{recipies.map((u, i) => {
return (
<View key={i}>
<Text
onPress={navigation.navigate}
style={{
fontSize: 25,
fontFamily: "Cochin",
textAlign: "center",
}}
>
{u._recipieName}
</Text>
<TouchableOpacity
onPress={() => {
navigation.navigate("SingleRecipieScreen", { u });
}}
>
<Image
style={{
height: 200,
width: 350,
borderRadius: 80,
alignSelf: "center",
}}
source={{ uri: u._imgUrl }}
/>
</TouchableOpacity>
<Text
style={{
fontSize: 17,
fontFamily: "Cochin",
textAlign: "center",
}}
>
{u._recipieDescription}
</Text>
<TouchableOpacity
style={{ flex: 1, flexDirection: "column", flexGrow: 1 }}
>
{Show(u._preparationTime)}
</TouchableOpacity>
</View>
);
})}
</ScrollView>
</View>
);
}
Ответ №1:
Попробуйте использовать абсолютную позицию в поле зрения, чтобы закрыть кнопку, и useState для стилей, например :
import React, { useState } from "react";
import { StyleSheet, Text, TouchableOpacity, View,Image } from "react-native";
const App = () => {
const [isPressed, setIsPressed] = useState(0);
const onPress = () => setIsPressed(!isPressed);
return (
<View style={styles.container}>
<TouchableOpacity
style={styles.button}
onPress={onPress}
>
<View style={isPressed amp;amp; styles.pressedButtonStyle} />
<Text> {isPressed ? "Pressed" : " Press Here"}</Text>
<Image
style={ styles.tinyLogo}
source={{
uri: 'https://reactnative.dev/img/tiny_logo.png',
}}
/>
</TouchableOpacity>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
paddingHorizontal: 10,
},
button: {
alignItems: "center",
backgroundColor: "#DDDDDD",
},
tinyLogo: {
width: 50,
height: 50,
},
pressedButtonStyle: {
position:"absolute",
width:"100%",
height:"100%",
backgroundColor:'black',
opacity:0.6,
zIndex:100,
}
});
Комментарии:
1. привет, большое спасибо! как я могу использовать это, если у меня есть уже экспортированная функция без функции стрелки? (у меня такой же компонент, как в примере выше)
2. Создайте компонент, который вы передадите в функцию со стрелкой: recipies.map((u, i) => { return <YoursComponent … реквизит> }
3. Попробуйте разделить пользовательский интерфейс и логику в разных компонентах