理解 react 中的受控组件和非受控组件

一、了解 dependencies 和 devDependencies

dependencies

生产依赖:项目开发完成后,打包时,dependencies 中的第三方源代码也就被打包进来。
dependencies是项目运行时所依赖的模块。这些模块是项目正常运行所必需的,也就是说,如果没有这些模块,项目将无法正常启动或运行。这些依赖会被安装在生产环境中,也会被安装在开发环境中。

devDependencies

开发依赖:只在开发过程中有意义,不被打包到最终的项目代码中。
devDependencies是开发过程中所依赖的模块,主要用于开发、测试、构建等开发相关的工作。这些模块在生产环境中是不需要的。这些依赖通常只在开发环境中使用,不会被安装在生产环境中。

在使用包管理工具时,可以通过不同的命令来安装这些依赖。例如,在 npm 中:

  • npm install <package-name>npm install <package-name> --save:会将包安装到dependencies
  • npm install <package-name> --save-dev:会将包安装到devDependencies

二、受控模式 vs 非受控模式

非受控模式

代码设置表单的初始值defaultValue,但是能修改value的只有用户,代码可通过文本输入框监听onChange或者ref读取value

  1. onChange事件监听
js 复制代码
function App() {
  function onChange(event) {
    console.log(event.target.value); // 读取用户输入
  }
  return (
    <input type="text" defaultValue={"hello"} onChange={onChange}></input>
  )
}

2. ref通过dom读取

  • useRef :用于创建一个可变的引用ref,该引用可以在组件的整个生命周期内保持不变。提供一个 .current 属性,用于访问或修改存储的值。
  • useEffect:在组件的首次渲染时执行,执行异步操作。
js 复制代码
import { useRef, useEffect } from 'react'
function App() {
  const inputRef = useRef(null)
  useEffect(() => {
    setTimeout(() => {
      console.log(inputRef.current.value);
    }, 2000)
  }, [])
  return (
    <input type="text" defaultValue={"hello"} ref={inputRef}></input>
  )
}

受控模式

用代码来控制value,用户输入触发onChange事件,更新React状态,进而更新输入框的值。通过onChange事件拿到用户输入,调用setValue触发视图的重新渲染。

核心思想流程:

  1. 声明一个react状态------useState
  2. 通过value属性绑定react状态
  3. 绑定onChange事件,通过事件参数拿到输入框最新的值,反向修改react状态。
js 复制代码
import { useState } from "react"

function App() {
    const [value, setValue] = useState('hello')

    function onChange(event){
        console.log(event.target.value);
        setValue(event.target.value.toUpperCase()) // 受代码控制
    }
    return(
        <input type="text" value={value} onChange={onChange}/>
    )
}

三、总结建议

  1. 优先使用受控组件:在大多数场景下,受控组件提供更可预测的状态管理和更好的交互体验。
  2. 谨慎使用非受控组件:仅在简单表单、文件上传或与第三方库集成时选择非受控模式。
  3. 混合使用:在复杂表单中,可以组合使用两种模式(如部分字段受控,部分非受控)。
  4. 性能优化 :对于受控组件,可使用useCallbackuseMemo减少不必要的渲染。
相关推荐
wuhen_n2 分钟前
KeepAlive:组件缓存实现深度解析
前端·javascript·vue.js
前端付豪4 分钟前
Nest 项目小实践之图书展示和搜索
前端·node.js·nestjs
wuhen_n5 分钟前
Vue Router与响应式系统的集成
前端·javascript·vue.js
青青家的小灰灰35 分钟前
金三银四面试官最想听的 React 答案:虚拟 DOM、Hooks 陷阱与大型列表优化
前端·react.js·面试
HelloReader36 分钟前
深入理解 Tauri 架构与应用体积优化实战指南
前端
lemon_yyds36 分钟前
vue 2 升级vue3 : ref 和 v-model 命名为同名
前端·vue.js
codingWhat37 分钟前
小程序里「嵌」H5:一套完整可落地的 WebView 集成方案
前端·uni-app·webview
重庆穿山甲41 分钟前
Java开发者的大模型入门:Spring AI Alibaba组件全攻略(二)
前端·后端
光影少年43 分钟前
在 React 中,什么情况下需要用 useCallback 和 useMemo?它们的区别是什么?
前端·react.js·掘金·金石计划
合天网安实验室44 分钟前
H2O-3反序列化漏洞分析(CVE-2025-6507&CVE-2025-6544)
前端·黑客