访问文档中的项目不会返回任何内容,但会返回文档

时间:2017-08-29 17:52:36

标签: reactjs meteor

我在tracker中有componentDidMount,我正在尝试访问名为notes的集合中的项目。但是,当我console.log(doc)时,它会返回我想要查找的文档,但是当我console.log(doc.likes)时,它不会返回任何内容并且会给出Uncaught TypeError: Cannot read property 'likes' of undefined的错误。我想要做的是当页面加载时,设置likes: doc.likes.length的状态。现在它可以工作,但你必须添加一个类似的数组,以便它获取所有的喜欢。

constructor(props){
    super(props);
    this.state = {
      doc: {},
      likes: 0,
      dislikes: 0
    };
  }
  componentDidMount() {
    Meteor.subscribe("notes");
    this.tracker = Tracker.autorun(() => {
      let doc = Notes.findOne(this.props.match.params.noteId);
      console.log(doc.likes)
      this.setState({ doc })
    })
  }
  componentWillReceiveProps(nextProps) {
    if(this.props.match.params.noteId != nextProps.match.params.noteId)
      this.tracker = Tracker.autorun(() => {
        const doc = Notes.findOne(nextProps.match.params.noteId);
        console.log(doc.likes)
        this.setState({ doc });
      })
  }
  renderNote(doc){
    return(
      <div className="fullSize-container">
        <div className="left">
          <img className="fullSize-image" src={doc.imageURL} />
          <p className="center">
            <span onClick={() => {
              Meteor.call("like", doc._id, doc.userEmail, (err, res) => {
                this.setState({ likes: res })
              })
            }}>⬆</span>
            {this.state.likes}
            <span onClick={() => {
              Meteor.call("dislike", doc._id, doc.userEmail, (err, res) => {
                this.setState({ dislikes: res })
              })
            }}>⬇</span>
            {this.state.dislikes}
          </p>
        </div>
        <div className="right">
          <h2>{doc.title}</h2>
          <h3>{doc.userEmail}</h3>
          <br />
          <span className="description">{doc.description}</span>
        </div>
      </div>
    )
  }

  render(){
    return (
      <div className="center">
        <Menu />
        {this.renderNote(this.state.doc)}
      </div>
    )
  }

1 个答案:

答案 0 :(得分:1)

您的问题不在于likes属性,而在于docundefined的情况。错误文本清楚地表明:

  

未捕获的TypeError:无法读取属性&#39;喜欢&#39;未定义的

那是因为您在Tracker.autorun后过早使用Meteor.subscribe而您的notes集合 您正在使用const doc = Notes.findOne(...)

有两种方法可以解决这个问题:

[不推荐] 在订阅的Tracker.autorun回调中致电onReady以确保订阅准备就绪(收到了收集的文件):

Meteor.subscribe('notes', () => {
  this.tracker = Tracker.autorun(...);
  ...
});

[推荐] 在使用前检查doc值:

const doc = Notes.findOne(...);
if (doc == null) {
  return;
}
...