我正在使用graphql
react apollo 提供的 HOC 获取数据列表。例如:
const fetchList = graphql(
dataListQuery, {
options: ({ listId }) => ({
variables: {
listId,
},
}),
props: ({ data: { loading, dataList } }) => {
return {
loading,
list: dataList,
};
}
}
);
我在受控单选按钮组中显示列表,默认情况下我需要选择其中一项。所选项目的id
保存在 Redux 存储中。
selectedItem
那么,问题是在查询成功返回后如何更新 Redux 存储(即设置)?
我想到的一些选择:
选项1
APOLLO_QUERY_RESULT
我应该在我的 Redux reducer 中监听操作吗?但这有点尴尬,因为这样我就需要听两者APOLLO_QUERY_RESULT
,APOLLO_QUERY_RESULT_CLIENT
如果查询之前已经运行过。而且operationName
道具只出现在APOLLO_QUERY_RESULT
动作中而不是APOLLO_QUERY_RESULT_CLIENT
动作中。所以我需要剖析每一个APOLLO_QUERY_RESULT_CLIENT
动作,才能知道它是从哪里来的。难道没有一种简单直接的方法来识别查询结果操作吗?
选项 2
我是否应该分派一个单独的动作SELECT_LIST_ITEM
,componentWillReceiveProps
例如(使用recompose):
const enhance = compose(
connect(
function mapStateToProps(state) {
return {
selectedItem: getSelectedItem(state),
};
}, {
selectItem, // action creator
}
),
graphql(
dataListQuery, {
options: ({ listId }) => ({
variables: {
listId,
},
}),
props: ({ data: { loading, dataList } }) => ({
loading,
items: dataList,
}),
}
),
lifecycle({
componentWillReceiveProps(nextProps) {
const {
loading,
items,
selectedItem,
selectItem,
} = nextProps;
if (!selectedItem && !loading && items && items.length) {
selectItem(items[items.length - 1].id);
}
}
})
);
选项 3
我是否应该通过注入 Apollo 客户端直接使用它,withApollo
然后使用client.query(...).then(result => { /* some logic */ selectItem(...)})
. 但是我会失去 react-apollo 集成的所有好处,所以不是一个真正的选择。
选项 4
查询返回后我是否应该完全不更新 Redux 存储?因为我也可以只实现一个选择器,selectedItem
如果它已设置,则返回它,如果没有,它会尝试通过浏览apollo
商店的一部分来派生它。
我的选择都不能让我满意。那么,我该怎么做呢?