React文档(十)表单

HTML元素和 React里的其他DOM元素有些不同,因为它们会保留一些内部的状态。举个例子,这个普通的表单接受一个name值:

<form>
  <label>
    Name:
    <input type="text" name="name" />
  </label>
  <input type="submit" value="Submit" />
</form>

这个表单具有默认的表单行为,当用户提交表单就会跳转到新页面。如果你想要在React里实现此行为,它自然而然就会实现。但是在大多数情况下,定义一个控制表单提交并且有能力控制用户输入的表单数据的js函数会更方便。实现这个的标准方法是一种叫“控制组件”的技术。

控制组件

在HTML里,<input>,<textarea>和<select>这类元素通常包含它们自己的状态并且会基于用户输入而更新状态。在React中,易变的状态通常会保存在组件的state属性里,并且只能使用setState()来更新。

我们可以联合两种状态通过设置React state为“单一数据源”。然后React组件会渲染表单也会控制随后用户的输入。这样子的表单元素输入的值被React控制的方法叫做“控制组件”。

举个例子,如果我们想要让上一个例子当提交的时候记录name值,我们可以把表单写成一个控制组件:

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ‘‘};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  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>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

在CodePen里试一试

只要value属性被设置在表单元素上,被显示的value值就永远会是this.state.value,使得React的state是单一数据源。当每次修改表单值的时候handleChange就会更新React的state,只要输入改变显示的值就会更新。

通过控制组件,每一个state的变化都会有一个联合的处理函数。这让它可以明确的修改或者确认用户输入。举个例子,如果我们想要强制name值都用大写字母来写,那么我们应该像这样写handleChange函数:

handleChange(event) {
  this.setState({value: event.target.value.toUpperCase()});
}
时间: 2024-10-11 19:37:20

React文档(十)表单的相关文章

React文档(一)安装

React是一个灵活的可以用于各种不同项目的框架,你可以用它来写新应用,你也可以逐步将它引进已有的代码库而不用重写整个项目. 试用React 如果你想玩一玩React,那么就去CodePen上试一试.尝试一下Hello World的React例子.不需要安装任何东西,只是修改代码然后查看结果. 如果你更喜欢在本地编辑,那么你也可以下载此文件,修改它,然后在本地用浏览器打开.但是它会做一个很慢的运行时代码转换,所以不要像这样在产品中使用. 创建一个单页应用 创建React应用这个项目是一个最好的方

react文档demo实现输入展示搜索结果列表

文档页面地址:https://doc.react-china.org/docs/thinking-in-react.html 该文档只给了具体实现思路,下面是我实现的代码. 初学react,如果有写的不规范的地方,望大家多多指正! FilterableProductTable (橙色): 包含了整个例子 SearchBar (蓝色): 接受所有的用户输入 ProductTable (绿色): 根据用户输入过滤并展示数据集合 ProductCategoryRow (绿松石色): 展示每个分类的标题

React文档(十四)深入JSX

根本上,JSX只是为React.createElement(component, props, ...children)函数提供语法糖.JSX代码是这样的: <MyButton color="blue" shadowSize={2}> Click Me </MyButton> 编译成这样: React.createElement( MyButton, {color: 'blue', shadowSize: 2}, 'Click Me' ) 你也可以使用自己闭合的

React文档(二十二)context

React中,通过React组件可以很容易地追踪数据流.当你关注一个组件,你可以发现哪一个props被传递了,这样使得你的应用很容被推断. 在一些情况下,你想要传递数据通过组件树而不需要去手动在每一层传递.你可以直接使用强大的context API. 为什么不使用context 大量的应用不需要使用context. 如果你希望你的应用稳定,不要使用context.这是一个实验性的API在未来的版本中有可能会崩溃. 如果你不熟悉state管理库就类似于Redux或者Mobx,不要使用context

React文档(二十)不使用JSX

JSX并不是使用React的一个强制需求.当你不需要在你的构造环境里设置编译那么不使用JSX会很方便. 每一个JSX元素只是调用React.createElement(componnet, props, ...children)的语法糖.因此,JSX能做的事原生js同样也做得到. 举个例子,下面的代码用JSX: class Hello extends React.Component { render() { return <div>Hello {this.props.toWhat}</d

React文档(三)介绍JSX

我们先看看这个变量声明: const element = <h1>Hello, world!</h1>; 这个有趣的标签语法既不是字符串也不是HTML. 这种写法叫做JSX,这是一种对js语法的扩展.我们建议使用这种语法和React配合去描述UI本来应该的样子.JSX也许会让你想到模板语言,但是它拥有js的强大支持是与生俱来的. JSX生产React"元素".我们会在下一章讲解将这些React元素渲染到DOM中.下面,你可以来看看JSX的基础知识来起步. 在JS

React文档(十一)提升state

经常有些组件需要映射同一个改变的数据.我们建议将分享的state提升至最近的同一个祖先元素.我们来看看这是怎样运作的. 在这一节中,我们会创建一个温度计算器来计算提供的水温是否足够沸腾. 我们先创建一个叫BoilingVerdict的组件.它接受摄氏度温度为prop,并且打印水温是否足够沸腾: function BoilingVerdict(props) { if (props.celsius >= 100) { return <p>The water would boil.</p

Onsen UI for React文档

注:采用ES6+JSX语法 1.开始一个项目 在React中使用Onsen UI 需要首先安装onsenui和react-onsenui模块. 可以使用monaca CLI工具包快速初始化一个应用: $ npm install -g monaca # Install Monaca CLI - Onsen UI toolkit $ monaca create helloworld # Choose React template $ cd helloworld; monaca preview # R

表单标签

表单标签:用于提交数据给服务器. 表单标签的跟标签是<form>标签. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <h