¿Qué hacen estos tres puntos en React?
¿Qué hace ...
en este código de React (usando JSX) y cómo se llama?
<Modal {...this.props} title='Modal heading' animation={false}>
Esa es la notación de distribución de propiedad . Se agregó en ES2018 (la distribución para matrices/iterables era anterior, ES2015), pero ha sido compatible con proyectos de React durante mucho tiempo mediante transpilación (como " atributos de extensión JSX " aunque también podría hacerlo en otros lugares, no solo atributos ).
{...this.props}
distribuye las propiedades enumerables "propias" props
como propiedades discretas en el Modal
elemento que está creando. Por ejemplo, si this.props
está contenido a: 1
y b: 2
, entonces
<Modal {...this.props} title='Modal heading' animation={false}>
seria lo mismo que
<Modal a={this.props.a} b={this.props.b} title='Modal heading' animation={false}>
Pero es dinámico, por lo que se incluyen todas las propiedades "propias" props
.
Dado que children
es una propiedad "propia" props
, la extensión la incluirá. Entonces, si el componente donde aparece esto tenía elementos secundarios, se pasarán a Modal
. Poner elementos secundarios entre la etiqueta de apertura y las etiquetas de cierre es simplemente azúcar sintáctico (del tipo bueno) para poner una children
propiedad en la etiqueta de apertura. Ejemplo:
Mostrar fragmento de código
La notación extendida es útil no solo para ese caso de uso, sino también para crear un nuevo objeto con la mayoría (o todas) de las propiedades de un objeto existente, lo cual surge con frecuencia cuando se actualiza el estado, ya que no se puede modificar el estado. directamente:
this.setState(prevState => {
return {foo: {...prevState.foo, a: "updated"}};
});
Eso se reemplaza this.state.foo
con un nuevo objeto con todas las mismas propiedades que foo
excepto la a
propiedad, que se convierte en "updated"
:
Mostrar fragmento de código
...
Se denominan atributos de extensión que, como su nombre lo indica, permiten expandir una expresión.
var parts = ['two', 'three'];
var numbers = ['one', ...parts, 'four', 'five']; // ["one", "two", "three", "four", "five"]
Y en este caso (lo voy a simplificar).
// Just assume we have an object like this:
var person= {
name: 'Alex',
age: 35
}
Este:
<Modal {...person} title='Modal heading' animation={false} />
es igual a
<Modal name={person.name} age={person.age} title='Modal heading' animation={false} />
En resumen, podemos decir que es un buen atajo .