React 表单与事件

简介: 10月更文挑战第10天

本章节我们将讨论如何在 React 中使用表单。

HTML 表单元素与 React 中的其他 DOM 元素有所不同,因为表单元素生来就保留一些内部状态。

在 HTML 当中,像 <input>, <textarea>, 和 <select> 这类表单元素会维持自身状态,并根据用户输入进行更新。但在React中,可变的状态通常保存在组件的状态属性中,并且只能用 setState() 方法进行更新。

一个简单的实例

在实例中我们设置了输入框 input 值 value = {this.state.data}。在输入框值发生变化时我们可以更新 state。我们可以使用 onChange 事件来监听 input 的变化,并修改 state。

React 实例

class HelloMessage extends React.Component {  constructor(props) {      super(props);       this.state = {value: 'Hello Runoob!'};       this.handleChange = this.handleChange.bind(this);   }    handleChange(event) {    this.setState({value: event.target.value});   }  render() {    var value = this.state.value;     return <div>             <input type="text" value={value} onChange={this.handleChange} />              <h4>{value}</h4>            </div>;   }}const root = ReactDOM.createRoot(document.getElementById("root"));root.render(  <HelloMessage />);


尝试一下 »

上面的代码将渲染出一个值为 Hello Runoob! 的 input 元素,并通过 onChange 事件响应更新用户输入的值。

实例 2

在以下实例中我们将为大家演示如何在子组件上使用表单。 onChange 方法将触发 state 的更新并将更新的值传递到子组件的输入框的 value 上来重新渲染界面。

你需要在父组件通过创建事件句柄 (handleChange) ,并作为 prop (updateStateProp) 传递到你的子组件上。

React 实例

class Content extends React.Component {  render() {    return (      <div>         <input type="text" value={this.props.myDataProp} onChange={this.props.updateStateProp} />         <h4>{this.props.myDataProp}</h4>       </div>     );   }} class HelloMessage extends React.Component {  constructor(props) {    super(props);     this.state = { value: 'Hello Runoob!' };     this.handleChange = this.handleChange.bind(this);   }    handleChange(event) {    this.setState({ value: event.target.value });   }    render() {    var value = this.state.value;     return (      <div>         <Content myDataProp={value} updateStateProp={this.handleChange} />       </div>     );   }} const root = ReactDOM.createRoot(document.getElementById('root'));root.render(<HelloMessage />);


尝试一下 »

Select 下拉菜单

在 React 中,不使用 selected 属性,而在根 select 标签上用 value 属性来表示选中项。

React 实例

class FlavorForm extends React.Component {  constructor(props) {    super(props);     this.state = {value: 'coconut'};       this.handleChange = this.handleChange.bind(this);     this.handleSubmit = this.handleSubmit.bind(this);   }    handleChange(event) {    this.setState({value: event.target.value});   }    handleSubmit(event) {    alert('Your favorite flavor is: ' + this.state.value);     event.preventDefault();   }    render() {    return (      <form onSubmit={this.handleSubmit}>         <label>           选择您最喜欢的网站           <select value={this.state.value} onChange={this.handleChange}>             <option value="gg">Google</option>             <option value="rn">Runoob</option>             <option value="tb">Taobao</option>             <option value="fb">Facebook</option>           </select>         </label>         <input type="submit" value="提交" />       </form>     );   }} const root = ReactDOM.createRoot(document.getElementById("root"));root.render(  <FlavorForm />);


尝试一下 »

多个表单

当你有处理多个 input 元素时,你可以通过给每个元素添加一个 name 属性,来让处理函数根据 event.target.name 的值来选择做什么。

React 实例

class Reservation extends React.Component {  constructor(props) {    super(props);     this.state = {      isGoing: true,       numberOfGuests: 2    };       this.handleInputChange = this.handleInputChange.bind(this);   }    handleInputChange(event) {    const target = event.target;     const value = target.type === 'checkbox' ? target.checked : target.value;     const name = target.name;       this.setState({      [name]: value    });   }    render() {    return (      <form>         <label>           是否离开:           <input            name="isGoing"            type="checkbox"            checked={this.state.isGoing}            onChange={this.handleInputChange} />         </label>         <br />         <label>           访客数:           <input            name="numberOfGuests"            type="number"            value={this.state.numberOfGuests}            onChange={this.handleInputChange} />         </label>       </form>     );   }}


