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 能够被正确识别,避免类型错误。
相关推荐
记得开心一点嘛36 分钟前
Trellora:基于 Electron、React 和本地知识库的 AI 知识工作台
人工智能·react.js·electron
liangshanbo121540 分钟前
面试题:前端工程化中 Tree Shaking的原理是什么?
前端·treeshaking
500841 小时前
React Native for OpenHarmony 实战:三方库 react-native-url-polyfill 的鸿蒙化适配指南
javascript·react native·react.js·性能优化·electron·harmonyos
补码缩写1 小时前
视频跳转触发了seeked,画面就到位了吗
前端
库拉镜像AI牛牛1 小时前
漫剧工作室量产方案:依托知漫剧 AI 短剧降本增效
大数据·服务器·前端·人工智能·语音识别
不可能片场2 小时前
内容运营自动化 用相似度拦住撞车选题
前端·electron
静默回滚2 小时前
视频进度条跳回去,先别改事件监听
前端
米多科技2 小时前
让 AI 走进我的 3D 世界:一个 MCP server 的完整实现
javascript
Lank_M2 小时前
MP4和WebM导出后为何起播与拖动不同
前端
用户5508492902562 小时前
前端本地存储怎么选:Cookie、localStorage、sessionStorage、IndexedDB 的取舍
前端