En React, ¿hay alguna diferencia real entre estas dos implementaciones? Algunos amigos me dicen que el primer componente es el patrón, pero no veo por qué. El segundo componente parece más simple porque el renderizado se llama solo una vez.
Primero:
import React, { PropTypes } from 'react'
class FirstComponent extends React.Component {
state = {
description: ''
}
componentDidMount() {
const { description} = this.props;
this.setState({ description });
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default FirstComponent;
Segundo:
import React, { PropTypes } from 'react'
class SecondComponent extends React.Component {
state = {
description: ''
}
constructor (props) => {
const { description } = props;
this.state = {description};
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default SecondComponent;
Actualización: cambié setState () a this.state = {} (gracias Joe), sin embargo, todavía no veo la diferencia. ¿Es uno mejor que otro?
javascript
reactjs
components
Levy Moreira
fuente
fuente
this.state = { isVisible: props.isVisible }
tiene sentido. Depende de cómo la aplicación distribuya el estado de la IU.Respuestas:
Cabe señalar que es un antipatrón para copiar propiedades que nunca cambian al estado (solo acceda a .props directamente en ese caso). Si tiene una variable de estado que eventualmente cambiará pero comienza con un valor de .props, ni siquiera necesita una llamada al constructor; estas variables locales se inicializan después de una llamada al constructor del padre:
Esta es una taquigrafía equivalente a la respuesta de @joews a continuación. Parece que solo funciona en versiones más recientes de los transpiladores es6, he tenido problemas con él en algunas configuraciones de paquetes web. Si esto no funciona para usted, puede intentar agregar el complemento babel
babel-plugin-transform-class-properties
, o puede usar la versión no abreviada de @joews a continuación.fuente
No necesita llamar
setState
a un componenteconstructor
; es idiomático configurarlothis.state
directamente:Ver React docs - Agregar estado local a una clase .
No hay ninguna ventaja en el primer método que describe. Resultará en una segunda actualización inmediatamente antes de montar el componente por primera vez.
fuente
setState
si lo muta en cualquier otro punto; de lo contrario, es posible que los cambios no se procesen.super(props)
en el constructor. Discusión sobre SOActualización para React 16.3 alpha introducida
static getDerivedStateFromProps(nextProps, prevState)
( docs ) como reemplazo decomponentWillReceiveProps
.https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops
Es estático, por lo tanto, no tiene acceso directo a
this
(sin embargo, sí tiene accesoprevState
, lo que podría almacenar cosas que normalmente están unidas a,this
por ejemplorefs
)editado para reflejar la corrección de @ nerfologist en los comentarios
fuente
getDerivedStateFromProps
(marque la letra mayúscula en Props) y los parámetros sonnextProps
,prevState
(nonextState
): reactjs.org/docs/…getDerivedStateFromProps
siempre se llama antes del renderizado inicial?Puede usar el formulario corto como se muestra a continuación si desea agregar todos los accesorios para indicar y conservar los mismos nombres.
fuente
establecer los datos de estado dentro del constructor como este
no funcionará si configura el método de componente lateralDidMount () a través de accesorios.
fuente
fuente
state = props
. Más información aquí: github.com/facebook/react/pull/11658#issuecomment-419677176puede usar el
key
valor para restablecer el estado cuando sea necesario, pasar los accesorios al estado no es una buena práctica, porque tiene un componente no controlado y controlado en un solo lugar. Los datos deben estar en un solo lugar manejado, lea este https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a -llavefuente
Puede usar componentWillReceiveProps.
fuente
DEBE TENER CUIDADO cuando inicializa
state
desde elprops
constructor. Incluso si seprops
cambia a uno nuevo, el estado no cambiará porque el montaje nunca volverá a ocurrir. EntoncesgetDerivedStateFromProps
existe para eso.fuente