尝试一下 »


React 事件

以下实例演示通过 onClick 事件来修改数据:

React 实例

class HelloMessage extends React.Component {  constructor(props) {      super(props);       this.state = {value: 'Hello Runoob!'};       this.handleChange = this.handleChange.bind(this);   }     handleChange(event) {    this.setState({value: '菜鸟教程'})  }  render() {    var value = this.state.value;     return <div>             <button onClick={this.handleChange}>点我</button>             <h4>{value}</h4>            </div>;   }}const root = ReactDOM.createRoot(document.getElementById("root"));root.render(  <HelloMessage />);


尝试一下 »

当你需要从子组件中更新父组件的 state 时,你需要在父组件通过创建事件句柄 (handleChange) ,并作为 prop (updateStateProp) 传递到你的子组件上。实例如下:

React 实例

class Content extends React.Component {  render() {    return  <div>               <button onClick = {this.props.updateStateProp}>点我</button>               <h4>{this.props.myDataProp}</h4>            </div>   }}class HelloMessage extends React.Component {  constructor(props) {      super(props);       this.state = {value: 'Hello Runoob!'};       this.handleChange = this.handleChange.bind(this);   }  handleChange(event) {    this.setState({value: '菜鸟教程'})  }  render() {    var value = this.state.value;     return <div>             <Content myDataProp = {value}                updateStateProp = {this.handleChange}></Content>            </div>;   }}const root = ReactDOM.createRoot(document.getElementById("root"));root.render(  <HelloMessage />);


尝试一下 »

目录
相关文章
|
2天前
|
前端开发 JavaScript 数据安全/隐私保护
深入探索研究React表单
【10月更文挑战第6天】
81 57
|
4天前
|
前端开发 JavaScript IDE
React 事件处理
10月更文挑战第8天
10 1
|
5天前
|
前端开发 JavaScript
一文详解React事件中this指向,面试必备
一文详解React事件中this指向,面试必备
18 0
|
1月前
|
前端开发 JavaScript
react学习(19)事件处理
react学习(19)事件处理
|
11天前
|
移动开发 JSON 数据可视化
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
精选八款包括可视化CMS,jquery可视化表单,vue可视化拖拉,react可视化源码
30 0
|
1月前
|
前端开发 JavaScript
React的事件与原生事件的执行顺序?
React的事件与原生事件的执行顺序?
|
2月前
|
前端开发 JavaScript Java
React 中的合成事件
【8月更文挑战第30天】
35 6
|
1月前
|
人工智能 前端开发 JavaScript
react js 处理表单( form )的2个例子
react js 处理表单( form )的2个例子
|
2月前
|
容器 Kubernetes Docker
云原生JSF:在Kubernetes的星辰大海中,让JSF应用乘风破浪!
【8月更文挑战第31天】在本指南中,您将学会如何在Kubernetes上部署JavaServer Faces (JSF)应用,享受容器化带来的灵活性与可扩展性。文章详细介绍了从构建Docker镜像到配置Kubernetes部署全流程,涵盖Dockerfile编写、Kubernetes资源配置及应用验证。通过这些步骤,您的JSF应用将充分利用Kubernetes的优势,实现自动化管理和高效运行,开启Java Web开发的新篇章。
48 0
|
2月前
|
前端开发 JavaScript API
掌握React表单管理的高级技巧:探索Hooks和Context API如何协同工作以简化状态管理与组件通信
【8月更文挑战第31天】在React中管理复杂的表单状态曾是一大挑战,传统上我们可能会依赖如Redux等状态管理库。然而,React Hooks和Context API的引入提供了一种更简洁高效的解决方案。本文将详细介绍如何利用Hooks和Context API来优化React应用中的表单状态管理,通过自定义Hook `useForm` 和 `FormContext` 实现状态的轻松共享与更新,使代码更清晰且易于维护,为开发者带来更高效的开发体验。
40 0