状态未在 React Native 中更新
state is not updating in react native
实际上它并没有在所有地方更新我想它会更新。
import React, { useState, useRef } from "react";
import {
View,
Text,
StyleSheet,
StatusBar,
ScrollView,
TouchableOpacity,
Dimensions,
ActivityIndicator,
} from "react-native";
import { TextField } from "react-native-material-textfield";
import Colors from "../constants/Colors";
const welcomescreen = (props) => {
let [length, setLength] = useState();
let [breadth, setBreadth] = useState();
let [height, setHeight] = useState();
let [volume, setVolume] = useState();
const [loading, setLoading] = useState(false);
const lengthInputHandler = (l) => {
setLength(l);
};
const breadthInputHandler = (br) => {
setBreadth(br);
};
const HeightInputHandler = (h) => {
setHeight(h);
};
let lengthIntPart,
breadthIntPart,
heightIntPart,
lengthinInches,
breadthinInches,
heightinInches,
res;
const volumeCalc = () => {
lengthIntPart = Math.floor(parseFloat(length));
lengthinInches =
(lengthIntPart + (parseFloat(length) - lengthIntPart) / 1.2) * 12;
breadthIntPart = Math.floor(parseFloat(breadth));
breadthinInches =
(breadthIntPart + (parseFloat(breadth) - breadthIntPart) / 1.2) * 12;
heightIntPart = Math.floor(parseFloat(height));
heightinInches =
(heightIntPart + (parseFloat(height) - heightIntPart) / 1.2) * 12;
res = lengthinInches * breadthinInches * heightinInches;
return res;
};
return (
<ScrollView style={styles.screen}>
<StatusBar barStyle="dark-content" />
<View style={styles.form}>
<TextField
label="Length"
onChangeText={lengthInputHandler}
keyboardType="numeric"
textAlignVertical="center"
/>
<TextField
label="Breadth"
onChangeText={breadthInputHandler}
keyboardType="numeric"
/>
<TextField
label="Height"
onChangeText={HeightInputHandler}
keyboardType="numeric"
/>
</View>
<View style={{ alignItems: "center" }}>
<TouchableOpacity
style={styles.calcBtn}
onPress={() => {
setVolume(volumeCalc());
setLoading(true);
setTimeout(() => {
if (volume !== undefined) {
props.navigation.navigate({
name: "resultscreen",
params: {
volume: volume,
},
});
}
setLoading(false);
console.log(volume);
}, 3000);
}}
disabled={!!!length && !!!breadth && !!!height}
>
{!loading ? (
<Text style={styles.text}>Calculate</Text>
) : (
<ActivityIndicator size="small" color={Colors.white} />
)}
</TouchableOpacity>
</View>
<View style={{ width: "90%" }}>
<View style={{ flexDirection: "row", justifyContent: "space-around" }}>
<Text>Volume :</Text>
<Text>{volume} cubic inches </Text> //line 14
</View>
<View style={{ flexDirection: "row", justifyContent: "space-around" }}>
<Text>Volume:</Text>
<Text>{volume / 1728} Cb. Feet</Text>
</View>
<View style={{ flexDirection: "row", justifyContent: "space-around" }}>
<Text>Weight:</Text>
<Text>{volume / 1728 / 25} Metric tonne</Text>
</View>
</View>
</ScrollView>
);
};
export default welcomescreen;
lines numbers are mentioned in comments of the code
idk 为什么会发生这种情况,但是在第 149 行,接近代码末尾时,它工作正常,但是在 onPress
方法中的第 89 行之后,即使在那里它也不会改变状态,而且它通过未定义的 initialstate 本身,我尝试用 0 和 null 之类的值初始化它,但它仍然分别为 console.logged 0 和 null,所以我检查了 undefined 以便它不会转到下一页,如果没有真正的价值
the next screen aka resultscreen
import React from "react";
import { View, Text } from "react-native";
const ResultScreen = (props) => {
const volume = props.route.params.volume;
console.log(volume);
return (
<View>
<Text>{volume}</Text>
</View>
);
};
export default ResultScreen;
`再次在下一个屏幕中,如果我放手,即使它是未定义的,它 console.logs 未定义,我把它放在这里是很明显和愚蠢的,但就是这样'
i have no idea why this is happening
NOTE : But if i press the button twice, it updates the state on the second click , its strange that is happening
为什么要在状态下保存卷?您可以直接在 onPress 操作中导航:
onPress={() => {
let calculatedVolume = volumeCalc();
props.navigation.navigate({
name: "resultscreen",
params: {
volume: calculatedVolume,
},
});
}
另一种方法是计算音量并使用它来设置状态和导航:
onPress={() => {
let calculatedVolume = volumeCalc();
setVolume(calculatedVolume);
props.navigation.navigate({
name: "resultscreen",
params: {
volume: calculatedVolume,
},
});
}
实际上它并没有在所有地方更新我想它会更新。
import React, { useState, useRef } from "react";
import {
View,
Text,
StyleSheet,
StatusBar,
ScrollView,
TouchableOpacity,
Dimensions,
ActivityIndicator,
} from "react-native";
import { TextField } from "react-native-material-textfield";
import Colors from "../constants/Colors";
const welcomescreen = (props) => {
let [length, setLength] = useState();
let [breadth, setBreadth] = useState();
let [height, setHeight] = useState();
let [volume, setVolume] = useState();
const [loading, setLoading] = useState(false);
const lengthInputHandler = (l) => {
setLength(l);
};
const breadthInputHandler = (br) => {
setBreadth(br);
};
const HeightInputHandler = (h) => {
setHeight(h);
};
let lengthIntPart,
breadthIntPart,
heightIntPart,
lengthinInches,
breadthinInches,
heightinInches,
res;
const volumeCalc = () => {
lengthIntPart = Math.floor(parseFloat(length));
lengthinInches =
(lengthIntPart + (parseFloat(length) - lengthIntPart) / 1.2) * 12;
breadthIntPart = Math.floor(parseFloat(breadth));
breadthinInches =
(breadthIntPart + (parseFloat(breadth) - breadthIntPart) / 1.2) * 12;
heightIntPart = Math.floor(parseFloat(height));
heightinInches =
(heightIntPart + (parseFloat(height) - heightIntPart) / 1.2) * 12;
res = lengthinInches * breadthinInches * heightinInches;
return res;
};
return (
<ScrollView style={styles.screen}>
<StatusBar barStyle="dark-content" />
<View style={styles.form}>
<TextField
label="Length"
onChangeText={lengthInputHandler}
keyboardType="numeric"
textAlignVertical="center"
/>
<TextField
label="Breadth"
onChangeText={breadthInputHandler}
keyboardType="numeric"
/>
<TextField
label="Height"
onChangeText={HeightInputHandler}
keyboardType="numeric"
/>
</View>
<View style={{ alignItems: "center" }}>
<TouchableOpacity
style={styles.calcBtn}
onPress={() => {
setVolume(volumeCalc());
setLoading(true);
setTimeout(() => {
if (volume !== undefined) {
props.navigation.navigate({
name: "resultscreen",
params: {
volume: volume,
},
});
}
setLoading(false);
console.log(volume);
}, 3000);
}}
disabled={!!!length && !!!breadth && !!!height}
>
{!loading ? (
<Text style={styles.text}>Calculate</Text>
) : (
<ActivityIndicator size="small" color={Colors.white} />
)}
</TouchableOpacity>
</View>
<View style={{ width: "90%" }}>
<View style={{ flexDirection: "row", justifyContent: "space-around" }}>
<Text>Volume :</Text>
<Text>{volume} cubic inches </Text> //line 14
</View>
<View style={{ flexDirection: "row", justifyContent: "space-around" }}>
<Text>Volume:</Text>
<Text>{volume / 1728} Cb. Feet</Text>
</View>
<View style={{ flexDirection: "row", justifyContent: "space-around" }}>
<Text>Weight:</Text>
<Text>{volume / 1728 / 25} Metric tonne</Text>
</View>
</View>
</ScrollView>
);
};
export default welcomescreen;
lines numbers are mentioned in comments of the code
idk 为什么会发生这种情况,但是在第 149 行,接近代码末尾时,它工作正常,但是在 onPress
方法中的第 89 行之后,即使在那里它也不会改变状态,而且它通过未定义的 initialstate 本身,我尝试用 0 和 null 之类的值初始化它,但它仍然分别为 console.logged 0 和 null,所以我检查了 undefined 以便它不会转到下一页,如果没有真正的价值
the next screen aka resultscreen
import React from "react";
import { View, Text } from "react-native";
const ResultScreen = (props) => {
const volume = props.route.params.volume;
console.log(volume);
return (
<View>
<Text>{volume}</Text>
</View>
);
};
export default ResultScreen;
`再次在下一个屏幕中,如果我放手,即使它是未定义的,它 console.logs 未定义,我把它放在这里是很明显和愚蠢的,但就是这样'
i have no idea why this is happening
NOTE : But if i press the button twice, it updates the state on the second click , its strange that is happening
为什么要在状态下保存卷?您可以直接在 onPress 操作中导航:
onPress={() => {
let calculatedVolume = volumeCalc();
props.navigation.navigate({
name: "resultscreen",
params: {
volume: calculatedVolume,
},
});
}
另一种方法是计算音量并使用它来设置状态和导航:
onPress={() => {
let calculatedVolume = volumeCalc();
setVolume(calculatedVolume);
props.navigation.navigate({
name: "resultscreen",
params: {
volume: calculatedVolume,
},
});
}