我有一个订阅的应用程序已经在使用subscribeToMore
查询组件:
<Query query={GET_MESSAGES}>
{({ data, subscribeToMore }) => {
return (
<MessageList
messages={data.allMessages}
subscribeToMore={subscribeToMore}/>
);
}}
</Query>
该查询加载了一个消息列表,据我所知,我们将订阅者附加到 ComponentDidMount 中,因此每当我在查询内的列表中添加新元素时,我的订阅将监听订阅并执行我想做的任何事情(在这种情况下将新消息添加到我当前的消息列表中)。
消息组件列表:
export default class MessageList extends React.Component {
componentDidMount() {
this.props.subscribeToMore({
document: MESSAGE_CREATED,
updateQuery: (prev, { subscriptionData }) => {
if (!subscriptionData.data) return prev;
return {
allMessages: [
subscriptionData.data.messageCreated,
...prev.allMessages
],
};
},
});
}
render() {
return (
<div>
{this.props.messages.map(message => (
<MessageElement key={message.id}
message={message}/>
))}
</div>
);
}}
我想添加另一个订阅,所以如果我编辑我的消息,信息会实时更新。为了实现这一点,我使用Subscription创建了以下组件
消息组件(我想根据更新的消息添加另一个订阅)
export default class MessageElement extends Component{
componentDidMount() {
this.messageUpdatedSubscription();
}
messageUpdatedSubscription = () => (
<Subscription
subscription={MESSAGE_UPDATED}>
{({ data: { messageUpdated } }) => (
console.log('Do smthg???',messageUpdated)
)}
</Subscription>
);
render(){
return(
<Mutation mutation={UPDATE_MESSAGE} key={this.props.message.id}>
{updateMessage => (
<div>
<div>{this.props.message.text}</div>
<div>
<Star active={this.props.message.isFavorite}
onClick={() => { updateMessage({ variables: {
id: this.props.message.id,
text:this.props.message.text,
isFavorite:!this.props.message.isFavorite } });
}}/>
</div>
</div>
)}
</Mutation>);
}}
我在服务器上的订阅正在工作,因为我已经在 Query 上订阅了 MESSAGE_CREATED,并且我已经在服务器上测试了我对 MESSAGE_UPDATED 的订阅已被触发。但是,我无法弄清楚为什么 UI 没有显示或 console.log 任何内容,就好像它没有收听订阅一样。
我可以通过订阅组件或 subscribeToMore 来实现这一点吗?
提前致谢