2017-07-27 14 views
0

我在试图找出如何在不传递(新)变量的情况下触发新现代RefreshContainer中的刷新?在没有(新)变量的现代RefetchContainer中强制重新读取

我正在寻找最好的方法来实现良好的'拉到刷新React本机列表,应该只需重新查看原始查询 - 不需要变量?

根据文档(https://facebook.github.io/relay/docs/api-cheatsheet.html)这应该使用

this.props.relay.refetch({}, callback, {force: true})

是可能的,但我得到一个错误说 “不确定是不是( '评估taggedNode.modern')的对象”

enter image description here

查询工作得很好,如果我使用普通旧FragmentContainer代替,但我只想简单的拉到刷新功能:-)

编辑 添加更多的代码为了清晰。还更新的呼叫,以反映变化的API,包括渲染变量,传递null

class HistoryList extends React.PureComponent<void, Props, State> { 
    state = { refreshing: false }; 

    _renderRow = ({ item }) => { 
    return <HistoryListItem item={item.node} />; 
    }; 

    _renderHeader = ({ section }) => { 
    return (
     <Text style={[cs.breadText, _styles.sectionHeader]}> 
     {section.title} 
     </Text> 
    ); 
    }; 

    _onRefresh =() => { 
    this.setState({ refreshing: true }); 
    this.props.relay.refetch({}, null, this._onRefreshDone(), { force: true }); 
    }; 

    _onRefreshDone =() => { 
    this.setState({ refreshing: false }); 
    }; 

    _sortDataIntoSections = (edges: Array<Node>) => { 
    return _.chain(edges) 
     .groupBy(element => { 
     return moment(element.node.huntDate).format('MMMM YYYY'); 
     }) 
     .map((data, key) => { 
     return { title: key, data: data }; 
     }) 
     .value(); 
    }; 

    render() { 
    return (
     <View style={_styles.container}> 
     <SectionList 
      renderSectionHeader={this._renderHeader} 
      sections={this._sortDataIntoSections(
      this.props.entries.allJournalEntries.edges 
     )} 
      renderItem={this._renderRow} 
      keyExtractor={(item, index) => item.node.__id} 
      onRefresh={this._onRefresh} 
      refreshing={this.state.refreshing} 
     /> 
     </View> 
    ); 
    } 
} 

export default createRefetchContainer(
    HistoryList, 
    graphql` 
    fragment HistoryList_entries on Viewer { 
     allJournalEntries(orderBy: huntDate_DESC) { 
     count 
     edges { 
      node { 
      huntDate 
      ...HistoryListItem_item 
      } 
     } 
     } 
    } 
    ` 
); 

回答

1

的溶液在github已经发现robrichard。

我错过了RefetchContainer的第三个参数,它是在重新读取时执行的查询。这与@zetavg的建议相结合是需要的。

导出模块现在看起来是这样的:

export default createRefetchContainer(
    HistoryList, 
    { 
    entries: graphql` 
     fragment HistoryList_entries on Viewer { 
     allJournalEntries(orderBy: huntDate_DESC) { 
      count 
      edges { 
      node { 
       huntDate 
       ...HistoryListItem_item 
      } 
      } 
     } 
     } 
    ` 
    }, 
    graphql` 
    query HistoryListRefetchQuery { 
     viewer { 
     ...HistoryList_entries 
     } 
    } 
    ` 
); 
1

看来的this.props.relay.refetch参数已经改变refetch(refetchVariables, renderVariables, callback, options)(在https://facebook.github.io/relay/docs/refetch-container.html)和cheetsheet已经走出过期。

我不知道在哪个版本,这已经改变,但你可以给它一个尝试,你的代码更改为:

this.props.relay.refetch({}, null, callback, {force: true}) 
+2

你说得对!但不幸的是,它也不起作用: - / – jhm