2016-03-08 2 views
0

Когда я нажимаю кнопку, которая запускает subscribe(), я пытаюсь изменить this.state.subscribe как противоположное логическое значение того, что это такое. Я даже не управляю изменением значения this.state.subscribed гораздо меньше визуализировать другой текст при нажатии кнопки. Я попробовал replaceState и добавил функцию обратного вызова. Не совсем точно, что я должен делать в функции обратного вызова, хотя, если это то, что я делаю неправильно.React - Состояние не обновляется

SingleSubRedditList = React.createClass({ 
    mixins: [ReactMeteorData], 

    getMeteorData: function(){ 
    Meteor.subscribe('posts'); 
    var handle = Meteor.subscribe('profiles'); 
    return { 
     loading: !handle.ready(), 
     posts: Posts.find().fetch(), 
     profiles: Profiles.find({}).fetch() 
    }; 
    }, 

    getInitialState: function(){ 
    var subscribed; 
    return { 
     subscribed: subscribed 
    }; 
    }, 

    populateButton: function(){ 
    //fetch is cumbersome, later try and do this another way to make it faster 
    var profile = Profiles.find({_id: Meteor.userId()}).fetch(); 
    if (profile.length > 0){ 
     this.state.subscribed =  profile[0].subreddits.includes(this.props.subreddit); 
    } 
    }, 

    subscribe: function(){ 
    this.setState({ 
     subscribed: ! this.state.subscribed 
    } 
    ); 
    }, 

    renderData: function(){ 
    return this.data.posts.map((post) => { 
     return <SinglePost title={post.title} content={post.content} key={post._id} id={post._id} /> 
    }); 
    }, 

    render: function(){ 
    this.populateButton() 
    return (
     <div> 
     <button onClick={this.subscribe}> 
      <p>{this.state.subscribed ? 'Subscribed' : 'Click To Subscribe'}</p> 
     </button> 
     <p></p> 
    <ul> 
     {this.renderData()} 
    </ul> 
    </div> 
); 

} });

ответ

1

Вы не можете установить состояние с помощью this.state.subscribed = ..., которое вы сейчас делаете в populateButton. Попытка напрямую изменить состояние подобным образом приведет к тому, что он будет вести себя странно.

Вы также инициализируете subscribed с неопределенной переменной. Вы должны указать ему начальный статус true или false.

+0

Я думаю, что установка состояния с использованием '=' была тем, что делала это. Спасибо чувак. Только один последний вопрос. Я пытаюсь заполнить кнопку HTML на основе того, что находится в коллекции Profile. Но я не могу сделать это в getInitialState, потому что данные пока недоступны, поэтому я создал функцию, которую я вызываю в методе рендеринга, который заполняет кнопку HTML, и она работает. Так как вынимая '=', это говорит мне. Невозможно обновить во время существующего перехода состояния (например, внутри 'render'). Как заполнить кнопку HTML в getInitialState или где-то еще? – ChrisWilson

+0

Я не очень хорошо знаком с Meteor, но, как общий шаблон дизайна React, вы должны передавать внешние ресурсы в качестве реквизита для своего компонента, а не напрямую обращаться к ним. Поскольку реакция будет повторно отображаться всякий раз, когда вы передаете новый реквизит на компонент, вы можете быть уверены, что правильно инициализируете состояние, когда данные будут доступны. – gravityplanx

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