Правильно, зачем привязывать функцию с параметрами к дочернему компоненту в React Native

Я все еще новичок в 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()}
            />
        </>
      );
    }

Таким образом, в моем родительском компоненте у меня может быть один метод, который может обрабатывать обновления для нескольких средств выбора даты и времени в моем контейнере (на самом деле это мой вариант использования). Вместо того, чтобы иметь обработчики одного и того же типа (с другим именем свойства) практически для одного и того же.

Обновлено:Закусочная выставка

onConfirm = {() => onConfirmPressed(dateTimePickerId)} можно? Кроме того, вы не должны определять свои свойства состояния, как в родительском компоненте. Определите свое состояние и добавьте необходимые свойства. this.state = {foo: "bar"}
devserkan 30.05.2019 16:33

Хорошо, у меня есть форма (контейнер), в которой есть ряд компонентов со своими свойствами. Я не использую Redux или что-то в этом роде. Как получить значения для всех компонентов при отправке формы (родительский компонент)?

user2128702 30.05.2019 16:35

Разве вы не можете сохранить эти значения как свойства состояния в контейнере формы и обновить их с помощью некоторых функций обратного вызова? Если можете, поделитесь Макви. Таким образом, люди могут увидеть ваш код и помочь исправить его.

devserkan 30.05.2019 16:40

@devserkan Думаю, я именно этим и занимаюсь.

user2128702 30.05.2019 16:43

Итак, в целях тестирования, как я уже сказал, исправьте определение своего состояния и попробуйте свои функции обратного вызова. Я не могу понять проблему здесь. Если вы хотите передать какой-либо параметр своим функциям обратного вызова, вы можете сделать это, как я предложил в своем первом комментарии. Опять же, "mvce" было бы здорово.

devserkan 30.05.2019 16:48

Хорошо, я только что обновил свой ответ и, кажется, теперь у меня есть «mvce».

user2128702 30.05.2019 17:01

как сказал @devserkan, просто используйте onConfirm = {() => onConfirmPressed(dataTimePickerId)

Zaytri 30.05.2019 19:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
299
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете захватить «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)}

user2128702 31.05.2019 11:01

Ваша вышеприведенная встроенная функция будет работать так же хорошо, если вы чувствуете, что она лучше читается. Это личные предпочтения.

jimmy5312 31.05.2019 11:10

Другие вопросы по теме