Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端基础

  • 应用框架

    • UI 框架

      • Angular

      • React

        • React Hooks 实现原理
        • React 组件销毁需要注意的异步更新问题
        • React项目结构规范
        • React Fiber 实现原理
        • React Fiber 本质
        • React「 Refs 转发 」初探
        • React之低版本chrome setState loading2次状态出现的bug
        • react学习
        • 使用 immer 修改复杂对象
        • input 原生控件,React 是如何实现受控输入的?
          • 先讲如何实现「输入字符但是控件没变化」这个效果
          • 再谈 UI 框架的 input 受控逻辑
          • 区分跨端框架的双线程模型
        • useEffect 如何处理 async
        • 用组件替换文本中emoji字符
        • 谈谈 React 组件设计原则
      • Solid

      • Svelte

      • Vue

      • 框架本质

    • 开发框架

    • 组件库

  • 工程能力

  • 应用基础

  • 专业领域

  • 业务场景

  • 大前端
  • 应用框架
  • UI 框架
  • React
gahing
2023-08-18
目录

input 原生控件,React 是如何实现受控输入的?笔记

# 先讲如何实现「输入字符但是控件没变化」这个效果

对 HTML 文档中的输入控件(如 input/textarea)执行输入操作时,会触发 input/change 事件(浏览器原生事件)。

倘若在这个事件处理中,移除掉 input 原生控件刚才输入的字符,并且由于页面渲染是在事件循环的尾部阶段,这就会出现:对控件输入了内容,但是页面渲染没出现。

本质上是因为「输入内容、事件触发、控制值修改、浏览器渲染」这个出现在一帧渲染当中。

# 再谈 UI 框架的 input 受控逻辑

根据上面的原理,再看 UI 框架,用户对 input 控件执行输入。

如果是受控,需要给 input 控件赋值 value 。在收到输入事件后,程序需要把收到的值赋给 value ,当然也可以对值做调整。赋值的过程是对虚拟 DOM 做处理,在虚拟 dom 比对完后,发现差异,并对真实的 input 控件赋值。

如果是非受控,不对 input 控件赋值,页面上 input 内容的渲染则与 UI 框架无关。

# 区分跨端框架的双线程模型

另外需要注意的是,很多跨端框架采用的双线程模型,比如 Lynx、小程序,无法实现真正的受控。

原因是渲染和业务逻辑分属不同线程,如果对输入控件输入内容,会立即对 UI 做出反应。

如果受控会调整输入值,那么新的输入值可能会延后一帧显示,进而导致输入闪屏效果。

编辑 (opens new window)
上次更新: 2024/09/01, 23:56:56
使用 immer 修改复杂对象
useEffect 如何处理 async

← 使用 immer 修改复杂对象 useEffect 如何处理 async→

最近更新
01
浅谈代码质量与量化指标
08-27
02
快速理解 JS 装饰器
08-26
03
Vue 项目中的 data-v-xxx 是怎么生成的
09-19
更多文章>
Theme by Vdoing | Copyright © 2016-2024 Gahing | 闽ICP备19024221号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式