【问题标题】:react-native error : value for date cannot be cast from string to doublereact-native 错误:日期的值不能从字符串转换为双精度
【发布时间】:2019-05-11 16:43:12
【问题描述】:

所以,我有这个reminder component,其中 textInput 是从 react-native 导入的,DatePicker 是从本机库导入的,还有一个按钮可以在点击事件时保存表单。

现在,当我单击日期选择器时,会出现错误提示:value for date cannot be cast from string to double。我还附上了错误的屏幕截图。

不知道哪里出错了。

这是组件的代码。

class Reminder extends Component {

    constructor(props) {
        super(props);
        let formatDate = new Date();
        this.state = {
            chosenDate: formatDate.toISOString().split('T')[0],
            text: '',
        };
        this.handleChangeInput = this.handleChangeInput.bind(this);
        this.saveData = this.saveData.bind(this);
    }


    render() { 
        const {chosenDate} = this.state;
        return ( 
            <View>
                <Form style={styles.formContainer}>
                    <View style={styles.formView}>

                        < TextInput
                            placeholder = "Set your reminder"
                            onChangeText={this.handleChangeInput}
                            value={this.state.text}
                        />

                        <DatePicker
                            defaultDate={chosenDate}
                            mode = "date"
                            animationType={"fade"}
                            androidMode={"default"}
                            placeHolderText="Select date"
                            textStyle={{ color: "green" }}
                            placeHolderTextStyle={{ color: "#d3d3d3" }}
                            onDateChange={(chosenDate) => this.setState({chosenDate})}
                        />
                        <Text style={styles.datePicker}>
                            {chosenDate}
                        </Text>
                    </View>
                    <View style={styles.footer}>
                        <Button block success style={styles.saveBtn} 
                            onPress={ () => 
                                    {
                                    this.saveData()
                                    //console.log('save data', fomattedState);
                                    Alert.alert('Yay!!', 'Succefully saved.')
                                    }
                                } 
                           >
                            <Icon type='MaterialIcons' name='done' />                        
                        </Button>
                    </View>
                </Form>
            </View> 
        );
    }

    handleChangeInput = (input) => {
        this.setState({
            text: input
        });
    }

    //save the input
    saveData() {
        let {chosenDate, ...restOfState} =  this.state;
        let textArray = Object.entries(restOfState).map(([key, value])=> ({[key]: value}));
        let fomattedState = {[chosenDate]:textArray};
        console.log('formatted state', fomattedState);
        AsyncStorage.setItem("key", JSON.stringify(this.fomattedState));
    }
}

【问题讨论】:

    标签: javascript reactjs react-native


    【解决方案1】:

    在 Android 上使用 @react-native-community/datetimepicker 也有同样的问题(iOS 运行良好)。就我而言,我是这样解决的:

    1) 状态变量:

    const [isPickerOpen, setIsPickerOpen] = useState(false);
    const user = useSelector(state => state.user); // Using Redux to store User's birthday
    const parsedBirthday = new Date(moment(user.birthday).format('YYYY-MM-DD'));
    const [birthday, setBirthday] = useState(parsedBirthday);
    

    2) 显示 TextInput 和 Picker:

    <TouchableOpacity onPress={() => showDatepicker()}>
        <TextInput
            style={styles.inputText}
            editable={false}
            pointerEvents='none'
            onTouchStart={() => { showDatePicker() }}
            value={moment(birthday).format('DD-MM-YYYY')}
        />
    </TouchableOpacity>
    {(isPickerOpen) ?
        <View>
            <DatePicker
                minimumDate={new Date(1901, 0, 1)}
                maximumDate={new Date()}
                value={birthday}
                mode='date'
                display='default'
                onChange={datePickerHandler} 
            />
        </View>
     : null
    }
    

    3) 处理程序:

    const showDatePicker = () => {
        setIsPickerOpen(true);
    }
    
    const datePickerHandler = (event, selectedDate) => {
        const currentDate = selectedDate || birthday;
        if (Platform.OS === 'android') setIsPickerOpen(false);
        setBirthday(currentDate);
    }
    

    【讨论】:

      【解决方案2】:

      我在这个@react-native-community/datetimepicker 包中遇到了同样的问题。 所以我用 Moment 库和 JavaScript Date.parse() 方法解决了这个问题:

      const [targetDate, setTargetDate] = useState(
          new Date(
            Date.parse(
              moment(selectedGoal.targetDate, 'DD/MM/YYYY').format(
                'ddd MMM DD YYYY HH:mm:ss ZZ',
              ),
            ),
          ),
        );
      

      【讨论】:

        【解决方案3】:

        该错误很可能是由于您提供的默认日期字段。您正在发送一个字符串。尝试像 Native Base 文档 http://docs.nativebase.io/Components.html#date-picker-def-headref 中指定的那样设置默认日期:

        <DatePicker
                    defaultDate={new Date(2018, 4, 4)}
                    locale={"en"}
                    modalTransparent={false}
                    animationType={"fade"}
                    androidMode={"default"}
                    placeHolderText="Select date"
                    textStyle={{ color: "green" }}
                    placeHolderTextStyle={{ color: "#d3d3d3" }}
                    onDateChange={this.setDate}
                    />
        

        如果可行,那么您应该解析状态中存储在 selectedDate 中的日期,并像我提供的示例一样发送参数......

        let dateNumbers = this.state.chosenDate.split('-');  
        

        然后你有年、日和月

        (3) ["2018", "12", "10"]
        

        您可以将其解析为 int 每个部分,然后您就拥有了设置默认日期所需的内容:

          <DatePicker
                        defaultDate={new Date(parseInt(dateNumbers[0]), parseInt(dateNumbers[1]),parseInt(dateNumbers[2]))}
                        locale={"en"}
                        modalTransparent={false}
                        animationType={"fade"}
                        androidMode={"default"}
                        placeHolderText="Select date"
                        textStyle={{ color: "green" }}
                        placeHolderTextStyle={{ color: "#d3d3d3" }}
                        onDateChange={this.setDate}
                        />
        

        【讨论】:

        • 嗨@Juan 我怎样才能只使用月份和日期来使用这个 parseInt 方法。你能告诉我吗?
        猜你喜欢
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        相关资源
        最近更新 更多