iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >React源码中怎么实现受控组件
  • 135
分享到

React源码中怎么实现受控组件

2024-04-02 19:04:59 135人浏览 泡泡鱼
摘要

本篇内容主要讲解“React源码中怎么实现受控组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React源码中怎么实现受控组件”吧!在React中一个简单的受

本篇内容主要讲解“React源码中怎么实现受控组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React源码中怎么实现受控组件”吧!

在React中一个简单的受控组件如下:

function App() {   const [num, updateNum] = React.useState(0);      const onChange = ({target: {value}}) => {     updateNum(value);   }    return (     <input value={num} onChange={onChange}/>   ) }

在onChange中会更新num,num作为value prop传递给<input/>,达到value受控的目的。

如果让你来设计,你会怎么做?

我相信大部分同学第一个想法是:将value prop与其他attribute prop一样处理就行。

我们知道React内部运行有3个阶段:

  • schedule 调度更新阶段

  • render 进行diff算法的阶段

  • commit 进行DOM操作的阶段

假设我们要在onChange中触发更新改变className,只需要在render阶段记录要改变的className,在commit阶段执行对应的addClass DOM操作。

同样的,如果我们要在onChange中触发更新改变value,只需要在render阶段记录要改变的value,在commit阶段执行对应的inputDOM.setAttribute('value', value)操作。

这样逻辑非常通顺。那么事实上呢?

直接改变value的问题
className只是inputDOM上的一个普通属性。而value则涉及到输入框光标的位置。

如果我们直接修改value,那么属性改变后input的光标输入位置也会丢失,光标会跳到输入框的最后。

想想我们将1234修改为12534。

1234 --> 12534

需要先将光标位置移动到2之后,再输入5。

如果setAttribute('value', '12534'),那么光标不会保持在5后面而是跳到4后面。

那么React如何解决这个问题呢?

用非受控的形式实现受控组件

你没有看错,React用非受控形式实现了受控组件的逻辑。

简单的说,不同于className在commit阶段受控更新,value则完全是非受控的形式,只在必要的时候受控更新。

因为一旦更新value,那么光标位置就会丢失。

我们稍微修改下Demo,input为受控组件,value始终为1:

function App() {   const num = 1;    return (     <input value={num}/>   ) }

当我们在源码中打上断点,输入2后,实际上会先显示12,再删掉2。

只不过这个删除的过程是同步的所以看起来输入框内始终只有1。

React源码中怎么实现受控组件

所以,不同于React其他组件props的更新会经历schedule - render - commit流程。

对于input、textarea、select,React有一条单独的更新路径,这条路径触发的更新被称为discreteUpdate。

这条路径的工作流程如下:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 先以非受控的形式更新表单DOM

  3. 以同步的优先级开启一次更新

  4. 更新后的value在commit阶段并不会像其他props一样作用于DOM

  5. 调用restoreStateOfTarget方法,比较DOM的实际value(即步骤1中的非受控value)与步骤3中更新的value,如果相同则退出,如果不同则用步骤3的value更新DOM

什么情况下这2个value会相同呢?

我们正常的受控组件就是相同的情况:

function App() {   const [num, updateNum] = React.useState(0);      const onChange = ({target: {value}}) => {     updateNum(value);   }    return (     <input value={num} onChange={onChange}/>   ) }

什么情况下这2个value会不同呢?

上面的Demo中,虽然受控,但是没有调用updateNum更新value的情况:

function App() {   const num = 1;    return (     <input value={num}/>   ) }

在这种情况下,步骤1的非受控value变为了12,步骤3的受控value还是1,所以最终会用1再更新下DOM的value。

到此,相信大家对“React源码中怎么实现受控组件”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: React源码中怎么实现受控组件

