react-native - 使用 react-native-dialog 和 date-fns 时变量未在 Formik 中初始化
问题描述
我有一个简单的表格,使用 formik 来计算两个日期的差异。一切正常,除了我无法在对话框中获得结果。该变量在 onSubmit 下定义,我在 console.log 中确认结果确实正确。除了,我似乎可以把它放在对话框上。对话框设置正确,因为我可以调用其他东西,但不能调用我有兴趣调用的变量。我想问题是,变量没有通过 Formik 传递。
这是我的代码:
import React, {useState} from 'react';
import {View, Text, StyleSheet, TextInput, Button, Alert} from 'react-native';
import { Formik } from 'formik';
import DatePicker from 'react-native-datepicker';
import { DateInput } from 'react-native-date-input';
import Dialog from "react-native-dialog";
import { differenceInDays, parse } from "date-fns";
const App = props => {
const [date, setDate] = useState('')
const [date2, setDate2] = useState('')
const [visible, setVisible] = useState(false);
const showDialog = () => {
setVisible(true);
};
const handleCancel = () => {
setVisible(false);
};
return (
<Formik
initialValues={{ date: '', date2: '' }}
onSubmit={values =>
{ console.log(values);
var dubdays = differenceInDays(parse(values.date, "dd MMM yyyy", new Date()), parse(values.date2, "dd MMM yyyy", new Date()));
console.log(dubdays);
showDialog();}
}
>
{({ onDateChange, handleBlur, handleSubmit, setFieldValue, values }) => (
<View>
<Text style={styles.selectDate}>Lab Collection Date</Text>
<DatePicker
style={{ width: 200, alignSelf: 'center' }}
date={date}
mode="date"
placeholder="select date"
format="DD MMM YYYY"
minDate="01 01 2021"
maxDate="31 12 2025"
confirmBtnText="Confirm"
cancelBtnText="Cancel"
customStyles={{
dateIcon: {
position: 'absolute',
left: 0,
top: 4,
marginLeft: 0
},
dateInput: {
marginLeft: 36,
borderRadius: 4
}
// ... You can check the source to find the other keys.
}}
onDateChange={(newDate) => { setFieldValue('date', newDate); setDate(newDate) }}
value={values.date}
onBlur={handleBlur('date')}
/>
<Text style={styles.selectDate}>Symptom Onset Date</Text>
<DatePicker
style={{ width: 200, alignSelf: 'center' }}
date={date2}
mode="date"
placeholder="select date"
format="DD MMM YYYY"
minDate="01 01 2021"
maxDate="31 12 2025"
confirmBtnText="Confirm"
cancelBtnText="Cancel"
customStyles={{
dateIcon: {
position: 'absolute',
left: 0,
top: 4,
marginLeft: 0
},
dateInput: {
marginLeft: 36,
borderRadius: 4
}
// ... You can check the source to find the other keys.
}}
onDateChange={(newDate2) => {setFieldValue('date2', newDate2); setDate2(newDate2)}}
value={values.date2}
onBlur={handleBlur('date2')}
/>
<View style={{width: 200, marginTop: 50, alignSelf: 'center'}} >
<Button onPress={() => { handleSubmit(); }} title="Submit" />
<Dialog.Container visible={visible}>
<Dialog.Title>End of Isolation Date</Dialog.Title>
<Dialog.Description>
{dubdays}
</Dialog.Description>
<Dialog.Button label="Cancel" onPress={handleCancel} />
</Dialog.Container>
</View>
</View>
)}
</Formik>
)
};
const styles = StyleSheet.create({
selectDate: {
fontFamily: 'open-sans',
fontSize: 20,
marginTop: 50,
marginBottom: 10,
alignSelf: 'center',
color: 'red'
},
datebox: {
alignSelf: 'center',
height: 50,
width: 500,
},
container: {
flex: 1,
backgroundColor: "#fff",
alignItems: "center",
justifyContent: "center",
}
});
export default App;
我只是想在对话框中调用 {dubdays}。我对 react-native 还很陌生,所以任何帮助都将不胜感激。
解决方案
好吧,让我们分析一下这段代码:
onSubmit={
values => {
console.log(values);
var dubdays = differenceInDays(parse(values.date, "dd MMM yyyy", new Date()), parse(values.date2, "dd MMM yyyy", new Date()));
console.log(dubdays);
showDialog()
}
}
该变量在此函数中声明,但不用于更新组件的状态。
另请注意,由于您使用var
关键字来声明变量,因此您可能会遇到一些意想不到的行为,如下所述:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#description
因此,如前所述,您应该将 的值dubdays
放在组件状态中,然后使用该状态在对话框中呈现值。这将触发新的渲染,并且该值将按预期在 UI 中可见。
推荐阅读
- node.js - Ubuntu上的node_modules(或npm)有什么问题
- javascript - 为什么这个点击事件处理程序没有执行我的代码?
- javascript - 使用带有谓词对象数组的 lodash 过滤器删除结果数据中的属性的更好方法是什么?
- javascript - 如何将对象数组添加到 HTML 表中?
- android - TouchableOpacity、负边距和 Android 的问题 - React Native
- blazor - 如何将两种方式绑定到子组件中的选择 - Blazor
- python - Python,如何用谷歌搜索结果显示页面?
- css - 是否可以在底部放置红宝石字体?
- discord - 尝试删除具有特定角色的用户发送的所有消息,除非该消息是 !verify
- javascript - 有没有办法将对象从对象推送到数组?(Vue)