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

#javascript #reactjs #material-ui

#javascript #reactjs #материал-пользовательский интерфейс

Вопрос:

У меня есть react mapping, который преобразует массив объектов в их собственный <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, просто не уверен, как затем передать его компоненту. Может быть, есть способ получше?

Ответ №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}
/>