本文链接: https://www.lsjlt.com/news/84450.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React源码中怎么实现受控组件
    本篇内容主要讲解“React源码中怎么实现受控组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React源码中怎么实现受控组件”吧!在React中一个简单的受...
    99+
    2024-04-02
  • React中怎么实现受控组件与非受控组件
    本篇文章给大家分享的是有关React中怎么实现受控组件与非受控组件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。受控组件与非受控组件是Reac...
    99+
    2024-04-02
  • 浅析React中的受控组件和非受控组件
    目录非受控组件 受控组件 注意 结论 非受控组件 表单数据由DOM本身处理。即不受setState()的控制,与传统的HTML表单输入相似,input输入值即显示最新值(使用 re...
    99+
    2024-04-02
  • React受控组件与非受控组件实例分析讲解
    目录一、受控组件二、非受控组件三、总结一、受控组件 在HTML中,表单元素的标签、、等的值改变通常是根据用户输入进行更新。 在React中,可变状态通常保存在组件的状态属性中,并且只...
    99+
    2023-01-18
    React受控组件与非受控组件 React受控组件 React非受控组件
  • react中受控组件指的是什么
    本文小编为大家详细介绍“react中受控组件指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“react中受控组件指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • react受控组件指的是什么
    这篇文章主要介绍“react受控组件指的是什么”,在日常操作中,相信很多人在react受控组件指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react受控组件指的是...
    99+
    2024-04-02
  • react非受控组件指的是什么
    这篇文章主要介绍“react非受控组件指的是什么”,在日常操作中,相信很多人在react非受控组件指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react非受控组件...
    99+
    2024-04-02
  • React 组件权限控制的实现
    目录前话正文1. 控制方式1.1 直接计算1.2 通用权限Hoc1.3 权限包裹组件2. 控制结果2.1 显隐控制2.2 自定义渲染3. 权限数据3.1 静态权限3.2 动态权限前话...
    99+
    2024-04-02
  • React中受控组件与数据共享的示例分析
    这篇文章主要介绍React中受控组件与数据共享的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:在HTML当中,像<input>,<textarea...
    99+
    2024-04-02
  • C#中怎么实现控件数组
    在C#中,可以使用控件数组来实现一组相关的控件的管理和操作。下面是实现控件数组的一种常见方法: 声明一个控件数组变量: Cont...
    99+
    2023-10-25
    C#
  • React中怎么实现组件内部通信
    React中怎么实现组件内部通信,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。2. 组件内部数据传递React 组件内部通信主要分为两部分...
    99+
    2024-04-02
  • React中怎么实现父子组件传递
    React中怎么实现父子组件传递,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。React的组件生命周期react主要思想是构建可复用组件来构建...
    99+
    2024-04-02
  • React中怎么实现Portal可复用组件
    这篇文章给大家介绍React中怎么实现Portal可复用组件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、通常你的网站只有一个root<body>  <...
    99+
    2024-04-02
  • React中怎么实现组件逻辑复用
    React中怎么实现组件逻辑复用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. MixinsMixins 事实上是 Rea...
    99+
    2024-04-02
  • React 组件间怎么实现通信
    本篇文章给大家分享的是有关React 组件间怎么实现通信,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。父子组件通讯通讯手段这是最常见的通信方式...
    99+
    2024-04-02
  • React实现合成事件的源码分析
    目录事件绑定事件触发结尾今天尝试学习 React 事件的源码实现。 React 版本为 18.2.0 React 中的事件,是对原生事件的封装,叫做合成事件。抽象出一层合成事件,是为...
    99+
    2022-12-08
    React实现合成事件 React合成事件
  • React-View-UI组件库封装Loading加载中源码
    目录组件介绍Loading API能力组件源码组件测试源码组件库线上地址组件介绍 Loading组件是日常开发用的很多的组件,这次封装主要包含两种状态的Loading,旋转、省略号,...
    99+
    2024-04-02
  • react实现Radio组件的示例代码
    本文旨在用最清楚的结构去实现一些组件的基本功能。希望和大家一起学习,共同进步 效果展示: 测试组件: class Test extends Component { cons...
    99+
    2024-04-02
  • VB.NET中怎么实现一个控件数组
    本篇文章为大家展示了VB.NET中怎么实现一个控件数组,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Public Class CheckBoxArrClass Chec...
    99+
    2023-06-17
  • Vue和React组件怎么实现传值
    本篇文章为大家展示了Vue和React组件怎么实现传值,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。组件间的传值方式组件的传值场景无外乎以下几种:父子之间兄弟之间多...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作