react diffing算法及函数柯里化

一.deffing 算法

(1)虚拟DOM中Key的作用:

        当状态中的书韩剧发生变化时,react会根据【新数据】生成【新的虚拟DOM】,随后React进行【新虚拟 DOM】与【旧虚拟DOM】的diff比较,比较规则如下 :

        a.旧虚拟DOM中找到了与新虚拟DOM相同的key:

                (1)若虚拟DOMM中内容哦那个没变,直接使用之前的真实DOOM

                (2)若虚拟DOM中内容变了,则生成新的真实DOM,随后替换掉页面中只花钱的真实DOM

        b.旧虚拟DOM中未找到与新虚拟DOM相同的key

                根据数据创建新的真实DOM,随后渲染到页面

(2)用index作为key可能会引发的问题:

        1.若对数据进行:逆序添加、逆序删除等破环顺序操作后,会产生没必要的真实DOOM更新。

        2.如果结构中还包含输入类的DOM:会产生错误DOM更新。

        3.注意:如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表展示,使用index作为key时没有问题的。

(3)开发中如果选择key?

        1.最好使用每条数据的唯一标识作为key,比如id、手机号、身份证号、学号等唯一标识值。

        2.如果确定只是简单的展示数据,用index也是可以的。

二.高阶函数和柯里化

高阶函数:如果一个函数符合下面两种规范中的任何一个,那该函数就是高阶函数.

        1.若A函数,接收的参数是一个函数,那么A就可以称为高阶函数

        2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数.

        常见的高阶函数有:prmise\setTimeout\arr.map()[数组函数]等等

函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。如下代码展示:

