1

我一直在用 React 尝试 Apollo,但目前正面临一个问题。

我有一个产品属于许多类别的基本数据

query getProduct{
    product(id: 1){
        id
        name
        categories{id,name}
    }
}

正如预期的那样,这会返回这样的东西

{
  "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也会。解决方法是更改​​模式中字段的名称,但在我看来,它不应该真的这样做。

这是一个已知问题还是我是唯一一个遇到这个问题的人?任何建议的解决方案?

4

1 回答 1

0

问题出在你的dataIdFromObject功能上。此函数需要为来自服务器的不同对象返回一个唯一值。一种简单的方法是将__typenameGraphQL 内置的字段与您的 ID 字段一起使用。这是一个代码片段:

const client = new ApolloClient({
  queryTransformer: addTypename,
  dataIdFromObject: (result) => {
    if (result.id && result.__typename) {
      return result.__typename + result.id;
    }
    return null;
  }
});

要查看它在应用程序上下文中的使用情况,请查看使用 SQL 增量 ID 的 GitHunt 前端示例:https ://github.com/apollostack/GitHunt-React/blob/380bedaef97f2a0932c1ab33bd964812d4a8a65e/ui/client.js#L42- L48

于 2016-10-18T05:05:26.457 回答