[RN] react-native FlatList 实现列表选中的最佳方式(刷新指定Item)
效果如下:

核心思路就是往数据源里面 给每条数据加一个选中状态.
如图在网络请求完成之后,给每条数据添加一个select的状态:
data.list.forEach(item => item.select = false);
fetchList(page) {
if (page == && !this.state.refreshing) {
Toast.loading('加载中', )
}
Fetch.postFetch(API.homeList, { page }).then(data => {
// 这一句是核心代码
data.list.forEach(item => item.select = false);
if ( == page) {
this.setState({
listData : data.list,
total : data.info.total,
page : page + ,
refreshing : false,
}, () => Toast.hide())
} else {
const oldData = this.state.listData;
this.setState({
listData : oldData.concat(data.list),
total : data.info.total,
page : page + ,
loadingMore : false,
}, () => Toast.hide());
}
})
};
然后就是render FlatList
<FlatList
style={styles.flatList}
data={listData}
// 这是一种数据源没有唯一id的时候自己手动生成的方式 +"1" 是为了把int类型转string 因为key是需要string类型
// keyExtractor={(item, index) => (index + '1')}
keyExtractor={item => item.id}
renderItem={({ item, index }) => (
<Item
item={item}
select={item.select}
onPress={() => this.changeSelect(index, item.select)}
/>)
}
/>
然后就是 Item 里面 需要做渲染更新判断了,shouldComponentUpdate是指定渲染的关键
export default class Item extends Component {
shouldComponentUpdate(nextProps,nextState){
return (this.props.item != nextProps.item || this.props.select != nextProps.select);
}
render() {
// 这里我就把其他布局文件省略了
console.log('item render ') // 从这里可以看到 每次改变item是,只刷新了指定item
const { item } = this.props;
return (
<TouchableOpacity style={styles.container} onPress={this.props.onPress}>
{
item.select ?
<Icon name='oneIcon|icon_check_fill' size={FS.ICON} color={CS.THEME11}/>
:
<Icon name='oneIcon|icon_checkBox' size={FS.ICON} color={CS.THEME11}/>
}
</TouchableOpacity>
);
}
}
这里更建议用这种写法,简洁(ES6的写法 字符串模板)
<Icon name={`oneIcon|${item.select? 'icon_check_fill':'icon_checkBox' }`} size={FS.ICON} color={CS.THEME11}/>
参考来源:
https://www.jianshu.com/p/437a195e4f14
[RN] react-native FlatList 实现列表选中的最佳方式(刷新指定Item)的更多相关文章
- [RN] React Native FlatList 选中后 状态没有立即发生改变,而在下一次生效的问题
React Native FlatList 选中后 状态没有立即发生改变,而在下一次生效的问题 解决关键: 给 FlatList 添加 extraData={this.state} 非常关键,如果不设 ...
- [RN] React Native FlatList跳转到顶部/底部
React Native FlatList跳转到顶部/底部 核心代码如下: <ScrollView showsVerticalScrollIndicator={false} contentCon ...
- [RN] React Native 实现图片预览
[RN] React Native 实现图片预览 效果预览: 代码如下: 'use strict'; import React, {Component} from 'react'; import {I ...
- [RN] React Native 常见基本问题归纳总结
[RN] React Native 常见基本问题归纳总结 本问题总结涉及到版本为: "react": "16.8.3","react-native& ...
- [RN] React Native 关闭所有黄色警告
[RN] React Native 关闭所有黄色警告 console.ignoredYellowBox = ['Warning: BackAndroid is deprecated. Please u ...
- [RN] React Native 下实现底部标签(支持滑动切换)
上一篇文章 [RN] React Native 下实现底部标签(不支持滑动切换) 总结了不支持滑动切换的方法,此篇文章总结出 支持滑动 的方法 准备工作之类的,跟上文类似,大家可点击上文查看相关内容. ...
- [RN] React Native 幻灯片效果 Banner
[RN] React Native 幻灯片效果 Banner 1.定义Banner import React, {Component} from 'react'; import {Image, Scr ...
- [RN] React Native 常用命令行
[RN] React Native 常用命令行 1.查看当前版本 react-native --version 或 react-native -v 2.创建指定版本的React Native项目 1) ...
- [RN] React Native 实现 类似QQ 登陆页面
[RN] React Native 实现 类似QQ 登陆页面 一.主页index.js 项目目录下index.js /** * @format */ import {AppRegistry} from ...
随机推荐
- ubuntu串口连接linux车机设备
一.用到的命令或者程序 1.dmesg命令 2.minicom软件 二.开搞 1.安装minicom sudo apt-get install minicom 2.查看串口信息 dmesg | gre ...
- 【新特性速递】单元格导航(上下左右键,TAB键和ENTER键)
上下左右按键 其实单元格导航(上下左右按键,需要启用表格的ShowSelectedCell属性)一直都存在,只不过之前的版本(v5.5.0)有一些小的BUG. BUG1 比如锁定列存在时,上下左右键只 ...
- C# HTTP系列 HttpWebRequest 与 HttpWebResponse
HTTP协议,即超文本传输协议(Hypertext transfer protocol).是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网 ...
- 传统码头建设企业:Azure DevOps Server 流水线技术沟通
受某码头建设企业的邀请,与企业软件研发团队就如何利用Azure DevOps Server进行了沟通.结合企业当前技术框架和管理流程,探索利用微软Azure DevOps Server的技术能力,加强 ...
- Python连载33-共享变量加锁、释放
一.共享变量 共享变量:当多个线程访问同一个变量的时候.会产生共享变量的问题. 例子: import threading sum = 0 loopSum = 1000000 def myAdd(): ...
- Worker Services的新项目模板
.NET Core3.0创建Worker Services2019-10-24 09:05 成天 阅读(1438) 评论(20) 编辑收藏 .NET CORE 3.0新增了Worker Ser ...
- 将服务器时间类型改为UTC(0000)
方法一: # timedatectl set-timezone UTC # timedatectl set-time "YYYY-MM-DD HH:MM:SS" # time ...
- AngleSharp 实战(01)之最简单的示例
文档地址:https://anglesharp.github.io/docs/Examples.html 直接贴代码了: using System; using System.Linq; using ...
- ELK学习笔记之Elasticsearch删除指定日期的数据(脚本+定时任务)
0x00 概述 目前使用的ES版本为6.3.x,经过长时间的积累,ES内数据越来越多,需要删除指定日志之前的日志. 例如只要求保留60天的日志,那么就要删除60天之前的所有索引和日志. 0x01 ES ...
- VS2019打开旧项目导致引用失效的解决方案
用VS2019打开VS2015创建的MVC项目时所有引用全部失效: 解决方案: 打开项目的csproj文件,删除 Target节点,在重新打开项目. <Target Name="Ens ...