最近在写demo的时候遇到一个更新列表中某个的对象的某个值,最期待的结果肯定是局部刷新,但是我们往往在改变值之后会遇到全局都刷新的问题,以下为个人实验出来的一个小技巧。

首先我有以下数据需要通过react的列表方法渲染:

let list=[{id:1,show:false},{id:2,show:false},{id:3,show:false}
]

我们通过以下react方法进行渲染:

render(){return ({list.map((val)=>{<DemoComponent val={val}/>})})
}

在这里我们需要重新写一个DemoComponent的组件:

import React,{Component} from 'react';
export class DemoComponent extends Component{render(){<div><div>this.props.val.id</div><button onClick={()=>this.toggleDialog()}>toggle</button>  </div>}toggleDialog(){// 更改val.showDialog相关操作。}shouldComponentUpdate(nextProps){return JSON.stringify(nextProps) !== JSON.stringify(this.props);}
}

当我们点击第一个button,这个时候就能达到局部刷新,只刷新第一个DemoComponent组件的效果了。

但以上操作是什么原理呢?

首先,大家平时都推荐使用的PureComponent不能在这里使用,因为这个组件没有shouldComponentUpdate这个钩子函数,虽然PureComponent也有对比props和nextProps并自行判断当前组件是否需要重新渲染的功能,但是这个对比对对象是没有用的,因为{} === {}是返回false的(对这个知识点不理解的朋友可以去看看堆栈相关的知识),数组同理。

那么为了让其他列表组件没有必要多去render一次,所以我在shouldComponentUpdate中取了个巧,直接JSON.stringify,将两个对象转换成字符串进行比较,这样就方便的多。

当然这里也是自己为了不去写一个isEqual方法而偷懒的做法,这样做的好处是简单方便,也节省时间(isEqual方法必然会for-in循环,对于更复杂的情况甚至需要递归,在内存消耗和时间复杂度上肯定会比JSON.stringify严重),缺点在于可拓展性不高,如果是个数组,就比较头疼。

react中列表渲染的局部刷新相关推荐

  1. ArcGIS engine中Display类库 (局部刷新)

    转自原文 ArcGIS engine中Display类库 (局部刷新) Display类库包括了用于显示GIS数据的对象.除了负责实际输出图像的主要显示对象(display object)外,这个类库 ...

  2. React的列表渲染

    //9. 列表渲染class List extends React.Component{state = {list:[1,2,3,4,5],list2:[{id:1,text:'java'},{id: ...

  3. Vue3中如何进行页面局部刷新,组件刷新

    前言 今天在给vue3的项目中进行数据绑定的时候,发现我删除一条记录页面不会自动刷新,还是保留原来的状态 但是数据已经传送给后端,后端也完成了响应的处理 这个时候我想到了局部刷新,我想vue3是vue ...

  4. 在React中解析渲染markdown文件

    解决办法 安装marked对md文件进行解析 npm install marked --save 基本使用 import { marked } from 'marked';const renderer ...

  5. react入门-列表渲染(动态获取数据)

    注意:动态获取的是我自定义的后台数据,使用的时候请修改:componentDidMount中url 使用的数据如下: {"data": [{"author": ...

  6. 前端学习(2236):react的列表渲染二

    import React from 'react'; import ReactDOM from 'react-dom';class Welcome extends React.Component {c ...

  7. 前端学习(2235):react的列表渲染

    import React from 'react'; import ReactDOM from 'react-dom';class Welcome extends React.Component {c ...

  8. React教程(二)——jsx语法、条件渲染、列表渲染

    1.JSX 语法 在react中,就是使用jsx的语法,来实现DOM元素的展示.一个基本的jsx语法的react模板如下: <div>{this.props.title}</div& ...

  9. jQuery框架+DWR框架实现的Java Web中的Ajax效果(异步请求,局部刷新)

    一 简介和实现效果 这里用一个小例子来简单举例说明,做一个搜索引擎搜索提示效果,通过不断输入字符,然后在下方给出搜索提示.效果图如下: 通过上图可以看到,当输入一个"a"时,提示了 ...

最新文章

  1. Yoshua Bengio团队通过在网络「隐藏空间」中使用降噪器以提高深度神经网络的「鲁棒性」...
  2. ht-8 对arrayList中的自定义对象排序( Collections.sort(ListT list, Comparator? super T c))...
  3. 对MVC、MVP、MVVM的理解
  4. 阿里云服务器上安装java配置jdk
  5. 社交网络初探——链路预测
  6. 中国凉亭行业市场供需与战略研究报告
  7. 黑苹果 2分钟 重启_一分钟了解苹果iPad Pro 2020的激光雷达到底是什么黑科技?...
  8. Android颜色选择器
  9. 艾司博讯:拼多多店铺要不要一直上新?上新有用吗?
  10. U盘格式化导致存储空间变小的解决方法汇总
  11. Logstash配置插件grok详解
  12. php的left join,Left Join
  13. 2019.8.22 1.属性
  14. 给教师的一百条意见读后感
  15. 2021襄阳五中学高考成绩查询,高考快讯|襄阳五中2021名考生参加2021年高考
  16. 微博是这样炼成的:山寨QQ项目源码下载大全~
  17. dsa数字签名c语言编程,对文件进行DSA数字签名
  18. 硬件笔记(15)----射频天线知识
  19. 万向区块链的往事与野心 |链捕手
  20. 【渝粤教育】国家开放大学2018年秋季 0257-22T高级英语听力(1) 参考试题

热门文章

  1. 一个B端硬件产品经理的成长史
  2. 对TCL/TK的一个小总结
  3. Android Studio生成二维码
  4. 最全的mysql常用语句大全
  5. 免费在线CAD转PDF怎么批量转换
  6. 车路协同信息交互技术要求第 1 部分:路侧设施与云控平台
  7. OneDrive配合OneIndex搭建自用网盘
  8. 钉钉免费实现内网穿透绝对靠谱
  9. 【实用】关于Ubuntu下的对拍程序
  10. Kubernetes初探