React中的受控组件示例

javascript 复制代码
/**
 * Edit 组件
 * 一个简单的受控输入框组件,用于演示 useState 和事件处理
 */

// 1. 导入 React 核心功能和类型定义
import React, { useState, type FC } from "react";

/**
 * 定义 Edit 组件
 * 使用泛型 FC (FunctionComponent) 来明确这是一个函数组件
 */
const Edit: FC = () => {
  // 2. 状态定义 (State Declaration)
  // 创建一个名为 text 的状态变量,初始值为空字符串
  // setText 是用于更新该状态的函数
  // 使用泛型 <string> 明确 state 的类型为字符串
  const [text, setText] = useState<string>('');

  /**
   * 3. 事件处理函数 (Event Handler)
   * 处理输入框的 onChange 事件
   * 
   * @param event - React 的 ChangeEvent 对象,泛型指定了目标元素类型为 HTMLInputElement
   */
  function handleChange(event: React.ChangeEvent<HTMLInputElement>) {
    // 从事件对象中提取输入框的最新值
    const newValue = event.target.value;
    
    // 更新 React 状态
    // 这会触发组件的重新渲染,使视图与状态保持同步
    setText(newValue);

    // 控制台调试输出,用于开发时查看实时值
    console.log('输入框的值:', newValue);
  }

  // 4. JSX 渲染 (Render)
  // 返回组件的 UI 结构
  return (
    <div>
      <h1>Edit</h1>
      
      {/* 
        输入框 (Input Field)
        - value 属性绑定到 state 变量 `text`,使其成为"受控组件"
        - onChange 监听输入变化,触发 handleChange 函数
      */}
      <input 
        type="text" 
        onChange={handleChange} 
        value={text} 
      />
      
      {/* 显示当前状态的值 */}
      <p>输入的值是: {text}</p>
    </div>
  );
}

export default Edit;

📝 代码逻辑简述

  1. 受控组件模式 :这个输入框是一个受控组件 。这意味着输入框显示的值完全由 React 的状态 (text) 控制,而不是由 DOM 自己维护。用户每一次按键,都会触发 onChange,进而通过 setText 更新状态,状态更新后组件重新渲染,输入框显示新值。
  2. 双向绑定value={text} (读取) 和 onChange={handleChange} (写入) 共同实现了数据的双向绑定。
  3. 类型安全 :使用 React.ChangeEvent<HTMLInputElement> 确保了在 TypeScript 下,event.target.value 能够被正确识别,避免类型错误。
相关推荐
山楂树の1 小时前
图像标注大坑:img图片 + Canvas 叠加标注,同步放大后标注位置偏移、对不齐?详解修复方案及亚像素处理原理
前端·css·学习·canva可画
本山德彪1 小时前
我做了一个拼豆图纸生成器,把照片秒变图纸
前端
DTrader1 小时前
用TS无法实盘量化? - 实盘均线策略
前端·api
进击的夸父1 小时前
vfojs:Vue 超集架构,外壳React灵魂Vue
前端
编程老船长1 小时前
解决不同项目需要不同 Node.js 版本的问题
前端·vue.js
Wect1 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·算法·typescript
漫游的渔夫1 小时前
前端开发者做 Agent:别写成一次请求,用 5 步受控循环防止 AI 乱跑
前端·人工智能·typescript
薛定猫AI3 小时前
【深度解析】Gemma Chat 本地 AI 编程 Agent:Electron + MLX + 开源模型的离线 Vibe Coding 实战
javascript·人工智能·electron
kyriewen3 小时前
Webpack vs Vite:一个是“老黄牛”,一个是“猎豹”,你选谁?
前端·webpack·vite
打小就很皮...3 小时前
html2canvas + jsPDF 生成 PDF 的踩坑与解决方案总结
前端·pdf