will update react prevstate getderivedstatefromprops getdefaultprops force es6 component actualizar reactjs react-native constructor

reactjs - update - react lifecycle diagram



¿Cuál es la diferencia entre usar constructor vs getInitialState en React/React Native? (5)

De acuerdo, la gran diferencia es comenzar de dónde provienen, por lo que constructor es el constructor de su clase en JavaScript, por otro lado, getInitialState es parte del lifecycle de lifecycle de React .

constructor es donde tu clase se inicializa ...

Constructor

El método constructor es un método especial para crear e inicializar un objeto creado con una clase. Solo puede haber un método especial con el nombre "constructor" en una clase. Se generará un SyntaxError si la clase contiene más de una aparición de un método constructor.

Un constructor puede usar la palabra clave super para llamar al constructor de una clase padre.

En el documento React v16, no mencionaron ninguna preferencia, pero debe obtener getInitialState si usa createReactClass() ...

Establecer el estado inicial

En las clases ES6, puede definir el estado inicial asignando this.state en el constructor:

class Counter extends React.Component { constructor(props) { super(props); this.state = {count: props.initialCount}; } // ... }

Con createReactClass (), debe proporcionar un método getInitialState separado que devuelva el estado inicial:

var Counter = createReactClass({ getInitialState: function() { return {count: this.props.initialCount}; }, // ... });

Visita here para más información.

También creó la imagen a continuación para mostrar algunos ciclos de vida de React Compoenents:

He visto que ambos se usan indistintamente.

¿Cuáles son los principales casos de uso para ambos? ¿Hay ventajas / desventajas? ¿Es uno una mejor práctica?


En estos días no tenemos que llamar al constructor dentro del componente; podemos llamar directamente a state={something:""} , de lo contrario, primero debemos declarar al constructor con super() para heredar todo de la clase React.Component y luego dentro del constructor inicializamos nuestro estado.

Si usa React.createClass , defina el estado de inicialización con el método getInitialState .


La diferencia entre constructor y getInitialState es la diferencia entre ES6 y ES5 .
getInitialState se usa con React.createClass y
constructor se utiliza con React.Component .

Por lo tanto, la pregunta se reduce a las ventajas / desventajas de usar ES6 o ES5 .

Veamos la diferencia en el código.

ES5

var TodoApp = React.createClass({ propTypes: { title: PropTypes.string.isRequired }, getInitialState () { return { items: [] }; } });

ES6

class TodoApp extends React.Component { constructor () { super() this.state = { items: [] } } };

Hay un hilo interesante de reddit con respecto a esto.

La comunidad React se está acercando a ES6 . También se considera como la mejor práctica.

Hay algunas diferencias entre React.createClass y React.Component . Por ejemplo, cómo se maneja esto en estos casos. Lea más sobre tales diferencias en esta publicación de blog y el contenido de Facebook sobre enlace automático

constructor también se puede utilizar para manejar tales situaciones. Para vincular métodos a una instancia de componente, se puede prebinding en el constructor . This es un buen material para hacer cosas tan geniales.

Un poco más de buen material sobre mejores prácticas
Mejores prácticas para el estado del componente en React.js
Convertir el proyecto React de ES5 a ES6

Actualización: 9 de abril de 2019 :

Con los nuevos cambios en la API de clase Javascript, no necesita un constructor.

Podrías hacerlo

class TodoApp extends React.Component { this.state = {items: []} };

Esto aún se trasladará al formato de constructor, pero no tendrá que preocuparse por eso. puede usar este formato que sea más legible.

Con ganchos de reacción

Desde la versión React 16.8, hay un nuevo API llamado Hooks.

Ahora, ni siquiera necesita un componente de clase para tener estado. Incluso se puede hacer en un componente funcional.

import React, { useState } from ''react''; function TodoApp () { const items = useState([]);

Tenga en cuenta que el estado inicial se pasa como argumento para useState ; useState([])

Lea más sobre reaccionar ganchos de los documentos oficiales


Los dos enfoques no son intercambiables. Debe inicializar el estado en el constructor cuando use las clases ES6 y definir el método getInitialState cuando use React.createClass .

Consulte el documento oficial de React sobre el tema de las clases de ES6 .

class MyComponent extends React.Component { constructor(props) { super(props); this.state = { /* initial state */ }; } }

es equivalente a

var MyComponent = React.createClass({ getInitialState() { return { /* initial state */ }; }, });


Si está escribiendo la clase React-Native con ES6, se seguirá el siguiente formato. Incluye métodos de ciclo de vida de RN para la clase que realiza llamadas de red.

import React, {Component} from ''react''; import { AppRegistry, StyleSheet, View, Text, Image ToastAndroid } from ''react-native''; import * as Progress from ''react-native-progress''; export default class RNClass extends Component{ constructor(props){ super(props); this.state= { uri: this.props.uri, loading:false } } renderLoadingView(){ return( <View style={{justifyContent:''center'',alignItems:''center'',flex:1}}> <Progress.Circle size={30} indeterminate={true} /> <Text> Loading Data... </Text> </View> ); } renderLoadedView(){ return( <View> </View> ); } fetchData(){ fetch(this.state.uri) .then((response) => response.json()) .then((result)=>{ }) .done(); this.setState({ loading:true }); this.renderLoadedView(); } componentDidMount(){ this.fetchData(); } render(){ if(!this.state.loading){ return( this.renderLoadingView() ); } else{ return( this.renderLoadedView() ); } } } var style = StyleSheet.create({ });