效果如下:

核心思路就是往数据源里面 给每条数据加一个选中状态.

如图在网络请求完成之后,给每条数据添加一个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)的更多相关文章

  1. [RN] React Native FlatList 选中后 状态没有立即发生改变,而在下一次生效的问题

    React Native FlatList 选中后 状态没有立即发生改变,而在下一次生效的问题 解决关键: 给 FlatList 添加 extraData={this.state} 非常关键,如果不设 ...

  2. [RN] React Native FlatList跳转到顶部/底部

    React Native FlatList跳转到顶部/底部 核心代码如下: <ScrollView showsVerticalScrollIndicator={false} contentCon ...

  3. [RN] React Native 实现图片预览

    [RN] React Native 实现图片预览 效果预览: 代码如下: 'use strict'; import React, {Component} from 'react'; import {I ...

  4. [RN] React Native 常见基本问题归纳总结

    [RN] React Native  常见基本问题归纳总结 本问题总结涉及到版本为: "react": "16.8.3","react-native& ...

  5. [RN] React Native 关闭所有黄色警告

    [RN] React Native 关闭所有黄色警告 console.ignoredYellowBox = ['Warning: BackAndroid is deprecated. Please u ...

  6. [RN] React Native 下实现底部标签(支持滑动切换)

    上一篇文章 [RN] React Native 下实现底部标签(不支持滑动切换) 总结了不支持滑动切换的方法,此篇文章总结出 支持滑动 的方法 准备工作之类的,跟上文类似,大家可点击上文查看相关内容. ...

  7. [RN] React Native 幻灯片效果 Banner

    [RN] React Native 幻灯片效果 Banner 1.定义Banner import React, {Component} from 'react'; import {Image, Scr ...

  8. [RN] React Native 常用命令行

    [RN] React Native 常用命令行 1.查看当前版本 react-native --version 或 react-native -v 2.创建指定版本的React Native项目 1) ...

  9. [RN] React Native 实现 类似QQ 登陆页面

    [RN] React Native 实现 类似QQ 登陆页面 一.主页index.js 项目目录下index.js /** * @format */ import {AppRegistry} from ...

随机推荐

  1. 代码问题【TADT//CVPR2019】

    paper:Li X, Ma C, Wu B, et al. Target-Aware Deep Tracking[C]. //CVPR2019 调用adam.m时候报错 结构体内容引用自非结构体数组 ...

  2. Nginx+Tomcat+Memcache 实现session共享

    Nginx + Tomcat + Memcache 实现session共享 1. Nginx 部署 1.上传源码包到服务器,解压安装 下载地址:http://nginx.org/en/download ...

  3. vs2017 升级后无法启动 z

    Visual Studio 2017 无法启动,进程中却有devenv.exe运行的解决办法 双击Visual Studio 2017,系统没有响应,在任务管理器中却发现devenv.exe 已经在运 ...

  4. FaaS(函数即服务) + BaaS(后台即服务)

    作者 | 黄子毅(紫益) 阿里前端技术专家 导读:前端开发者是最早享受到 “Serverless” 好处的群体,因为浏览器就是一个开箱即用.甚至无需为计算付费的环境!Serverless 把前端开发体 ...

  5. 入门理解mysql-binlog

    mysql-binlog简介: mysql的二进制日志记录了所有DDL和DML(除select) 开启binlog日志后会有1%左右的的性能损耗 二进制日志包括两类 索引文件 XXXX.index 日 ...

  6. [新概念英语] Lesson 12 : GOODBYE AND GOOD LUCK

    Lesson 12 : GOODBYE AND GOOD LUCK New words and expressions : luck (n) 运气 例句 You're not having much ...

  7. Logstash:运用jdbc_streaming来丰富我们的数据

    需要学习的地方:使用logstash获取数据后,然后根据这些数据再从MySQL数据库中进行匹配,增加一些数据到logstash的数据流中,然后输出到es 在IoT物联网时代,我们经常会遇到从传感器采集 ...

  8. 使用WebApi和Asp.Net Core Identity 认证 Blazor WebAssembly(Blazor客户端应用)

    原文:https://chrissainty.com/securing-your-blazor-apps-authentication-with-clientside-blazor-using-web ...

  9. Jenkins配置LDAP认证

    managerdn即为连接到AD的账号

  10. filebeat + ELK 部署篇

    ELK Stack Elasticsearch:分布式搜索和分析引擎,具有高可伸缩.高可靠和易管理等特点.基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储.搜索和分析操作.通 ...