Sto creando un componente popover per un'interfaccia utente in React. Quel componente contiene un pulsante che attiva la visualizzazione del popover. Perché il pulsante deve essere configurabile - etichetta, classi, proprietà - Ho bisogno di trasmettere questi parametri di configurazione al bambino. Ci sono due modi principali in cui vedo questo accadere.
- Abbassa etichetta e oggetti di scena come attributi:
<PopoverComponent buttonLabel={label} buttonProps={buttonProps} />
- Passa al pulsante attuale.
const button = <Button>Show</Button>;
<PopoverComponent button={button} />
La complicazione arriva all'interno del popover. Per posizionare l'elemento ho bisogno di un ref
sul nodo DOM, quindi devo aggiungere oggetti di scena all'elemento button all'interno di PopoverComponent
. In React questo è semplice e standard nel caso 1. Basta spargere puntelli personalizzati sul pulsante. Ad esempio, <Button ref="popoverButton" onClick={this.onClick} {...extraProps }>
. Tuttavia, nel caso 2, dobbiamo React.cloneElement
e mutare gli oggetti di scena. Per es.,
// INSIDE popoverComponent
const { button } = this.props;
const extendedButton = React.cloneElement(
button,
Object.assign(
{},
button.props, {
ref: "popoverButton",
onClick: this.onClick,
}),
);
return <div className="popover-control">{ extendedButton }</div>;
È antipattern usare React.cloneElement
e modificare oggetti di scena in componenti figlio in React?