В моем проекте React Native я использую React Hooks в функциональном компоненте, чтобы установить состояние моего хранилища Redux.Затем значение из хранилища, которое я пытаюсь передать в дочерний компонент с помощью prop
с именем timestamp
Проблема заключается в том, что дочерний компонент использует компонент DateTimePicker
(из *).1006 *) и когда он изначально рендерит, реквизит timestamp
не определен, что приводит к ошибке.Результат можно увидеть в следующих журналах консоли:
undefined
undefined
Object {
"date": "2019-08-20",
"full": 2019-08-20T12:21:52.874Z,
"time": "01:21:52",
}
Object {
"date": "20.08.2019",
"time": "01:21 pm",
}
Компонент отображается дважды.Сначала реквизиты не определены, затем они заполняются.
Как я могу заставить props
быть загруженным до первого рендера?
Не знаюхотите вызвать состояние непосредственно в дочернем компоненте, так как он будет повторно использоваться для различных вариантов использования.
Это родительский компонент:
import React, { useEffect } from 'react';
import { View } from 'react-native';
import { useSelector, useDispatch } from 'react-redux';
import DateInput from '../../../components/DateTimeInput';
import * as actions from '../../../redux/actions';
import moment from 'moment';
const ReportParamsScreen = props => {
const report = useSelector(state => state.report);
const dispatch = useDispatch();
useEffect(() => {
dispatch(actions.setReportParams({
start_date : moment().subtract(30, "days"),
end_date : moment()
}))
}, [dispatch]);
return (
<View style={styles.row}>
<View style={styles.column}>
<DateInput
mode="date"
timestamp={report.params.start_date}
/>
</View>
<View style={styles.column}>
<DateInput
mode="date"
timestamp={report.params.start_date}
/>
</View>
</View>
)
};
export default ReportParamsScreen;
Это дочерний компонент:
import React, { useEffect, useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { Body, Button, Text, Icon } from "native-base";
import DateTimePicker from "react-native-modal-datetime-picker";
const DateInput = props => {
const [isPickerVisible, setIsPickerVisible] = useState(false);
const showDateTimePicker = () => {
setIsPickerVisible(true);
};
const hideDateTimePicker = () => {
setIsPickerVisible(false);
};
const handleDateTimePicked = dateTime => {
console.log(dateTime)
hideDateTimePicker();
};
console.log(props.timestamp.value);
console.log(props.timestamp.labels); // These are the logs referened above.
return (
<Body>
<Button transparent onPress={showDateTimePicker}>
<Icon
type="MaterialIcons"
name={props.mode == 'time' ? 'access-time' : 'date-range' }
/>
<Text>{props.timestamp.labels[props.mode]}</Text>
</Button>
<DateTimePicker
date={props.timestamp.value.date}
mode={props.mode}
isVisible={isPickerVisible}
onConfirm={handleDateTimePicked}
onCancel={hideDateTimePicker}
/>
</Body>
);
}
export default DateInput;