从0开始学前端 第五十课:React表单与用户输入

第五十课:React表单与用户输入

学习目标

在本课程结束后,你应该能够:

  1. 理解React中表单处理的基本概念。
  2. 了解什么是受控组件以及如何使用它们来管理表单数据。
  3. 理解非受控组件以及与受控组件的区别。
学习内容
1. 表单处理基础
  • 概念: 表单元素通常会维护自己的状态,并根据用户输入进行更新。在React中,可变状态通常保存在组件的状态属性中,并且只能通过使用setState()来更新。
  • 代码示例:
    class SimpleForm extends React.Component {
      state = { value: '' };
    
      handleChange = (event) => {
        this.setState({ value: event.target.value });
      };
    
      handleSubmit = (event) => {
        alert('A name was submitted: ' + this.state.value);
        event.preventDefault();
      };
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Name:
              <input type="text" value={this.state.value} onChange={this.handleChange} />
            </label>
            <button type="submit">Submit</button>
          </form>
        );
      }
    }
    
    • 预计输出: 渲染一个带有文本输入的表单,当提交表单时,弹出包含用户输入内容的警告框。
2. 受控组件
  • 概念: 受控组件不维护自己的内部状态;它们接收其值作为props,并且通知变化通过回调(如onChange)。
  • 代码示例:
    class ControlledForm extends React.Component {
      state = { value: '' };
    
      handleChange = (event) => {
        this.setState({ value: event.target.value.toUpperCase() });
      };
    
      render() {
        return (
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        );
      }
    }
    
    • 预计输出: 渲染一个输入框,输入时字符被转为大写。
3. 非受控组件
  • 概念: 非受控组件是一个典型的HTML表单输入,内部状态由DOM本身处理。
  • 代码示例:
    class UncontrolledForm extends React.Component {
      inputRef = React.createRef();
    
      handleSubmit = (event) => {
        alert('A name was submitted: ' + this.inputRef.current.value);
        event.preventDefault();
      };
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Name:
              <input type="text" ref={this.inputRef} />
            </label>
            <button type="submit">Submit</button>
          </form>
        );
      }
    }
    
    • 预计输出: 渲染一个表单,其中的输入框不通过state来管理,而是使用ref来获取当前输入值。
课后练习
  1. 创建一个LoginForm组件,包括用于接受用户名和密码的受控输入。
  2. 添加一个复选框,表示“记住我”的登录状态,并将其值存储在组件状态中。
  3. 创建一个SurveyForm组件,包含一系列选项作为非受控组件,并在提交时显示选中的值。
练习解析
  1. 登录表单组件:

    class LoginForm extends React.Component {
      state = { username: '', password: '' };
    
      handleChange = (event) => {
        const { name, value } = event.target;
        this.setState({ [name]: value });
      };
    
      handleSubmit = (event) => {
        event.preventDefault();
        // 通常是将数据发送到服务器
        console.log(this.state);
      };
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Username:
              <input name="username" type="text" value={this.state.username} onChange={this.handleChange} />
            </label>
            <label>
              Password:
              <input name="password" type="password" value={this.state.password} onChange={this.handleChange} />
            </label>
            <button type="submit">Login</button>
          </form>
        );
      }
    }
    
    • 预计输出: 用户可以输入用户名和密码,点击登录按钮时,表单的数据会被打印到控制台。
  2. 记住我复选框:

    // 在LoginForm组件中
    handleCheckboxChange = (event) => {
      this.setState({ rememberMe: event.target.checked });
    };
    
    // 在render方法中添加
    <label>
      Remember me:
      <input name="rememberMe" type="checkbox" checked={this.state.rememberMe} onChange={this.handleCheckboxChange} />
    </label>
    
    • 预计输出: 增加了“记住我”的复选框,其选中状态会存储在组件的状态中。
  3. 调查表单组件:

    class SurveyForm extends React.Component {
      formRef = React.createRef();
    
      handleSubmit = (event) => {
        event.preventDefault();
        const formData = new FormData(this.formRef.current);
        for (let [key, value] of formData.entries()) {
          console.log(`${key}: ${value}`);
        }
      };
    
      render() {
        return (
          <form ref={this.formRef} onSubmit={this.handleSubmit}>
            <label>
              <input type="radio" name="surveyOption" value="option1" /> Option 1
            </label>
            <label>
              <input type="radio" name="surveyOption" value="option2" /> Option 2
            </label>
            <button type="submit">Submit</button>
          </form>
        );
      }
    }
    
    • 预计输出: 一个包含非受控单选按钮的表单,提交表单时,选中的值会被打印到控制台。

在进行课后练习时,你将实践使用React来处理用户输入和表单提交,同时理解受控与非受控组件的使用场景和原理。


章节目录
第五十一课:React组件复用与组合

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值