Я все еще новичок в React Native и немного борюсь с парадигмой программирования. Что я пытаюсь сделать (следуя структуре другого проекта React.js), так это создать контейнер (родительский компонент), который содержит ряд других компонентов. Моя конечная цель - передать и обработать все реквизиты в родительском компоненте. Дочерний компонент показывает только их. Моя структура выглядит примерно так:
export default class TemporaryCardRequestScreen extends React.Component {
constructor(props) {
super(props);
this.showDateTimePicker = this.showDateTimePicker.bind(this);
this.hideDateTimePicker = this.hideDateTimePicker.bind(this);
this.handleDatePicked = this.handleDatePicked.bind(this);
this.state.fromDateTime = {
isVisible: false,
value: new Date()
}
}
showDateTimePicker = () => { /*body*/ };
hideDateTimePicker = () => { /*body*/ };
handleDatePicked = date => { /*body*/ };
render() {
return (
<DateTimePickerComponent
isVisible = {this.state.fromDateTime.isVisible}
onConfirmPressed = {this.handleDatePicked}
onCancelPressed = {this.hideDateTimePicker}
showDateTimePicker = {this.showDateTimePicker}
value = {this.state.fromDateTime.value}
/>
);
}
}
и мой дочерний компонент выглядит примерно так:
// npm ref.: https://github.com/mmazzarolo/react-native-modal-datetime-picker
export default class DateTimePickerComponent extends Component {
constructor(props) {
super(props);
}
render() {
const {
isVisible,
onConfirmPressed,
onCancelPressed,
showDateTimePicker } = this.props;
return (
<>
<Button title = "Show DatePicker" onPress = {showDateTimePicker} />
<DateTimePicker
isVisible = {isVisible}
onConfirm = {onConfirmPressed}
onCancel = {onCancelPressed}
mode='datetime'
is24Hour = {false}
date = {new Date()}
/>
</>
);
}
}
Мое внимание сейчас сосредоточено на
onConfirmPressed = {this.handleDatePicked}
в настоящее время это.handleDatePicked принимает один аргумент, но я бы хотел, чтобы он принимал один дополнительный, который передается ему в месте, используемом в дочернем компоненте.
Итак, моей конечной целью было бы иметь что-то похожее на это:
render() {
const {
isVisible,
onConfirmPressed,
onCancelPressed,
showDateTimePicker,
dateTimePickerId } = this.props;
return (
<>
<Button title = "Show DatePicker" onPress = {this.showDateTimePicker} />
<DateTimePicker
isVisible = {isVisible}
onConfirm = {onConfirmPressed(dateTimePickerId)}
onCancel = {onCancelPressed}
mode='datetime'
is24Hour = {false}
date = {new Date()}
/>
</>
);
}
Таким образом, в моем родительском компоненте у меня может быть один метод, который может обрабатывать обновления для нескольких средств выбора даты и времени в моем контейнере (на самом деле это мой вариант использования). Вместо того, чтобы иметь обработчики одного и того же типа (с другим именем свойства) практически для одного и того же.
Обновлено:Закусочная выставка
Хорошо, у меня есть форма (контейнер), в которой есть ряд компонентов со своими свойствами. Я не использую Redux или что-то в этом роде. Как получить значения для всех компонентов при отправке формы (родительский компонент)?
Разве вы не можете сохранить эти значения как свойства состояния в контейнере формы и обновить их с помощью некоторых функций обратного вызова? Если можете, поделитесь Макви. Таким образом, люди могут увидеть ваш код и помочь исправить его.
@devserkan Думаю, я именно этим и занимаюсь.
Итак, в целях тестирования, как я уже сказал, исправьте определение своего состояния и попробуйте свои функции обратного вызова. Я не могу понять проблему здесь. Если вы хотите передать какой-либо параметр своим функциям обратного вызова, вы можете сделать это, как я предложил в своем первом комментарии. Опять же, "mvce" было бы здорово.
Хорошо, я только что обновил свой ответ и, кажется, теперь у меня есть «mvce».
как сказал @devserkan, просто используйте onConfirm = {() => onConfirmPressed(dataTimePickerId)
Вы можете захватить «onConfirm» DateTimePickerComponent, затем вызвать родительскую функцию и передать dateTimePickerId.
ВременныйCardRequestScreen
// Modify to accept 2 arguments
handleDatePicked = (id, date) => {
if (id == "1") {
// code here
}
else if (id == "2") {
// code here
}
};
render() {
return (
<div>
<DateTimePickerComponent
isVisible = {this.state.fromDateTime.isVisible}
onConfirmPressed = {this.handleDatePicked}
onCancelPressed = {this.hideDateTimePicker}
showDateTimePicker = {this.showDateTimePicker}
value = {this.state.fromDateTime.value}
dateTimePickerId = "1"
/>
<DateTimePickerComponent
isVisible = {this.state.fromDateTime.isVisible}
onConfirmPressed = {this.handleDatePicked}
onCancelPressed = {this.hideDateTimePicker}
showDateTimePicker = {this.showDateTimePicker}
value = {this.state.fromDateTime.value}
dateTimePickerId = "2}
/>
</div>
);
}
DateTimePickerComponent
onMyCustomConfirmPressed = (date) => {
// Parent onConfirmPressed() shall accept 2 arguments
this.props.onConfirmPressed(this.props.dateTimePickerId, date)
}
render() {
const {
isVisible,
onConfirmPressed,
onCancelPressed,
showDateTimePicker,
dateTimePickerId } = this.props;
return (
<>
<Button title = "Show DatePicker" onPress = {this.showDateTimePicker} />
<DateTimePicker
isVisible = {isVisible}
onConfirm = {this.onMyCustomConfirmPressed}
onCancel = {onCancelPressed}
mode='datetime'
is24Hour = {false}
date = {new Date()}
/>
</>
);
}
Я принимаю ваш ответ, потому что он работает, но мне было интересно, нет ли лучшего более короткого варианта без необходимости создавать собственный пользовательский метод в дочернем компоненте. Возможно встроенный: onConfirm = {(date) => this.props.onConfirmPressed(this.props.dateTimePickerId, date)}
Ваша вышеприведенная встроенная функция будет работать так же хорошо, если вы чувствуете, что она лучше читается. Это личные предпочтения.
onConfirm = {() => onConfirmPressed(dateTimePickerId)}
можно? Кроме того, вы не должны определять свои свойства состояния, как в родительском компоненте. Определите свое состояние и добавьте необходимые свойства.this.state = {foo: "bar"}