我用howtographql.com学习了GraphQL,但是当使用变异投票时,UI不会更新。我在商店使用readQuery和writeQuery,在搜索之后,我在客户端测试使用readQuery和writeQuery,但不能再次工作。
包使用和版本:
├─阿波罗-boost@0.4.3
├─阿波罗缓存内存@1.6.2
├─阿波罗缓存@1.3.2
├─阿波罗-客户端@2.6.3
├─阿波罗-链接-上下文@1.0.18
├─阿波罗-链接-错误@1.1.11
├─阿波罗-链接-http-common@0.2.14
http@1.5.15├─阿波罗-链接
├─阿波罗-link@1.2.12
├─阿波罗-实用程序@1.3.2
├─react-阿波罗@2.5.8
LinkList.js
import React, { Component } from 'react';
import Link from './Link';
import { Query } from 'react-apollo';
import gql from 'graphql-tag';
export const FEED_QUERY = gql`
{
feed {
links {
id
createdAt
url
description
postedBy {
id
name
}
votes {
id
user {
id
}
}
}
}
}
`
class LinkList extends Component {
_updateCacheAfterVote = (store, createVote, linkId) => {
const data = store.readQuery({ query: FEED_QUERY })
const votedLink = data.feed.links.find(link => link.id === linkId)
votedLink.votes = createVote.link.votes
store.writeQuery({ query: FEED_QUERY, data })
}
render() {
return (
<Query query={FEED_QUERY}>
{({ loading, error, data }) => {
if (loading) return <div>Fetching</div>
if (error) return <div>Error</div>
const linksToRender = data.feed.links
return (
<div>
{linksToRender.map((link, index) => (
<Link
key={link.id}
link={link}
index={index}
updateStoreAfterVote={this._updateCacheAfterVote}
/>
))}
</div>
)
}}
</Query>
)
}
}
export default LinkListLink.js
import React, { Component } from 'react'
import { AUTH_TOKEN } from '../constants'
import { timeDifferenceForDate } from '../utils';
import { Mutation } from 'react-apollo';
import gql from 'graphql-tag';
const VOTE_MUTATION = gql`
mutation VoteMutation($linkId: ID!) {
vote(linkId: $linkId) {
id
link {
votes {
id
user {
id
}
}
}
user {
id
}
}
}
`
class Link extends Component {
render() {
const authToken = localStorage.getItem(AUTH_TOKEN)
return (
<div className="flex mt2 items-start">
<div className="flex items-center">
<span className="gray">{this.props.index + 1}</span>
{authToken && (
<Mutation
mutation={VOTE_MUTATION}
variables={{ linkId: this.props.link.id }}
update={(store, { data: { vote } }) =>
this.props.updateStoreAfterVote(store, vote, this.props.link.id)
}
>
{voteMutation => (
<div className="ml1 gray fl1 pointer" onClick={voteMutation}>
▲
</div>
)}
</Mutation>
)}
</div>
<div className="ml1">
<div>
{this.props.link.description} ({this.props.link.url})
</div>
<div className="f6 lh-copy gray">
{this.props.link.votes.length} votes | by{' '}
{this.props.link.postedBy
? this.props.link.postedBy.name
: 'Unknown'}{' '}
{timeDifferenceForDate(this.props.link.createdAt)}
</div>
</div>
</div>
)
}
}
export default Link发布于 2019-07-30 01:41:11
我像这样修改了_updateCacheAfterVote函数,它就可以工作了
_updateCacheAfterVote = (store, createVote, linkId) => {
const data = store.readQuery({ query: FEED_QUERY })
data.feed.links.find(link => link.id === linkId).votes.push(createVote)
store.writeQuery({ query: FEED_QUERY, data })
}https://stackoverflow.com/questions/57227587
复制相似问题