class Login extends React.Component{// 初始化state = {username:'',password:''}// 这就是柯里化代码saveForm = (dataType)=>{console.log("dataType",dataType)return (event)=>{console.log("event",event)this.setState({[dataType]:event.target.value})}}sendInfo = (enent)=>{event.preventDefault() //阻止表单提交const {username,password} = this.statealert(`您输入的用户名是:${username},您输入的密码是:${password}`)}render(){return (<div><form  onSubmit={this.sendInfo}>用户名:<input onChange={this.saveForm('username')} type="text" name="username" />    密码:<input onChange={this.saveForm('password')}  type="password" name="password" />    <button>登录</button></form>  </div>)}}

也可以不使用柯里化写法,但是要从传参那改变,如下代码所示:

class Login extends React.Component{// 初始化state = {username:'',password:''}saveForm = (dataType,event)=>{this.setState({[dataType]:event.target.value})}sendInfo = (enent)=>{event.preventDefault() //阻止表单提交const {username,password} = this.statealert(`您输入的用户名是:${username},您输入的密码是:${password}`)}render(){return (<div><form  onSubmit={this.sendInfo}>{/*在onChange传回调箭头函数,那在saveForm函数中就可以按照原来的写法做了*/}用户名:<input onChange={(event)=>{this.saveForm('username',event)}} type="text" name="username" />    密码:<input onChange={(event)=>{this.saveForm('password',event)}}  type="password" name="password" />    <button>登录</button></form>  </div>)}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RIP协议(路由信息协议)

一、RIP协议概述 RIP协议&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;即根据跳数来度量路由开销&#xff0c;进行路由选择。 相比于其它路由协议&#xff08;如OSPF、ISIS等&#xff09;&#…

C++ | string类学习 | string的常见接口使用方式

目录 为什么要学习string类&#xff1f; C语言中的字符串 OOP面向对象编程 两个面试题 标准库中的string类 string类了解 string类的文档介绍 总结 string类的常用接口说明 string类对象的常见构造 string类对象的容量操作 size()和length() clear() resize(size…

【JVM】关于JVM垃圾回收

文章目录 &#x1f334;死亡对象的判断算法&#x1f338;引用计数算法&#x1f338;可达性分析算法 &#x1f333;垃圾回收算法&#x1f338;标记-清除算法&#x1f338;复制算法&#x1f338;标记-整理算法&#x1f338;分代算法&#x1f338;哪些对象会进入新生代&#xff1f…

idea2023.2.1 java项目-web项目创建-servlet类得创建

如何创建Java项目 1.1 方式1&#xff1a; 1.2 方式&#xff1a; 1.3 方式 如何创建web项目 方式 ----- 推荐 如何创建servlet类 复制6 中得代码 给servlet 配置一个路径 启动tomcat 成功了

Netty进阶

三. Netty 进阶 1. 粘包与半包 1.1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log LoggerFactory.getLogger(HelloWorldServer.class);void start() {NioEventLoopGroup boss new NioEventLoopGroup(1);NioEventLoopGroup worker new Ni…

时序预测 | Python实现VMD-CNN-LSTM时间序列预测

时序预测 | Python实现VMD-CNN-LSTM时间序列预测 目录 时序预测 | Python实现VMD-CNN-LSTM时间序列预测预测效果基本介绍模型描述代码设计预测效果 基本介绍 VMD-CNN-LSTM 是一种混合深度学习模型,结合了变分模态分解(VMD)、卷积神经网络(CNN)和长短期记忆网络(LSTM)的…

C#,简单,精巧,实用的按类型删除指定文件的工具软件

点击下载本文软件&#xff08;积分&#xff09;&#xff1a; https://download.csdn.net/download/beijinghorn/89059141https://download.csdn.net/download/beijinghorn/89059141 下载审核通过之前&#xff0c;请从百度网盘下载&#xff08;无积分&#xff09;&#xff1a;…

7 X 24h智能安全运维再升级!Fortinet 全面集成全新 FortiGuard SOCaaS

数字化时代网络安全威胁层出不穷&#xff0c;网络犯罪分子的狡诈攻击手段不断翻新&#xff0c;传统安全防御手段亟需进化。更为棘手的是&#xff0c;网络安全专业人才的匮乏&#xff0c;让众多企业陷入安全运营的困境。为了有效应对这一挑战&#xff0c;Fortinet全新推出FortiG…

i++的理解

package com.example.elasticsearch;public class Test1 {public static void main(String[] args) {int i 10;i i;System.out.println(i);} }以上代码输出为10&#xff0c;为何&#xff1f; 这个问题涉及到Java中的后缀递增运算符&#xff08;i&#xff09;的工作原理。当你…

【Python如何使用requests+re库进行简单爬虫实例应用】

1、安装requests库 (1)直接winR输入cmd进入命令行界面&#xff0c;执行命令&#xff1a;pip install requests (2)再Pycharm中&#xff0c;’File’-’Settings’-’Python interpreter’-’’-搜索’requests’-’install package’下载&#xff0c;如下图所示 2、实例&…

UE4几个常用节点链接

UE4几个常用节点链接 2017-12-02 12:54 1. 流光材质(及uv平铺次数) 2. 跑九宫格 3.闪光3。1 粒子闪烁效果 4.图案重复5.平移扭曲 6.溶解 刀光的uv滚动图片源或采样节点属性里改成clamp无后期发光光晕anistropic 各向异性高光法线图 法线图叠加 blendangle orrectedNo…

3083. 字符串及其反转中是否存在同一子字符串

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个字符串 s &#xff0c;请你判断字符串 s 是否存在一个长度为 2 的子字符串&#xf…

springboot Guacamole

SpringBoot集成 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/PO…

something

表示媒体&#xff1a; 为了加工、处理和传输感觉媒体而人为研究、构造出来的一种媒体。有各种编码方式&#xff0c;文本编码、图像编码、声音编码 表现媒体&#xff1a; 进行信息输入和输出的媒体。键盘、鼠标、扫描仪、扬声器、打印机。 感觉媒体&#xff1a; 直接作用于人的感…

您的计算机已被faust勒索病毒感染?恢复您的数据的方法在这里!

导言&#xff1a; 随着信息技术的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒更是成为了一个不容忽视的威胁。近期&#xff0c;一种名为.faust的新型勒索病毒引起了广泛关注。该病毒以其独特的传播方式和恶劣的加密手段&#xff0c;给广大用户带来了极…

ChatGPT 之百万富翁

原文&#xff1a;The ChatGPT Millionaire 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 介绍 当我写下这些文字时&#xff0c;ChatGPT 已经成为有史以来增长最快的技术平台 - 仅用 5 天就达到了一百万用户。相比之下&#xff0c;Netflix 用了 3 年&#xff0c;Twit…

云计算与容器化

云计算和容器化是目前Java开发中的热门话题&#xff0c;它们提供了更高效、灵活和可扩展的方式来构建和部署应用程序。 云计算是指通过互联网提供计算资源和服务&#xff0c;包括计算能力、存储、数据库、网络等。在云计算平台上进行Java应用开发有很多好处。首先&#xff0c;…

【python】python新闻内容zhua取分析词云可视化(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

echarts实现炫酷科技感的流光效果

前言&#xff1a; echarts实现炫酷科技感的流光效果 效果图&#xff1a; 实现步骤&#xff1a; 1、引入echarts,直接安装或者cdn引入 npm i echarts https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js 2、封装 option方法&#xff0c;第一个数据是折线数据&a…

C# 有一条垂直线,怎么判断一点坐标点是在左侧还是右侧,以及该坐标与垂直线的交点?

在C#中&#xff0c;要判断一个点相对于垂直线的位置&#xff08;左侧还是右侧&#xff09;&#xff0c;以及计算该点与垂直线的交点&#xff0c;你需要先定义垂直线的位置和属性。垂直线通常可以用它的一个点&#xff08;比如线段的起点或终点&#xff09;和它的方向&#xff0…