我使用React Apollo查询数据存储区中的所有记录,以便在搜索过滤器中创建选项。
我使用的重要数据库模型是Report
。
Report
有doorType
,doorWidth
,glass
和manufacturer
字段。
目前,当查询响应时,我将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
}
}
}
答案 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
)。上面的例子已经防止向你的孩子发送一个未定义的道具,但如果你愿意,你可以很容易地将这些属性合并到你的逻辑中。