效果如下:

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

如图在网络请求完成之后,给每条数据添加一个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. ubuntu串口连接linux车机设备

    一.用到的命令或者程序 1.dmesg命令 2.minicom软件 二.开搞 1.安装minicom sudo apt-get install minicom 2.查看串口信息 dmesg | gre ...

  2. 【新特性速递】单元格导航(上下左右键,TAB键和ENTER键)

    上下左右按键 其实单元格导航(上下左右按键,需要启用表格的ShowSelectedCell属性)一直都存在,只不过之前的版本(v5.5.0)有一些小的BUG. BUG1 比如锁定列存在时,上下左右键只 ...

  3. C# HTTP系列 HttpWebRequest 与 HttpWebResponse

    HTTP协议,即超文本传输协议(Hypertext transfer protocol).是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网 ...

  4. 传统码头建设企业:Azure DevOps Server 流水线技术沟通

    受某码头建设企业的邀请,与企业软件研发团队就如何利用Azure DevOps Server进行了沟通.结合企业当前技术框架和管理流程,探索利用微软Azure DevOps Server的技术能力,加强 ...

  5. Python连载33-共享变量加锁、释放

    一.共享变量 共享变量:当多个线程访问同一个变量的时候.会产生共享变量的问题. 例子: import threading sum = 0 loopSum = 1000000 def myAdd(): ...

  6. Worker Services的新项目模板

    .NET Core3.0创建Worker Services2019-10-24 09:05  成天  阅读(1438)  评论(20)  编辑收藏 .NET CORE 3.0新增了Worker Ser ...

  7. 将服务器时间类型改为UTC(0000)

    方法一: # timedatectl  set-timezone UTC #  timedatectl set-time "YYYY-MM-DD HH:MM:SS" #  time ...

  8. AngleSharp 实战(01)之最简单的示例

    文档地址:https://anglesharp.github.io/docs/Examples.html 直接贴代码了: using System; using System.Linq; using ...

  9. ELK学习笔记之Elasticsearch删除指定日期的数据(脚本+定时任务)

    0x00 概述 目前使用的ES版本为6.3.x,经过长时间的积累,ES内数据越来越多,需要删除指定日志之前的日志. 例如只要求保留60天的日志,那么就要删除60天之前的所有索引和日志. 0x01 ES ...

  10. VS2019打开旧项目导致引用失效的解决方案

    用VS2019打开VS2015创建的MVC项目时所有引用全部失效: 解决方案: 打开项目的csproj文件,删除 Target节点,在重新打开项目. <Target Name="Ens ...