2016-01-20 4 views
0

У меня есть файл с именем App.js, который является основным компонентом моего приложения.Реакция компонента не отображается

Я поставил новый компонент в результате возвращенного render метод, который файла:

return (
    <div> 
     <AjaxReq /> 
     //many other components 
    </div> 
); 

Где AjaxReq является следующий метод:

'use strict'; 

var AjaxReq = React.createClass({ 

    loadDoc: function() { 
     $.ajax({ 
      url: "someUrl", 
      context: document.body, 
      success: function(){ 
       $(this).addClass("done"); 
      } 
     }); 
    }, 

    render: function() { 
     return (<div> 
      <p onClick={this.loadDoc}> 
       Click this to make AJAX request. 
      </p> 
     </div>); 
    } 

}); 


module.exports = AjaxReq; 

К сожалению, этот компонент не отображается на всех в страница. Есть ли проблемы с моим кодом?

+0

Только AjaxReq не отображается? Кроме того, есть ли какие-либо ошибки консоли? – phpcoderx

+0

Да, только этот не отображается. Нет никаких ошибок консоли. – octavian

+0

Вам не хватает точки React, если вы используете jQuery для обновления DOM. Обновите 'state' из вашего ответа ajax и дайте React re-render с новым классом. – Mathletics

ответ

1

Я не думаю, что этот фрагмент $(this).addClass("done"); делает то, что вы могли бы намереваться сделать.
В этом контексте this относится к компоненту React (Virtual DOM), а не к фактическому элементу в DOM.

Единственный способ доступа к экземпляру React Component вне React - это сохранить возвращаемое значение ReactDOM.render.

Также, если вы забыли импортировать React (var React = require('react')) в свой модуль AjaxReq?

1

Как и phpcoderx, не импортировать React не может ничего не вынести. Чтобы добавить класс CSS, как вы пытаетесь сделать, вы хотели бы сделать что-то более похожее на следующее (хотя я не думаю, что это повлияет на отсутствие начальной проблемы с рендерингом, которую вы видите).

'use strict'; 

var AjaxReq = React.createClass({ 
    loadDoc: function() { 
     $.ajax({ 
      url: "someUrl", 
      context: document.body, 
      success: function(){ 
       this.setState({ isLoaded: true }); 
      } 
     }); 
    }, 

    getInitialState: function() { 
     return { isLoaded: false }; 
    }, 

    render: function() { 
     var classname = this.state.isLoaded ? 'done' : ''; 

     return (<div className={classname}> 
      <p onClick={this.loadDoc}> 
       Click this to make AJAX request. 
      </p> 
     </div>); 
    }; 
}); 

module.exports = AjaxReq; 
+0

Не импортировать Реагирование не является проблемой, потому что я решаю это в процессе сборки. Почему вы устанавливаете состояние здесь? Если я скопирую вставить код, я получаю 'Uncaught TypeError: Не могу прочитать свойство 'isLoaded' из null. – octavian

+0

Я устанавливаю состояние в вызове AJAX как способ отслеживать, когда загрузилось то, что вы загружаете (чтобы избежать манипуляции с чем-либо напрямую с помощью jQuery). Я не уверен, каков ваш конкретный вариант использования, но я отредактирую сообщение, чтобы добавить 'getInitialState' - он должен исправить вашу проблему. – Donald

Смежные вопросы