2016-11-25 2 views
-1

Может кто-нибудь сказать мне, что случилось с этим:Невозможно исправить «SetState (...): Можно только обновить установленный или монтажный компонент»

import React, { Component, PropTypes } from 'react'; 

class ExampleModal extends Component { 
    static propTypes = { 
     is_shown: PropTypes.bool 
    } 

    show =() => { 
     console.log('The function gets called, but setState fails'); 
     this.setState({ is_shown: true }); 
    } 

    render() { 
     return (
      <button onClick={this.show}>Press me</button> 
     ); 
    } 
} 

export default ExampleModal; 

Пробовал прибегая к помощи, проходящий через документацию, а также изменения синтаксиса , но до сих пор нет решения. Может быть воспроизведен, например, с помощью this example app путем импорта компонента выше и помещения его в основной номер <div>.

+0

Вы не определили состояние. 'is_shown' is' prop' –

+0

Я думаю, что это не связано. Я попытался прокомментировать propTypes, установив состояние под конструктором и всевозможные трюки, но ничего не помогло. Интересно, почему проблема вызвана установкой моего приложения каким-то образом. – Kitanotori

ответ

0

Вам не хватало constructor Я верю.

constructor(props) { 
    super(props); 
    this.state = { 
     is_shown: false 
    }; 
} 

show() { 
    console.log('The function gets called, but setState fails'); 
    this.setState({ is_shown: true }); 
} 

render() { 
    return (
     <button onClick={this.show.bind(this)}>Press me</button> 
    ); 
} 

Для того, чтобы ваш формат метода класса последователен, я добавил .bind в {this.show}, что делает this точку к этому классу в show() методе.

+0

Это работает, но моя цель состояла в том, чтобы заставить синтаксис синтаксиса работать. Только сейчас я обнаружил, что плагин-преступник-трансформер-свойства отсутствует в настройке Babel. – Kitanotori

2

Оказалось, что для правильной обработки синтаксиса Babel необходим transform-class-properties plugin. К сожалению, ни одно сообщение об ошибке не было показано в любой точке Webpack или Babel. Похоже, что упорядочение плагинов также имеет решающее значение: если я поместил плагин преобразования после плагина hot loader, проблема не исчезнет.

В случае, если кто-то борется с той же проблемой, вот .babelrc, что устранило проблему:

{ 
    "presets": ["stage-2", "react"], 
    "env": { 
     "development": { 
      "plugins": [ 
       [ 
        "transform-class-properties", 
        "react-hot-loader/babel" 
       ] 
      ] 
     } 
    } 
} 

Естественно, вам также необходимо установить плагин:

npm install --save-dev babel-plugin-transform-class-properties 

EDIT: смущаясь, но на самом деле причина, по которой эта «исправленная» проблема была вызвана опечаткой в ​​массиве, что привело к тому, что реактор с горячей загрузкой не загружался. Следовательно, реакция-hot-loader является виновником, но мне еще предстоит выяснить, почему ...

+0

Спасибо, у меня точно такая же проблема, если я прокомментирую // «react-hot-loader/babel» Затем он работает, я хотел бы добавить реактивную горячую загрузку назад, вам удалось? – alfonsodev