博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react-native-lazyload
阅读量:4084 次
发布时间:2019-05-25

本文共 3667 字,大约阅读时间需要 12 分钟。

在React Native中的懒加载(lazyload)一直是个大问题,官方没有提供支持,而且React的结构也不利于实现这个功能
经过很长一段时间的挣扎与尝试之后终于完成了一款性能不错且使用较为简单的组件:

http://bbs.reactnative.cn/topic/407/react-native-lazyload

特性

  1. 纯javascript解决方案
  2. 只需要在原有代码的基础上进行一点点的改动就可以轻松实现界面、图片的懒加载
  3. 支持预加载距离设置
  4. 支持加载动画
  5. 支持长列表、长ScrollView未显示子元素的内存自动回收
  6. 健全的算法与缓存机制使得javascript线程性能飞快(不会因为滚动计算而造成js线程阻塞,1000个子元素的长列表,每次滚动js计算耗时控制在0~1ms之间)

安装

npm install react-native-lazyload

使用

  1. 引入
import {    LazyloadScrollView,    LazyloadListView,    LazyloadView,    LazyloadImage} from 'react-native-lazyload';
  1. 替换
    使用 LazyloadScrollView 替换需要实现懒加载的 ScrollViewLazyloadListView 替换 ListView
    LazyloadView替换需要被懒加载的ViewLazyloadImage 替换Image

LazyloadScrollView,LazyloadListView 的用法与ScrollView,ListView完全一样

  1. 关联元素
    给 LazyloadScrollViewLazyloadListView 添加 name 属性,并给LazyloadViewLazyloadImage添加与之对应的host属性

特别注意:

  1. 所有LazyloadViewLazyloadImage需要在 LazyloadScrollViewLazyloadListView 内,并指定与之 name 属性相同的 host属性才能使懒加载生效,因为React不能实现元素的遍历,需要通过指定这两个属性建立懒元素与滚动元素之间的对应关系
  2. LazyloadView与LazyloadImage需要设定固定的宽高,否则它们被自动回收时会造成Scroll内容的闪动

一段简单的示意代码如下:

懒加载的内容
...其他元素

注意LazyloadScrollView的name属性与LazyloadView和LazyloadImage的host属性的对应关系

例子

下面这个例子可以在有完整的代码

import React, {    AppRegistry,    Component,    StyleSheet,    Text,    View,    ListView} from 'react-native';import {    LazyloadListView,    LazyloadView} from 'react-native-lazyload';import data from './MOCK_DATA.json';class LazyloadListExample extends Component {
constructor() { super(...arguments); let ds = new ListView.DataSource({
rowHasChanged: (r1, r2) => r1 !== r2}); this.state = { dataSource: ds.cloneWithRows(data) }; } renderRow = (file) => { return
{file.id}
{file.first_name} {file.last_name}
email:
{file.email}
last visit ip:
{file.ip_address}
{file.gender}
; }; render() { return (
); }}const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#F5FCFF' }, content: { paddingTop: 20, justifyContent: 'center', alignItems: 'center' }, view: { height: 70, width: 320, paddingVertical: 5, borderBottomWidth: StyleSheet.hairlineWidth, borderBottomColor: '#666' }, file: { width: 320, flex: 1, flexDirection: 'row' }, id: { width: 50, alignItems: 'center', justifyContent: 'center' }, idText: { fontSize: 10 }, detail: { justifyContent: 'space-around', flex: 1 }, name: { textAlign: 'center', lineHeight: 15, color: '#666', marginBottom: 5 }, email: { fontSize: 10, color: 'blue', textDecorationColor: 'blue', textDecorationLine: 'underline', textDecorationStyle: 'solid' }, ip: { fontSize: 12, color: 'grey' }, gender: { width: 50, alignItems: 'center', justifyContent: 'center' }, genderText: { fontSize: 10 }, title: { color: '#333', fontSize: 12 }, male: { color: 'skyblue' }, female: { color: 'pink' }});export default LazyloadListExample;

转载地址:http://iyeni.baihongyu.com/

你可能感兴趣的文章
Android 面试题(7):你对单例模式了解多少?
查看>>
Android 面试题(8):抽象类和接口的区别?
查看>>
DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
查看>>
vs2008 mfc 添加ActiveX控件
查看>>
隐式调用动态链接库(DLL)中的类
查看>>
Android APK 签名原理
查看>>
如何快速上传开源项目至 Jcenter
查看>>
Android APK 打包过程
查看>>
Android 专用的日志封装库
查看>>
Android onSaveInstanceState
查看>>
Android 编码规范
查看>>
Android 学习之路
查看>>
程序员,你慌不慌?
查看>>
为什么要写公众号?
查看>>
安卓用户初次体验微信公众号信息流改版
查看>>
最好用的 Markdown 编辑器
查看>>
习惯一定是好的吗?
查看>>
Android Handler 消息处理机制
查看>>
微信公众号文字该如何排版?
查看>>
印象笔记终于支持 Markdown 了
查看>>