我有一个名为GraphQL Bookstore的示例应用程序,它创建书籍、出版商和作者并显示它们之间的关系。我正在使用订阅来实时显示更新。
出于某种原因,我的BOOK_ADDED
订阅完全绕过了graphql
包装器。它正在调用包装类,并将books
prop 设置为undefined
. 代码的相关部分如下所示(您可以在此处查看完整代码)。
class BooksContainerBase extends React.Component {
componentWillMount() {
const { subscribeToMore } = this.props;
subscribeToMore({
document: BOOK_ADDED,
updateQuery: (prev, { subscriptionData }) => {
if (!subscriptionData.data) {
return prev;
}
const newBook = subscriptionData.data.bookAdded;
// Don't double add the book
if (!prev.books.find(book => book.id === newBook.id)) {
return Object.assign({}, prev, {
books: [...prev.books, newBook]
});
} else {
return prev;
}
}
});
}
render() {
const { books } = this.props;
return <BooksView books={books} />;
}
}
...
export const BooksContainer = graphql(BOOKS_QUERY, {
props: ({ data: { loading, error, subscribeToMore, books } }) => ({
loading,
error,
subscribeToMore,
books
})
})(LoadingStateViewer(BooksContainerBase));
基本上,当客户端收到订阅通知时,updateQuery()
会调用该函数 - 正如预期的那样。但是,一旦该函数退出,render()
包装类的方法就会被直接调用并books
设置为undefined
。我预计graphql
会调用包装器,在调用render()
方法之前正确设置道具。我错过了什么?
提前致谢!