J'ai une fonction qui bascule la valeur des variables d'état. la valeur initiale de la variable d'état est false
Voici ma fonction ...
expandLists(label){
this.setState( preState => ({label: !this.preState.label}),console.log(this.state))
}
Dans l'expression ci-dessus à l'état initial, la valeur est changée en false puis elle ne change pas en true .
J'ai aussi essayé ... la méthode ci-dessous ...
expandLists(label){ // "label" is a state variable that passed as a string
let result = new Boolean();
console.log(this.state);
if(this.state.label){
result=false;
console.log('Result = false');
}
else{
result=true;
console.log('Result = true');
}
this.setState({[label]: result},console.log(this.state))
}
5 Réponses :
Si vous passez le paramètre label sous forme de chaîne, essayez ceci:
expandLists(label){ // "label" is a state variable that passed as a string
let result = new Boolean();
console.log(this.state);
if(this.state[label]){
result=false;
console.log('Result = false');
}
else{
result=true;
console.log('Result = true');
}
this.setState({[label]: result},console.log(this.state))
}
La différence est donc de vérifier si la valeur actuelle est vraie . Au lieu d'utiliser this.state.label , utilisez this.state[label] .
Vérifiez de cette façon comme vous l'avez dit type de chaîne de paramètre "label"
if(this.state[label]){
...
}
ou
if(this.state.label == "true"){
...
}
Un moyen simple d'y parvenir est
toggleLabelValue = (label) => {
this.setState({ [label]: !this.state[label] }, () =>
console.log(this.state)
);
};Essayez de basculer l'état de cette manière:
import React from 'react';
import {
View,
Button,
} from 'react-native';
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
label: false
}
}
changeLabel = (currentLabel) => {
this.setState({
label: currentLabel
});
};
toggleLabel = () => {
this.changeLabel(!this.state.label);
};
render() {
return (
<View>
<Button onPress={this.toggleLabel} title="Toggle Label" />
</View>
);
}
}
Voici une autre implémentation utilisant des hooks:
import { Text, View, StyleSheet, TouchableOpacity } from 'react-native';
import Constants from 'expo-constants';
export default function App() {
const [label, setLabel] = useState(false);
const toggleLable = () => {
let temp = label;
setLabel(!temp);
};
return (
<View style={styles.container}>
<TouchableOpacity
onPress={toggleLable}
style={[
styles.btn,
{ backgroundColor: label ? '#4f4' : '#f40' },
]}>
<Text style={styles.text}>{label? "TRUE": "FALSE"}</Text>
</TouchableOpacity>
</View>
);
}
const styles = StyleSheet.create({
btn: {
width: 200,
height: 200,
borderRadius: 20,
justifyContent: "center"
},
container: {
flex: 1,
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
padding: 8,
alignItems: 'center',
},
text:{
fontSize: 40,
fontWeight: "bold",
color: "white",
textAlign: "center"
}
});
Capture d'écran:
Vous pouvez jouer avec le code ici: Exemple de bouton à bascule