在React Apollo查询返回

时间:2017-07-21 11:28:21

标签: javascript reactjs redux graphql react-apollo

我使用React Apollo查询数据存储区中的所有记录,以便在搜索过滤器中创建选项。

我使用的重要数据库模型是Report

ReportdoorTypedoorWidthglassmanufacturer字段。

目前,当查询响应时,我将allReports传递给多个通过数组的哑组件,只获取唯一的项目来制作可选择的列表,如此...

const uniqueItems = []

items.map(i => {
  const current = i[itemType]

  if (typeof current === 'object') {
    if (uniqueItems.filter(o => o.id !== current.id)) {
      return uniqueItems.push(current)
    }
  } else if (!uniqueItems.includes(current)) {
    return uniqueItems.push(current)
  }

  return
})

显然这段代码并不漂亮,而且有点矫枉过正。

我想在查询在SidebarFilter组件中返回时调度操作。这是查询...

const withData = graphql(REPORT_FILTER_QUERY, {
  options: ({ isPublished }) => ({
    variables: { isPublished }
  })
})

const mapStateToProps = ({
  reportFilter: { isPublished }
  // filterOptions: { doorWidths }
}) => ({
  isAssessment
  // doorWidths
})

const mapDispatchToProps = dispatch =>
  bindActionCreators(
    {
      resetFilter,
      saveFilter,
      setDoorWidths,
      handleDoorWidthSelect
    },
    dispatch
  )

export default compose(connect(mapStateToProps, mapDispatchToProps), withData)(
  Filter
)

Redux操作setDoorWidths基本上完成了SidebarFilter组件中的上述代码,但它保存在商店中,因此我不需要重新运行查询用户回到页面。

很少有数据会更新,侧边栏需要更改。

希望有一个解决方案使用props函数的graphql参数。我觉得可以从ownProps获取数据,然后可以在此处调度操作,但数据可能会出错或正在加载,这会破坏渲染。

编辑:

查询:

query ($isPublished: Boolean!){
  allReports(filter:{
    isPublished: $isPublished
  }) {
  id
  oldId
  dbrw
  core
  manufacturer {
    id
    name
  }
  doorWidth
  doorType
  glass
  testBy
  testDate
  testId
  isAssessment
  file {
    url
  }
  }
}

2 个答案:

答案 0 :(得分:4)

虽然这个答案解决了问题的具体问题,但更一般的问题 - 根据查询结果发送Redux操作的位置 - 仍然不清楚。到目前为止,这似乎并不是最好的做法。

答案 1 :(得分:2)

在我看来,由于Apollo已经将查询结果缓存到您的商店中(或者是一个单独的商店,如果您没有将它们集成在一起),那么发送一个也只是简单的动作将是多余的将数据存储在商店中。

如果我正确理解了您的问题,您的意图是仅过滤传入数据一次,然后将结果作为道具发送给组件的无状态子项。使用graphql HOC配置中的props属性,您走在正确的轨道上。为什么不做这样的事情:

const mapDataToProps = ({ data = {} }) => {
  const items = data
  const uniqueItems = []

  // insert your logic for filtering the data here

  return { uniqueItems } // or whatever you want the prop to be called
}

const withData = graphql(REPORT_FILTER_QUERY, {
  options: ({ isPublished }) => ({
    variables: { isPublished }
  }),
  props: mapDataToProps,
})

以上可能需要根据data的实际结构来修改。 data has some handy props on it可以让您检查查询是否正在加载(data.loading)或有错误(data.error)。上面的例子已经防止向你的孩子发送一个未定义的道具,但如果你愿意,你可以很容易地将这些属性合并到你的逻辑中。