2017-04-23 2 views
7

{dies ist Relay Moderne}Relay Moderne Fragmentdaten ist null

In meinem UserQuery.js,

class UserQuery extends Component { 
    render() { 
    return (
     <QueryRenderer 
     environment={environment} 
     query={GetAllUsers} 
     render={({err, props}) => { 
     if(props){ 
      return <UserList /> 
     } 

     return <Text>Loading...</Text> 
     } 
    }/> 
    ) 
    } 
} 

export default UserQuery; 

Also das ist die Wurzel des Userquery ist, wo die QueryRenderer genannt wird. Nun ist die Komponente .. userlist

class UserList extends Component { 
    render() { 
    const users = this.props.users 
    return (
     <View> 
     {this.renderUsers(users)} 
     </View> 
    ) 
    } 
    renderUsers(users) { 
    if(!users) { 
     return <Text>No Users</Text> 
    } 
    return users.edges.map(user=>{ 
     return <UserItem user={user}/> 
    }) 
    } 
} 
module.exports = createFragmentContainer(
    UserList, 
    graphql` 
    fragment userList_users on userEdges { 
    node { 
     ...userItem_user 
    } 
    } 
    ` 
) 

Benutzerliste Fragment, das die Informationen für das Kind enthält userItem dh

class UserItem extends React.Component { 
    render() { 
    const user = this.props.user; 
    return (
     <View> 
     <Text>{user}</Text> 
     </View> 
    ) 
    } 
} 
module.exports = createFragmentContainer(
    UserItem, 
    graphql` 
    fragment userItem_user on User { 
     username 
    } 
    ` 
) 

Das Problem ist, wenn console.log (this.props.users) in userlist, es gibt Null . Und das Fragment userList = {}

Aber wenn ich es tun, ohne Fragmente zu verwenden, indem Sie einfach this.props.users aus der UserQuery-Komponente an die Kinder übergeben, funktioniert es gut.

Es wird großartig, wenn jemand createFragmentContainer mit einem besseren Beispiel erarbeiten kann. Dank ..

+0

Ich habe genau das gleiche Problem und stecken. Eine Lösung gefunden? –

Antwort

3

Ich bin neu zu modern Relais, aber soweit ich verstehe, müssen Sie das Objekt abgefragt, um das Kind wie in diesem Beispiel passieren:

https://github.com/apollographql/relay-modern-hello-world/blob/master/src/App.js#L32

Und Sie anscheinend brauchen die Dateneigenschaft zu verwenden, weil sie das richtige Fragment extrahiert

Ich stolperte über diese Frage, während ich versuchte, herauszufinden, ob ich es irgendwie vermeiden kann, dies zu tun, da es ein wenig unnötig erscheint.

+1

Danke! Durch einen seltsamen Zufall hast du meinen Tag gerettet! ;-) – jhm

+2

Ich stimme allerdings zu, dass es seltsam erscheint, die Daten im gesamten Baum weiterzuleiten. Ich nahm naiv an, dass Relay die deklarierten GQL/Fragmentdaten als Requisiten durch den Fragmentcontainer "injizieren" würde, aber anscheinend nicht - ich kann es zumindest nicht funktionieren sehen. Hast du einen Weg gefunden, es zu tun? Ich finde, dass die offiziellen Dokumente für den FragmentContainer in diesem Fall sehr irreführend sind, da es nur von der Benennung des Fragments spricht und dass, wenn Sie ' _ ' folgen, dass es in der Komponente mit dem gegebenen Propnamen angezeigt wird, oder sonst 'data' wenn Deklaration nur' 'ist. : - / – jhm

0

Vermutlich GetAllUsers ist etwas entlang der Linien von:

graphql` 
    query UserQuery { 
    viewer { 
     users { 
     edges { 
      ...userList_users 
     } 
     } 
    } 
    } 
` 

In diesem Fall werden Sie sicherstellen möchten, UserList ist die richtigen Requisiten bekommen:

class UserQuery extends Component { 
    render() { 
    return (
     <QueryRenderer 
     environment={environment} 
     query={GetAllUsers} 
     render={({err, props}) => { 
      if (props) { 
      return <UserList users={ this.props.viewer.users.edges } /> 
      } 

      return <Text>Loading...</Text> 
     }} 
     /> 
    ) 
    } 
} 

Insbesondere fragment userList_users on userEdges in UserList erwartet ein users Requisite, die ein Array von userEdges enthält.

0
I fixed it by changing the UserList fragment 

fragment userList_user on Viewer { //removed userEdges 
     edges { 
      node { //moved node to the main query 
      id 
      } 
     } 
    ` 
<QueryRenderer 
     environment={environment} 
     query={graphql` 
     query getUsersQuery { 
     viewer { 
      ...userList_user 
     } 
     } 
    `} 
     render={({error, props}) => { 
     if(props) return <UserList users={props.viewer}/> 
     return <Text style={{marginTop:20}}>Loading...</Text> 
    } 
    }/>