如果页面刷新,React 中的 Meteor 订阅使用传递的 prop 错误
Meteor subscription in React using a passed prop errors if page is refreshed
我正在使用 React 和 Meteor。在我的顶级组件中,我有我的主要订阅:
export default withTracker(() => {
let groupsSub = Meteor.subscribe('groups');
let eventsSub = Meteor.subscribe('events');
let userSub = Meteor.subscribe('currentUser');
return {
groups: Groups.find({}).fetch(),
events: Events.find({}).fetch(),
user: Meteor.user() || false,
};
})(App);
订阅数据作为道具传递给新页面上的子组件(使用 React Router 4)。
到目前为止,这是有效的。在子页面上,我还需要从道具中获取一个 ID,并将其用作名为 CommentsApiSub 的附加订阅的一部分:
export default withTracker(props => {
const attachedTo = props.group[0]._id;
let CommentsApiSub = Meteor.subscribe('comments', { attachedTo });
return {
comments: CommentsApi.find({}).fetch(),
};
})(Child);
这是 CommentsApi 出版物:
Meteor.publish('comments', function({ attachedTo }) {
console.log(attachedTo);
return CommentsApi.find(
{ attachedTo },
{ fields: { date: 1, body: 1, user: 1 } },
);
});
如果我导航到该页面,它工作正常,但如果我刷新页面,我会收到错误消息:
Uncaught TypeError: Cannot read property '_id' of undefined
我知道这是因为 props.group 尚未加载,但我不确定如何延迟调用我的评论订阅?
在尝试加载组件之前,您需要检查 Meteor 订阅是否准备就绪。 Meteor.subscribe() returns 一个 订阅句柄 ,其中包含一个名为 ready( )。作为使用您的代码的示例;
export default withTracker(() => {
const groupsSub = Meteor.subscribe('groups');
// Remaining of the code here
return {
loading: !groupsSub.ready()
groups: Groups.find({}).fetch(),
// Other props
};
})(App);
并且在您的 render() 方法中,您可以使用 loading 属性来检查订阅是否准备就绪;
render () {
const { loading } = this.props;
if (loading) {
return (
<h2>Loading Page ...</h2>
);
}
// Remaining of the code
}
可以参考Meteor官方文档here。
我正在使用 React 和 Meteor。在我的顶级组件中,我有我的主要订阅:
export default withTracker(() => {
let groupsSub = Meteor.subscribe('groups');
let eventsSub = Meteor.subscribe('events');
let userSub = Meteor.subscribe('currentUser');
return {
groups: Groups.find({}).fetch(),
events: Events.find({}).fetch(),
user: Meteor.user() || false,
};
})(App);
订阅数据作为道具传递给新页面上的子组件(使用 React Router 4)。
到目前为止,这是有效的。在子页面上,我还需要从道具中获取一个 ID,并将其用作名为 CommentsApiSub 的附加订阅的一部分:
export default withTracker(props => {
const attachedTo = props.group[0]._id;
let CommentsApiSub = Meteor.subscribe('comments', { attachedTo });
return {
comments: CommentsApi.find({}).fetch(),
};
})(Child);
这是 CommentsApi 出版物:
Meteor.publish('comments', function({ attachedTo }) {
console.log(attachedTo);
return CommentsApi.find(
{ attachedTo },
{ fields: { date: 1, body: 1, user: 1 } },
);
});
如果我导航到该页面,它工作正常,但如果我刷新页面,我会收到错误消息:
Uncaught TypeError: Cannot read property '_id' of undefined
我知道这是因为 props.group 尚未加载,但我不确定如何延迟调用我的评论订阅?
在尝试加载组件之前,您需要检查 Meteor 订阅是否准备就绪。 Meteor.subscribe() returns 一个 订阅句柄 ,其中包含一个名为 ready( )。作为使用您的代码的示例;
export default withTracker(() => {
const groupsSub = Meteor.subscribe('groups');
// Remaining of the code here
return {
loading: !groupsSub.ready()
groups: Groups.find({}).fetch(),
// Other props
};
})(App);
并且在您的 render() 方法中,您可以使用 loading 属性来检查订阅是否准备就绪;
render () {
const { loading } = this.props;
if (loading) {
return (
<h2>Loading Page ...</h2>
);
}
// Remaining of the code
}
可以参考Meteor官方文档here。