嵌套的React / Relay组件未接收道具

Ash*_*ams 5 javascript reactjs graphql relayjs

我正在尝试将属性传递到另一个组件。将数组作为<VideoList videos={this.props.channel.video_list}></VideoList>结果传递会this.props.videos成为一个空对象:

{
  "videos": {
    "__dataID__": "client:5610611954",
    "__fragments__": {
      "2::client": "client:5610611954"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

(GraphQL根据React Chrome扩展程序的确认返回了正确的数据,只是没有传递给VideoList。)

组件/video_list.js

import React from 'react'
import Relay from 'react-relay'
import VideoItem from '../containers/video_item'    

export default class VideoList extends React.Component {
  render() {
    return(
      <div>
      {
        this.props.videos.edges.map(video =>
          <VideoItem key={video.id} video={video.node}/>
        )
      }
      </div>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

组件/channel_list.js

import React from 'react'
import Relay from 'react-relay'
import VideoList from './video_list'

export default class ChannelView extends React.Component {
  render() {
    return(
      <div>
        <Column small={24}>
          <h2>{this.props.channel.title}</h2>
        </Column>

        <VideoList videos={this.props.channel.video_list}></VideoList>
      </div>


    )
  }
}
Run Code Online (Sandbox Code Playgroud)

容器/channel_list.js

import React from 'react'
import Relay from 'react-relay'
import ChannelView from '../components/channel_view'
import VideoList from './video_list'

export default Relay.createContainer(ChannelView, {
  fragments: {
    channel: () => Relay.QL`
      fragment on Channel {
        title
        video_list {
          ${VideoList.getFragment('videos')}
        }
      }`
  },
});
Run Code Online (Sandbox Code Playgroud)

容器/video_list.js

import React from 'react'
import Relay from 'react-relay'
import VideoList from '../components/video_list'
import VideoItem from './video_item'

export default Relay.createContainer(VideoList, {
  initialVariables: {
    count: 28
  },
  fragments: {
    videos: () => Relay.QL`
      fragment on Videos {
        videos(first: $count) {
          pageInfo {
            hasPreviousPage
            hasNextPage
          }
          edges {
            node {
              ${VideoItem.getFragment('video')}
            }
          }
        }
      }`
  },
});
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我是否误解了中继的工作方式?我希望能够count在中VideoList为分页目的设置中继变量。该VideoList对象将嵌套在多个其他组件中(例如,频道,最受欢迎,用户的收藏夹等)。

谢谢!

And*_*ges 4

您尝试VideoList直接使用该组件,而不用中继容器包装它,这是错误的。您需要使用VideoList打包版本 - 您要导出的版本./containers/video_list.js

像这样:

import React from 'react'
import Relay from 'react-relay'
import VideoList from '../containers/video_list'

export default class ChannelView extends React.Component {
  render() {
    return(
      <div>
        <Column small={24}>
          <h2>{this.props.channel.title}</h2>
        </Column>

        <VideoList videos={this.props.channel.video_list}></VideoList>
      </div>


    )
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!!哇,我感觉自己很蠢!我肯定已经花了两个多小时来解决这个问题,试图找出我做错了什么。再次感谢安德烈! (3认同)
  • 这个答案救了我两个小时的挠头。谢谢! (2认同)