React-Apollo 不连贯的数据
React-Apollo incoherent data
我一直在试用 Apollo 和 React,但目前遇到了问题。
我有一个产品属于多个类别的基本数据
query getProduct{
product(id: 1){
id
name
categories{id,name}
}
}
正如预期的那样 returns 像这样
{
"data": {
"p": {
"id": 1,
"name": "Samsung Galaxy S7",
"categories": [
{
"name": "Phone"
},
{
"name": "Samsung"
}
]
}
}
}
这是我的反应组件
class TileProductComponent extends Component{
constructor(...args){
super(...args)
}
render(){
if(this.props.data.loading)
return <div>Loading...</div>
var product = this.props.data.p
console.log(this.props.data)
return (
<div> {product.name} </div>
)
}
}
var TileProduct = graphql(
gql`
query TestQuery($id: Int!){
product(id: $id){
id
name
categories{id,name}
}
}
`,
{
options : {
variables : {id:1}
}
}
)(TileProductComponent)
但是一旦它在反应组件中传递,我发现它是(来自 console.log(this.props.data))
"product": {
"id": 1,
"name": "Phone",
"categories": [
{
"name": "Phone"
},
{
"name": "Samsung"
}
]
}
产品名称不知为何采用了第一类的名称?我猜 id 也会。解决方法是更改模式中字段的名称,但我认为它不应该这样做。
这是一个已知问题还是我是唯一遇到此问题的人?任何建议的解决方案?
问题出在您的 dataIdFromObject
函数上。此函数需要 return 来自服务器的不同对象的唯一值。一种简单的方法是使用 GraphQL 内置的 __typename
字段和您的 ID 字段。这是一个代码片段:
const client = new ApolloClient({
queryTransformer: addTypename,
dataIdFromObject: (result) => {
if (result.id && result.__typename) {
return result.__typename + result.id;
}
return null;
}
});
要查看它在应用上下文中的使用情况,请查看 GitHunt 前端示例,该示例使用 SQL 增量 ID:https://github.com/apollostack/GitHunt-React/blob/380bedaef97f2a0932c1ab33bd964812d4a8a65e/ui/client.js#L42-L48
我一直在试用 Apollo 和 React,但目前遇到了问题。
我有一个产品属于多个类别的基本数据
query getProduct{
product(id: 1){
id
name
categories{id,name}
}
}
正如预期的那样 returns 像这样
{
"data": {
"p": {
"id": 1,
"name": "Samsung Galaxy S7",
"categories": [
{
"name": "Phone"
},
{
"name": "Samsung"
}
]
}
}
}
这是我的反应组件
class TileProductComponent extends Component{
constructor(...args){
super(...args)
}
render(){
if(this.props.data.loading)
return <div>Loading...</div>
var product = this.props.data.p
console.log(this.props.data)
return (
<div> {product.name} </div>
)
}
}
var TileProduct = graphql(
gql`
query TestQuery($id: Int!){
product(id: $id){
id
name
categories{id,name}
}
}
`,
{
options : {
variables : {id:1}
}
}
)(TileProductComponent)
但是一旦它在反应组件中传递,我发现它是(来自 console.log(this.props.data))
"product": {
"id": 1,
"name": "Phone",
"categories": [
{
"name": "Phone"
},
{
"name": "Samsung"
}
]
}
产品名称不知为何采用了第一类的名称?我猜 id 也会。解决方法是更改模式中字段的名称,但我认为它不应该这样做。
这是一个已知问题还是我是唯一遇到此问题的人?任何建议的解决方案?
问题出在您的 dataIdFromObject
函数上。此函数需要 return 来自服务器的不同对象的唯一值。一种简单的方法是使用 GraphQL 内置的 __typename
字段和您的 ID 字段。这是一个代码片段:
const client = new ApolloClient({
queryTransformer: addTypename,
dataIdFromObject: (result) => {
if (result.id && result.__typename) {
return result.__typename + result.id;
}
return null;
}
});
要查看它在应用上下文中的使用情况,请查看 GitHunt 前端示例,该示例使用 SQL 增量 ID:https://github.com/apollostack/GitHunt-React/blob/380bedaef97f2a0932c1ab33bd964812d4a8a65e/ui/client.js#L42-L48