В чем разница между использованием конструктора и getInitialState в React / React Native?

474

Я видел, что оба используются взаимозаменяемо.

Каковы основные варианты использования для обоих? Есть ли преимущества/недостатки? Является ли практика лучшей?

Теги:
react-native
constructor

4 ответа

711
Лучший ответ

Эти два подхода не являются взаимозаменяемыми. Вы должны инициализировать состояние в конструкторе при использовании классов ES6 и определить метод getInitialState при использовании React.createClass.

См. Официальный документ React по теме ES6.

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

эквивалентно

var MyComponent = React.createClass({
  getInitialState() {
    return { /* initial state */ };
  },
});
  • 8
    Лучше использовать setState вместо this.state =?
  • 186
    В конструкторе вы всегда должны назначать this.state напрямую. Обратите внимание, что это единственное место, где это разрешено. Вы должны использовать this.setState() везде.
Показать ещё 8 комментариев
112

Разница между constructor и getInitialState заключается в различии между ES6 и ES5.
getInitialState используется с React.createClass и
constructor используется с React.Component.

Следовательно, вопрос сводится к преимуществам/недостаткам использования ES6 или ES5.

Давайте посмотрим на разницу в коде

ES5

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

ES6

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

В этом есть интересная красноватая нить.

Сообщество React приближается к ES6. Также считается лучшей практикой.

Существуют некоторые различия между React.createClass и React.Component. Например, как this обрабатывается в этих случаях. Узнайте больше о таких различиях в этом блоге и содержании facebook на автообязании

constructor также может использоваться для обработки таких ситуаций. Чтобы привязать методы к экземпляру компонента, он может быть предварительно проиндексирован в constructor. Это хороший материал, чтобы делать такие классные вещи.

Еще один хороший материал о лучших практиках
Передовая практика для состояния компонентов в React.js
Преобразование проекта React от ES5 до ES6

  • 0
    Разница проявляется в версии ES, которую вы используете
17

Хорошо, большая разница начинается с того, откуда они идут, поэтому constructor является конструктором вашего класса в JavaScript, с другой стороны, getInitialState является частью lifecycle React.

constructor, где ваш класс инициализируется...

Конструктор

Метод конструктора является специальным методом для создания и инициализации объекта, созданного с помощью класса. В классе может быть только один специальный метод с именем "конструктор". Синтаксическая ошибка будет выбрана, если класс содержит более одного вхождения метода конструктора.

Конструктор может использовать ключевое слово super для вызова конструктора родительского класса.

В документе React v16 они не упомянули никаких предпочтений, но вам нужно getInitialState если вы используете createReactClass()...

Установка начального состояния

В классах ES6 вы можете определить начальное состояние, назначив this.state в конструкторе:

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

С createReactClass() вы должны предоставить отдельный метод getInitialState, который возвращает начальное состояние:

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

Посетите здесь дополнительную информацию.

Также было создано изображение ниже, чтобы показать несколько жизненных циклов React Compoenents:

Изображение 2683

  • 0
    Я бы предложил добавить на диаграмму componentWillReceiveProps , так как OP был о состоянии компонентов.
3

Если вы пишете класс React-Native с ES6, будет следовать следующий формат. Он включает методы жизненного цикла RN для класса, производящего сетевые вызовы.

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({

});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню