zoukankan      html  css  js  c++  java
  • FlatList

    ListView问题:

      

     FlatList是基于VirtualizedList的。

     

     

     

    https://www.jianshu.com/p/47a2ad2bf527    FlatList属性详解

     FlatList:注意第一批次渲染的元素不会在滑动过程中被卸载,这样是为了保证 用户执行返回顶部的操作时,不需要重新渲染首批元素。

        initialNumToRender:number 指定一开始渲染的元素数量,最好刚刚够填满一个屏幕。

        itemSeparatorComponent?:?ReactClass<any>行与行之间的分割线 组件。不会出现在第一行之前和最后一行之后。

        ListFooterComponent?:?ReactClass<any>设置尾部组件。

        ListHeaderComponent?:?ReactClass<any>设置头部组件。

        extraData?:any 如果有除data以外的数据用在列表中(不论是用在 renderItem还是Header或者 Footer中),请在此属性中指定。此数据修改时需要先修改其引用地址,然后再修改其值,否则界面很可能不会刷新。

        getItemLayout是一个可选的优化,用于避免动态测量内容尺寸的开销,不过前提是你可以提前知道内容的高度。

          getItemLayout={(data,index)=>( {length:行高,offset:行高*index,index } )}

          注意如果你指定了SeparatorComponent,请把分割线的尺寸也 考虑到offset的计算之中。

        legacyImplementation?:?bollean 设置为true 则使用旧的ListView的实现。

        numColumns:number 多列布局 只能在非水平模式下使用,即必须是horizontal={false}。此时组件内元素会从左到右从上到下按Z字形排列,类似启用了flexWrap的布局。组件内元素必须是等高的——暂时还无法支持瀑布流布局。

        检测用户滚动到底部的距离和需要执行的函数:

     检测可见行元素变化时的配置和执行函数:

    FlatList方法:

      scrollToEnd(params?:object)

      滚动到底部调用。如果 不设置getItemLayout属性的话,可能会比较卡。

      scrollToIndex(params:object)

      滚动到指定位置,如果不设置getItemLayout属性的话,可能会比较卡。

      scrollToItem(params:object)

      需要线性扫描数据——如果可能,请使用scrollToIndex。如果不设置getItemLayout属性的话 只能滚动到当前渲染窗口的某个位置。

      scrollToOffset(params:object)

      滚动到列表中特定内容像素偏移量。

      recordInteraction()待定

    实例:(不可直接使用)

    import React from 'react';
    import {Map, FlatList} from 'react-native';
    class MyListItem extends React.PureComponent {
      _onPress = () => {
        this.props.onPressItem(this.props.id);
      };
      render() {
        return <SomeOtherWidget {...this.props} onPress={this._onPress} />;
      }
    }
    class MyList extends React.PureComponent {
      state = {selected: new Map()};
      _keyExtractor = (item, index) => item.id;
      _onPressItem = id => {
        this.setState(state => {
          const selected = new Map(state.selected);
          selected.set(id, !selected.get(id));
          return {selected};
        });
      };
      _renderItem = ({item}) => (
        <MyListItem
          id={item.id}
          onPressItem={this._onPressItem}
          selected={!!this.state.selected.get(item.id)}
          title={item.title}
        />
      );
      render() {
        return (
          <FlatList
            data={this.props.data}
            extraData={this.state}
            keyExtractor={this._keyExtractor}
            renderItem={this._renderItem}
          />
        );
      }
    }

    解析:

      组件继承自PureComponent而非通常的Component,这意味着如果其props在浅比较中是相等的,则不会重新渲染。

      对于MyListItem组件来说,其 onPressItem属性使用箭头函数 而非bind的方式进行绑定,使其不会在每次列表重新render时生成一个新的函数,从而保证了props的不变性(当然前提是id、selected和title也没变),不会触发自身无畏的重新render。

      给 FlatList指定extraData={this.state}属性,是为了保证state.selected变化时,能够正确触发FlatList的更新。如果不指定此属性,则FlatList不会触发更新,因为它是一个pureComponent,其props在===比较中没有变化则不会触发更新。

      

      

  • 相关阅读:
    测开之函数进阶· 第4篇《匿名函数》
    函数进阶· 第3篇《常用内置函数filter()、map()、zip(),怎么用的呢?》
    测开之函数进阶· 第1篇《递归函数》
    测开之数据类型· 第4篇《迭代器、生成器》
    数据类型· 第1篇《元组和列表的性能分析、命名元组》
    Appium上下文和H5测试(二)
    聊聊「测试分工和测试时间」
    Ui Automator 框架和Ui Automator Viewer你会用吗?附送「必备adb命令」拿走不谢 !
    使用Typora+PicGo配置Gitee图床
    持续集成有什么好处?快来看鸭
  • 原文地址:https://www.cnblogs.com/em2464/p/12193534.html
Copyright © 2011-2022 走看看