2016-01-17 1 views
0

Состояние первоначального рендера здесь - это начальное состояние. Я использую componentWillMount(), однако он не будет работать без предварительной проверки, установлен ли компонент. Результат при использовании rawMarkup() - пустой исходный объект состояния. Все работает правильно при повторном рендеринге, но задается вопросом, почему почтовый объект внутри состояния по-прежнему пуст в первоначальном рендере. Есть ли лучший способ сделать это? Спасибо.Состояние монтажа Reactjs перед первоначальной визуализацией или сохранением как есть?

var Post = React.createClass({ 
propTypes: { 
    source: React.PropTypes.string.isRequired, 
}, 

getInitialState: function() { 
    return { 
     post: {} 
    }; 
}, 

getDefaultProps: function() { 
    return { 
     source: 'http://localhost:3000/api/posts/' + postSlug 
    }; 
}, 

componentWillMount: function() { 
    $.get(this.props.source, function(result) { 
     if (this.isMounted()) { 
      this.setState({post: result}); 
     } 
    }.bind(this)); 
}, 

rawMarkup: function() { 
    console.log(this.state.post); 
    var rawMarkup = marked(this.state.post.body || '', {sanitize: true}); 
    return { __html: rawMarkup }; 
}, 

render: function() { 
    var post = this.state.post; 
    var date = moment(post.date).format('MM[/]DD[/]YYYY'); 
    return (
     React.createElement('div', {style: {marginLeft: '115px'}}, 
      React.createElement('h1', {style: {marginTop: '50px'}}, post.title), 
      React.createElement('h5', {style: {marginBottom: '25px'}}, date), 
      React.createElement('span', {dangerouslySetInnerHTML: this.rawMarkup()}) 
     ) 
    ); 
} 

});

ответ

1

По умолчанию запрос jQuery get является асинхронным, поэтому первоначальный визуализатор выполняется до завершения запроса и вызывается this.setState({post: result}). Вы можете сделать запрос на получение синхронным (How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?) или выяснить способ грациозно обрабатывать данные о первоначальном рендеринге (рекомендуется).

+0

Да, это имеет смысл, спасибо. Получил дополнительный полезный ввод через другой носитель и установил исходное состояние сообщения null с оператором if() в рендере, чтобы проверить готовность состояния. – WallEBot

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