如何重新渲染平面列表?

IT技术 reactjs react-native react-native-flatlist
2021-03-26 02:12:54

与 ListView 不同,我们可以更新 this.state.datasource。是否有任何方法或示例来更新 FlatList 或重新渲染它?

我的目标是在用户按下按钮时更新文本值......

renderEntries({ item, index }) {
    return(
        <TouchableHighlight onPress={()=> this.setState({value: this.state.data[index].value+1})>
             <Text>{this.state.data[index].value}</Text>
        </TouchableHighlight>
    )
}

<FlatList 
    ref={(ref) => { this.list = ref; }} 
    keyExtractor={(item) => item.entry.entryId} 
    data={this.state.data} 
    renderItem={this.renderEntries.bind(this)} 
    horizontal={false} />
6个回答

使用extraDataFlatList 组件上属性。

正如文档所述:

通过传递extraData={this.state}FlatList我们确保FlatListstate.selected更改时会重新渲染自身如果没有设置这个props,FlatList就不会知道它需要重新渲染任何项目,因为它也是一个PureComponent并且props比较不会显示任何变化。

@Sujit 我遇到了同样的问题,但后来我意识到我已经实现了shouldComponentUpdate(),一旦我更新或完全注释掉,事情就像文档中描述的那样工作。
2021-05-27 02:12:54
@DenisCappelini,确保extraData当子项 [s] 必须重新渲染时,传递到道具中的数据会发生变化。例如,如果列表项可以处于活动/非活动状态,请确保状态变量,无论是this.state对象的一部分还是this.props对象是应该进入的内容extraData它可能是一个游标,也可能是一组活动项目等。
2021-06-10 02:12:54
我正在使用 redux,在这种情况下发送数据data={this.props.searchBookResults},既不适合我extraData={this.state}也不extraData={this.props}适合我。而且data={this.props.searchBookResults}也不行。该怎么办 ?
2021-06-14 02:12:54
我正在努力解决同样的问题。无论我传递什么extraData,组件都不会更新:(
2021-06-15 02:12:54
使用 extraData: 来刷新你的 <FlatList> ... data={this.props.searchBookResults} extraData={this.state.refresh} onPress={()={this.setState({ refresh: !refresh})}
2021-06-20 02:12:54

快速简单的解决方案尝试:

  1. 将额外数据设置为布尔值。

    extraData={this.state.refresh}

  2. 当你想重新渲染/刷新列表时切换布尔状态的值

    this.setState({ 
        refresh: !this.state.refresh
    })
    
你好,希望你是好的,你能帮我解决这个问题吗?stackoverflow.com/questions/65769926/...
2021-05-27 02:12:54
@HradeshKumar 我这样做了,但是 Data 中的最后一项不能消失!
2021-06-07 02:12:54
这正是我需要的,因为我将向数据道具添加数据。此外,这是 React-Native 团队的一个超级奇怪的实现......在数据上拥有刷新功能或属性会更有意义。伊:this.data.refresh()相反,我们设置一个布尔值并更改它。booleans 值本身没有意义,那么它存在的意义是什么?...(没有意义,除了让数据刷新正确?)
2021-06-10 02:12:54
这就像魅力一样,但我仍然不知道为什么this.state.users不起作用,即使我在某些用户中更改了标志。
2021-06-11 02:12:54
对我不起作用,你能帮忙吗:stackoverflow.com/questions/65547030/...
2021-06-20 02:12:54

哦,这很简单,只需使用 extraData

您会看到额外数据在幕后工作的方式是FlatListVirtualisedList只是检查该对象是否已通过正常onComponentWillReceiveProps方法更改

所以你所要做的就是确保你给extraData.

这是我所做的:

我正在使用immutable.js,所以我所做的就是传递一个包含我想观看的任何内容的 Map(不可变对象)。

<FlatList
    data={this.state.calendarMonths}
    extraData={Map({
        foo: this.props.foo,
        bar: this.props.bar
    })}
    renderItem={({ item })=>((
        <CustomComponentRow
            item={item}
            foo={this.props.foo}
            bar={this.props.bar}
        />
    ))}
/>

这样,当this.props.foothis.props.bar更改时,我们CustomComponentRow将更新,因为不可变对象将与前一个不同。

你好,@SudoPiz 我想在删除最后一项后重新渲染 Flatlist,可以查看这个 Q stackoverflow.com/questions/58780167/...
2021-06-14 02:12:54
我终于明白了extraData感谢您提供VirtualisedList代码链接
2021-06-17 02:12:54

好的,我刚刚发现如果我们想让 FlatList 知道 data prop 之外的数据变化,我们需要将它设置为 extraData,所以我现在这样做:

<FlatList data={...} extraData={this.state} .../>

参考:https : //facebook.github.io/react-native/docs/flatlist#extradata

你好,@MahdiBashirpour 我想在删除最后一项后重新渲染 Flatlist,可以查看这个 Q stackoverflow.com/questions/58780167/...
2021-05-24 02:12:54
你好,希望你是好的,你能帮我解决这个问题吗?stackoverflow.com/questions/65769926/...
2021-06-07 02:12:54
最好的实现......我更喜欢将它设置为与数据道具相同,所以当状态发生任何变化时它不会刷新,但这是迄今为止最简单的实现。谢谢!
2021-06-12 02:12:54
嗨,马赫迪,你能看看这个问题吗?stackoverflow.com/questions/65786115/...
2021-06-18 02:12:54

如果你打算有一个按钮,你可以在 onPress 中使用 setState 更新数据。然后 SetState 将重新呈现您的 FlatList。

您的 FlastList 中的值没有更新,因为您没有直接更新数据源。this.state.data 是用 FlatList 呈现的,但在 onPress 中你只更新 this.state.value。
2021-05-22 02:12:54
我的 touchablehighlight 中有一个 setState。setState 工作正常,但 flatlist 没有显示状态值的更新 -> this.state.value
2021-06-04 02:12:54
抱歉我的错误,问题错字。应该是 this.state.data[index].value
2021-06-19 02:12:54