2016-04-18 4 views
2

В связи с тем, что я новичок в метеоре/реакции, я не могу понять, как инициализировать переменную состояния.meteor-reactjs: в конструкторе коллекция пуста

Моя проблема заключается в том, что я хотел бы получить

  1. моей коллекции Монго через createContainer от реакции-Метеор-данных (как описано here),
  2. использовать инициализированную опору для инициализировать состояние переменной

Но опора в конструкторе пуста. Только когда функция «gotClicked» называется prop.allLists заполняется данными из mongo.

Кто-нибудь знает, почему? Я предполагаю, что данные загружаются асинхронно, так что данные еще не доступны в конструкторе. Что было бы лучшим способом получить данные?

import React, {Component, PropTypes} from 'react'; 
import { createContainer } from 'meteor/react-meteor-data'; 
import {AllLists} from '../api/alllists.js' 
export default class MyList extends Component { 

    constructor(props) { 
     super(); 

     console.log(props.allLists) 
     console.log(this.props.allLists) 
     //allLists is empty 

     this.state = { 
      lists: props.allLists 
     } 
    } 

    gotClicked(){ 
     console.log(this.props.allLists) 
     //allLists is filled 
    } 

    render() { 
     return (
      <div className="container" onClick={this.gotClicked.bind(this)}> 
      </div> 
     ); 
    } 
} 

MyList.propTypes = { 
    allLists: PropTypes.string.isRequired 
} 

export default createContainer(() => { 
    return { 
     allLists: AllLists.find({}).fetch() 
    }; 
}, MyList); 

ответ

1

Вы правы, данные загружаются асинхронно и могут быть недоступны в конструкторе. Однако функция обратного вызова, которую вы пересылаете на createContainer, снова оценивается при загрузке данных и автоматически обновляет props вашего компонента.

Чтобы поймать это изменение, выполните функцию componentWillReceiveProps в компоненте React.

componentWillReceiveProps(nextProps) { 
    this.setState({ 
    lists: nextProps.allLists 
    }); 
} 

Docs здесь: https://facebook.github.io/react/docs/component-specs.html

+0

спасибо за советы. Я реализовал функцию componentWillReceiveProps. Теперь я получаю реквизит с результатом AllLists.find ({}). Fetch. Но кажется, что когда функция называется, выборка еще не завершена, потому что массив имеет разную длину при разных вызовах. – JGM

+0

Вы также можете проверить состояние подписки. http://stackoverflow.com/questions/36585564/conditional-rendering-in-meteor-react/36585830#36585830 – aedm

+0

Хорошо, теперь он работает! Благодарю. Чувствовать себя неудобно. – JGM

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