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
setStatea un componenteconstructor; es idiomático configurarlothis.statedirectamente: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
setStatesi 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,thispor 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/…getDerivedStateFromPropssiempre 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
keyvalor 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
statedesde elpropsconstructor. Incluso si sepropscambia a uno nuevo, el estado no cambiará porque el montaje nunca volverá a ocurrir. EntoncesgetDerivedStateFromPropsexiste para eso.fuente