reactjs - 用 Formik 处理 React Native 中 DateTimePicker 的值
问题描述
我正在使用 Formik 创建一个提醒表单来存储一些信息,包括日期和时间。我在表单中使用DateTimePicker
from时遇到了问题。react-native-modal-datetime-picker
我的主要目标是当用户按下日期或时间输入时,DateTimePicker
将显示。用户选择时间后, DateTimePicker
将该值传递给输入并将该输入显示在屏幕上。当用户按下“提交”按钮时,日志控制台将打印values
出Formik
这是我的代码:
import React from 'react'
import {View, TouchableOpacity} from 'react-native'
import {Button, Input} from 'react-native-elements'
import ModalDropdown from 'react-native-modal-dropdown'
import DateTimePicker from 'react-native-modal-datetime-picker'
import {Formik} from 'formik'
import * as yup from 'yup'
export default class ReminderForm extends React.Component{
constructor(props){
super(props);
this.state = {
isDatePickerVisible: false,
isTimePickerVisible: false,
reminder: {
date: '',
time: '',
//...more properties go here
}
}
}
showDatePicker = () => {//show the picker for Date input
this.setState({ isDatePickerVisible: true });
};
hideDatePicker = () => {
this.setState({ isDatePickerVisible: false });
};
handleDatePicked = date => {
let newDate = new Date(date).toLocaleDateString();
this.setState(prevState=> ({
...prevState,
isDatePickerVisible: !prevState.isDatePickerVisible,
reminder: {
...prevState.reminder,
date: newDate
}
}));
console.log(this.state);
};
showTimePicker = () => {//show the picker for time input
this.setState({ isTimePickerVisible: true });
};
hideTimePicker = () => {
this.setState({ isTimePickerVisible: false });
};
handleTimePicked = time => {
let newTime = new Date(time).toLocaleTimeString();
this.setState(prevState=> ({
...prevState,
isTimePickerVisible: !prevState.isTimePickerVisible,
reminder: {
...prevState.reminder,
time: newTime
}
}))
console.log(this.state)
};
render(){
return(
<View style = {{flex:1}}>
<Formik initialValues = {this.state.reminder}
onSubmit={()=> console.log('Submitted')}
>
{
({values,handleChange,errors,setFieldTouched,touched,isValid,handleSubmit})=>(
<View style ={{flex:1, justifyContent:'space-around'}}>
<TouchableOpacity style ={{flex:1, marginTop: 10, marginBottom:10, backgroundColor:null}}
onPress={this.showDatePicker}>
<Input value = {values.date} inputContainerStyle={{height: '60%'}} onChangeText={handleChange('date')}
onBlur={()=>setFieldTouched('date')} label = "Date" labelStyle = {{fontSize: 15}}/>
</TouchableOpacity>
<DateTimePicker mode="date" isVisible={this.state.isDatePickerVisible}
onConfirm={this.handleDatePicked} onCancel={this.hideDatePicker}/>
<TouchableOpacity style ={{flex:1, marginTop: 10, marginBottom:10, backgroundColor:null}}
onPress={this.showTimePicker}>
<Input value = {values.time}
onChangeText={handleChange('time')} inputContainerStyle={{height: '60%'}}
onBlur={()=>setFieldTouched('time')} label = "Time" labelStyle = {{fontSize: 15}}/>
</TouchableOpacity>
<DateTimePicker mode="time" isVisible={this.state.isTimePickerVisible}
onConfirm={this.handleTimePicked} onCancel={this.hideTimePicker}/>
//..more inputs go here
<Button containerStyle = {{flex:1, marginTop: 10, marginBottom:0}} TouchableComponent={TouchableOpacity}
onPress={()=> console.log(values)} title = "Submit" titleStyle = {{fontSize: 15}}/>
</View>
)
}
</Formik>
</View>
)
}
}
当我运行此代码时,日期和时间输入没有显示我之前选择的值,并且当我在props中DateTimePikcker
提交表单date
和time
属性时为空。values
然后我尝试修复输入的属性:
<TouchableOpacity style ={{flex:1, marginTop: 10, marginBottom:10, backgroundColor:null}}
onPress={this.showDatePicker}>
<Input value = {this.state.reminder.date} inputContainerStyle={{height: '60%'}} onChangeText={handleChange('date')}
onBlur={()=>setFieldTouched('date')} label = "Date" labelStyle = {{fontSize: 15}}/>
</TouchableOpacity>
在这个时候,输入确实显示了我选择的值,DateTimePicker
但是当我提交表单时,date
属性仍然返回 null。问题是我不知道如何更改values
当Formik
用户在DateTimePicker
. 你能帮我弄清楚吗?
还有一个问题是handleSubmit
props 在这里不起作用。我尝试输入console.log()
inonSubmit
属性(您可以在上面的代码中看到),但它不起作用。
解决方案
下面是一个例子。注意 Formik 的setFieldValue的使用。
import React, { useState } from 'react';
import { Button, Text, View } from 'react-native';
import { Formik } from 'formik';
import DateTimePickerModal from 'react-native-modal-datetime-picker';
import moment from 'moment';
export default function Example() {
return (
<Formik initialValues={{ myDate: moment().format('YYYY-MM-DD') }} onSubmit={values => console.log(values)}>
{({ handleSubmit, values, setFieldValue }) => (
<MyForm values={values} setFieldValue={setFieldValue} handleSubmit={handleSubmit} />
)}
</Formik>
);
}
export const MyForm = props => {
const { handleSubmit, values, setFieldValue } = props;
const [isDatePickerVisible, setDatePickerVisibility] = useState(false);
const showDatePicker = () => {
setDatePickerVisibility(true);
};
const hideDatePicker = () => {
setDatePickerVisibility(false);
};
const handleConfirm = date => {
setFieldValue('myDate', moment(date).format('YYYY-MM-DD'))
hideDatePicker();
};
return (
<View>
<Text onPress={showDatePicker}>{moment(values.myDate).format('YYYY-MM-DD')}</Text>
<DateTimePickerModal
isVisible={isDatePickerVisible}
mode="date"
onConfirm={handleConfirm}
onCancel={hideDatePicker}
date={moment(values.myDate).toDate()}
/>
<Button title="Submit" onPress={handleSubmit} />
</View>
);
}
推荐阅读
- tensorflow - Permission denied: '/tmp/.tensorboard-info/pid-31318.info' 在运行 tensorboard 后尝试访问 tensorboard 文件时
- azure - 逻辑应用需要多少个 Azure 服务总线实例?
- flutter - 在 BoxDecoration 上为容器添加 labelText(作为 TextField)
- bash - Bash:根据文件名中的日期范围查找所有文件
- python - PySpark toPandas 函数正在改变列类型
- javascript - 如何从 Nodejs 的父目录中正确导出和要求?
- python - 一键多值
- python-3.x - DataFrame - 删除“word”列中包含停用词或数字的行
- caching - 我们可以在堆内存上使用非临时 mov 指令吗?
- user-interface - 带有电子表格范围内的值的 Google 表格侧边栏用户输入下拉菜单