Передача сопоставленного идентификатора кнопки компоненту

У меня есть реагирующее отображение, которое отображает массив объектов в их собственные <cards />. У каждой карты есть своя кнопка, которая открывает <dialog />. Я пытаюсь передать уникальный идентификатор каждого объекта соответствующему диалоговому компоненту. На данный момент я передаю все идентификаторы в <dialog /> независимо от того, какой диалог открыт.

Каждый диалог на основе идентификатора будет вызывать уникальные данные, в настоящее время я получаю все, что мне не нужно.

            {vehicles !== undefined ? vehicles.map(model => (
                <React.Fragment>
                        <Card>
                            <CardActions className = {classes.cardActions}>
                                <Button fullWidth color = "#333" onClick = {this.handleDialog}>
                                    FIND OUT MORE
                            </Button>
                            </CardActions>
                        </Card>

                    <VehicleDialog
                        key = {model.id}
                        onClose = {this.handleDialog}
                        open = {this.state.open}
                        id = {model.id} //passes all IDs to this component
                    />
                </React.Fragment>
            ))
                :
                null
            }

Моя ручка стандартная:

handleDialog = () => {
    this.setState({ open: !this.state.open });
};

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

Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
523
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

На самом деле здесь происходит то, что вы рендерите несколько VehicleDialog в цикле. Что вам нужно сделать, так это убрать VehicleDialog из цикла (я имею в виду, из map). И визуализируйте его после сопоставления. Теперь, когда нажата кнопка, обратите внимание (в своем state), какой model.id хочет открыть VehicleDialog.

Итак, давайте сначала изменим ваш обработчик, чтобы он принимал модель id в качестве аргумента. Он возвращает функцию, которая устанавливает state.open и state.modelId. Поэтому всякий раз, когда ваш диалог открыт, он знает, какой идентификатор модели хотел его открыть (из state.modelId).

handleDialog = (id) => () => {
    this.setState({ 
        open: !this.state.open,
        modelId: id
    });
};

Теперь давайте вырежем диалог из цикла и изменим onClick свойства кнопок, чтобы отразить новое изменение дизайна обработчика. После цикла визуализируйте один диалог:

{vehicles !== undefined ? vehicles.map(model => (
    <Card>
        <CardActions className = {classes.cardActions}>
            <Button fullWidth color = "#333" onClick = {this.handleDialog(model.id)}>
                FIND OUT MORE
            </Button>
        </CardActions>
    </Card>
)):null
}

<VehicleDialog
    key = {model.id}
    onClose = {this.handleDialog}
    open = {this.state.open}
    id = {this.state.modelId}
/>  

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