我在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>
)
}
答案 0 :(得分:1)
您的问题不在于likes
属性,而在于doc
为undefined
的情况。错误文本清楚地表明:
未捕获的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;
}
...