2016-09-27 41 views
2

我学习继电器,我懂了工作,但有时感觉就像是一个偶然的机会:)继电器抱怨片段变量,但没有碎片的有变数

对不起,如果我让初学者在这里犯错误,我已经阅读了手册和所有例子,但我似乎无法将我的头围绕在一起。

无论如何,我现在有以下问题。

我的模式是这样的:

​​

所有的数据都在{}观众,这需要认证的保健访问。演员领域只是其中之一。

Actor是UserType的一个实例,当前登录的用户。

我想要一个理智的组件层次结构,其中顶层组件仅获取用户作为道具(并为其所需属性提供片段)。但接力赛表示,我做得不对,我不确定我做错了什么。

我的代码如下所示(相当混乱的时刻,因为我测试的东西出来):

class UserRegistrationPage extends React.Component { 

    render() { 
     const user = this.props.user; 
     return (
      <View> 
       <Text>Email: {user.email}</Text> 
      </View> 
     ); 
    } 

    submit(model) { 
     const user = this.props.user; 

     this.props.relay.commitUpdate(
      new UpdateUserMutation({ 
       id: user.id, 
       ...model 
      }, { 
       onSuccess: response => { 
        console.log("SUCCESS!"); 
        console.log(response); 
       }, 
       onFailure:() => { 
        console.log("FAIL!"); 
       } 
      })); 
    } 

} 

UserRegistrationPage = Relay.createContainer(UserRegistrationPage, { 
    fragments: { 
     user:() => Relay.QL` 
      fragment on User { 
       email 
      } 
     `, 
    }, 
}); 

////////////////////////////// 

class UserRegistrationViewer extends React.Component { 

    render() { 
     return <UserRegistrationPage user={this.props.actor} /> 
    } 

} 

UserRegistrationViewer = Relay.createContainer(UserRegistrationViewer, { 
    fragments: { 
     actor:() => Relay.QL` 
      fragment on Viewer { 
       actor { 
        ${UserRegistrationPage.getFragment('user')}, 
       } 
      } 
     `, 
    }, 
}); 

///////////////////////////////// 

class QueryConfig extends Relay.Route { 
    static routeName = 'UserRegistrationRoute'; 
    static prepareParams = routeConfigParamsBuilder; 
    static queries = { 
     actor: (Component) => 
      Relay.QL` 
        query { 
         viewer(token:$token) { 
          ${Component.getFragment('actor')}, 
         } 
        } 
     `, 
    }; 
} 

export const UserRegistrationPageComponent = (parentProps) => { 
    return (
     <Relay.Renderer 
      environment={Relay.Store} 
      Container={UserRegistrationViewer} 
      queryConfig={new QueryConfig()} 
      render={({done, error, props, retry, stale}) => { 
     if (error) { 
      return <View><Text>Error!</Text></View>; 
     } else if (props) { 
      return <UserRegistrationViewer {...parentProps} {...props} />; 
     } else { 
      return <View><Text>Loading...</Text></View>; 
     } 
     }} 
     /> 
    ) 
}; 

而且我发现了以下错误。

警告:RelayContainer:组分UserRegistrationPage被渲染 与从用于获取片段 user变量不同的变量。用变量(not fetched)获取片段,但用变量{}呈现 。这可以表示两个 可能性中的一个: - 父级在查询中设置了正确的变量 - UserRegistrationPage.getFragment('user', {...}) - 但在渲染组件时未传递 相同的变量。请务必通过 <UserRegistrationPage ... />告诉 组件使用哪些变量。 - 您有意将虚假数据传递给此组件,在这种情况下请忽略此警告。

所以我有几个问题。

1)为什么我得到那个错误,我该如何解决? 我不明白为什么它会抱怨片段变量时,没有任何片段有任何变量。

2)如何使UserRegistrationPage获取this.props.user? 我应该制作一个映射查询响应的组件树层次结构吗? 在某些时候,我有this.props.actor.user,但我不想让组件知道查询响应结构,只知道它感兴趣的对象。

3)名称是查询以某种方式与片段的名称结合在一起?

任何帮助,来改进,提示和答案的建议是非常值得欢迎的,我开始砰我的头靠在这里的墙壁:)

回答

5

我终于明白,以前躲避我的几个细节。 我会在这里发布它们,以防止其他人与继电器陷入困境。

class QueryConfig extends Relay.Route { 
    static routeName = 'UserRegistrationRoute'; 
    static prepareParams = routeConfigParamsBuilder; 
    static queries = { 
     actor: (Component) => 
      Relay.QL` 
        query { 
         viewer(token:$token) { 
          ${Component.getFragment('actor')}, 
         } 
        } 
     `, 
    }; 
} 

此处的查询在命名为“actor”时误导,因为它不返回actor。它返回查看器查询的根目录。 另外,包含的片段是供观众使用的,而不是演员。

让我们来更新它。

class QueryConfig extends Relay.Route { 
    static routeName = 'UserRegistrationRoute'; 
    static prepareParams = routeConfigParamsBuilder; 
    static queries = { 
     viewer: (Component) => 
      Relay.QL` 
        query { 
         viewer(token:$token) { 
          ${Component.getFragment('viewer')}, 
         } 
        } 
     `, 
    }; 
} 

完成。让我们看看第一个容器有什么问题。

UserRegistrationViewer = Relay.createContainer(UserRegistrationViewer, { 
    fragments: { 
     actor:() => Relay.QL` 
      fragment on Viewer { 
       actor { 
        ${UserRegistrationPage.getFragment('user')}, 
       } 
      } 
     `, 
    }, 
}); 

同样的事情在这里,名称是误导。这个容器不会将actor提供给组件,它会为查看器提供内容。

让我们来更新它。

UserRegistrationViewer = Relay.createContainer(UserRegistrationViewer, { 
    fragments: { 
     viewer:() => Relay.QL` 
      fragment on Viewer { 
       actor { 
        ${UserRegistrationPage.getFragment('user')}, 
       } 
      } 
     `, 
    }, 
}); 

因此,这里只改变了片段的名称。

现在,UserRegistrationViewer组件获取类型为ViewerType的道具“查看器”(由片段指定)。我们知道查看器包含“演员”,这是UserType的一个实例。 UserRegistrationPage需要一个属于UserType的道具“用户”,如其片段所指定的那样。

因此让我们更新组件。

class UserRegistrationViewer extends React.Component { 

    render() { 
     return <UserRegistrationPage user={this.props.viewer.actor} /> 
    } 

} 

现在我们有了一个不知道查询响应层次结构的UI组件,而且一切正常!

我仍然不知道是什么原因我得到的错误虽然:)

希望这可以帮助别人!