我们也了解到 React Component 事实上可以视为显示 UI 的一个状态机(state machine),而这个状态机根据不同的 state(透过 setState() 修改)和 props(由父元素传入),Component 会出现对应的显示结果。
本章将使用 React 官网首页上的范例(使用 ES6+)来更进一步说明 Props 和 State 特性及在 React 如何进行事件和表单处理。
props
 
使用 ES6 Class Component 写法:
class HelloMessage extends React.Component {
        // 若是需要绑定 this.方法或是需要在 constructor 使用 props,定义 state,就需要 constructor。若是在其他方法(如 render)使用 this.props 则不用一定要定义 constructor
        constructor(props) {
                // 对于 OOP 物件导向程式设计熟悉的读者应该对于 constructor 建构子的使用不陌生,事实上它是 ES6 的语法糖,骨子里还是 prototype based 物件导向程式语言。透过 extends 可以继承 React.Component 父类别。super 方法可以呼叫继承父类别的建构子
                super(props);
                this.state = {}
        }
        // render 是唯一必须的方法,但如果是单纯 render UI 建议使用 Functional Component 写法,效能较佳且较简洁
        render() {
                return (
                        <div>Hello {this.props.name}</div>
                )
        }
}

// PropTypes 验证,若传入的 props type 不是 string 将会显示错误HelloMessage.propTypes = {
  name: React.PropTypes.string,
}

// Prop 预设值,若对应 props 没传入值将会使用 default 值 ZuckHelloMessage.defaultProps = {
 name: 'Zuck',
}

ReactDOM.render(<HelloMessage name="Mark" />, document.getElementById('app'));

 
 
 

使用 Functional Component 写法:

// Functional Component 可以视为 f(d) => UI,根据传进去的 props 绘出对应的 UI。注意这边 props 是传入函式的参数,因此取用 props 不用加 thisconst HelloMessage = (props) => (
        <div>Hello {props.name}</div>
);

// PropTypes 验证,若传入的 props type 不是 string 将会显示错误HelloMessage.propTypes = {
  name: React.PropTypes.string,
}

// Prop 预设值,若对应 props 没传入值将会使用 default 值 Zuck。用法等于 ES5 的 getDefaultPropsHelloMessage.defaultProps = {
 name: 'Zuck',
}

ReactDOM.render(<HelloMessage name="Mark" />, document.getElementById('app'));
 

State

接下来我们将使用 A Stateful Component 这个范例来讲解 State 的用法。在 React Component 可以自己管理自己的内部 state,并用 this.state 来存取 state。当 setState() 方法更新了 state 后将重新呼叫 render() 方法,重新绘制 component 内容。以下范例是一个每 1000 毫秒(等于1秒)就会加一的累加器。由于这个范例是 Stateful Component 因此仅使用 ES6 Class Component,而不使用 Functional Component。
class Timer extends React.Component {
        constructor(props) {
                super(props);
                // 与 ES5 React.createClass({}) 不同的是 component 内自定义的方法需要自行绑定 this context,或是使用 arrow function
        this.tick = this.tick.bind(this);
                // 初始 state,等于 ES5 中的 getInitialState
                this.state = {
                        secondsElapsed: 0,
                }
        }
        // 累加器方法,每一秒被呼叫后就会使用 setState() 更新内部 state,让 Component 重新 render
        tick() {
            this.setState({secondsElapsed: this.state.secondsElapsed + 1});
        }
        // componentDidMount 为 component 生命周期中阶段 component 已插入节点的阶段,通常一些非同步操作都会放置在这个阶段。这便是每1秒钟会去呼叫 tick 方法
        componentDidMount() {
            this.interval = setInterval(this.tick, 1000);
        }
        // componentWillUnmount 为 component 生命周期中 component 即将移出插入的节点的阶段。这边移除了 setInterval 效力
        componentWillUnmount() {
                clearInterval(this.interval);
        }
        // render 为 class Component 中唯一需要定义的方法,其回传 component 欲显示的内容
        render() {
            return (
              <div>Seconds Elapsed: {this.state.secondsElapsed}</div>
            );
        }
}

ReactDOM.render(<Timer />, document.getElementById('app'));
 
 
事件处理(Event Handle)
// 与 ES5 React.createClass({}) 不同的是 component 内自定义的方法需要自行绑定 this context,或是使用 arrow function
        this.tick = this.tick.bind(this);
 
 
 
 
 
 
 
 
 
 
 
 
 

Props、State、Refs 与表单处理的更多相关文章

  1. 前端笔记之React(二)组件内部State&React实战&表单元素的受控

    一.组件内部的State 1.1 state state叫状态,是每一个类式组件都有的属性,但函数式组件,没有state. state是一个对象,什么值都可以定义. 在任何类式组件的构造函数中,可以用 ...

  2. react 项目实战(三)表单验证

    我们需要记录每一个字段当前的有效状态,有效时隐藏错误信息,无效时显示错误信息. 而这个有效/无效,可以在表单值改变的时候进行判断. 我们对/src/pages/UserAdd.js进行修改: 首先修改 ...

  3. React 之form表单、select、textarea、checkbox使用

    1.案例如下 import React from 'react'; /** * 非约束性组(类似defaultValue等属性,不可以程序修改): <input type="text& ...

  4. 七、React表单详解 约束性和非约束性组件 input text checkbox radio select textarea 以及获取表单的内容

    一.约束性和非约束性组件: 非约束性组: MV: <input type="text" defaultValue="a" /> 这个 default ...

  5. 基于react hooks,zarm组件库配置开发h5表单页面

    最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...

  6. react入门----(this.state/表单/Ajax)

    1.this.state 组件免不了要与用户互动,React 的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI var TestStat ...

  7. 错误:该表单无法显示,可能是由于 Microsoft SharePoint Server State Service 配置不当。有关详细信息,请与服务器管理员联系

    问题场景: 1.SharePoint 2013 中工作流需要状态服务(State Service),如果没有正确配置状态服务,则在给列表.文档库添加工作流时会遇到错误: “该表单无法显示,可能是由于 ...

  8. 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题

        方法使用前需了解: 来自”和“小编的小提示: 首先打印一下this.$refs[formName],检查是否拿到了正确的需要验证的form. 其次在拿到了正确的form后,检查该form上添加 ...

  9. element-ui的表单验证this.$refs[formName].validate的代码不执行

    经过排查,如果自定义验证中,每种情况都要写明确和有回调函数callback var validatePhone = (rule, value, callback) => { const reg ...

随机推荐

  1. how to read openstack code : routes

    When coding a web system, you have to think about an important problem, how to map urls to logic. Op ...

  2. Telnet登入cisco router 1800

    Login to Router and change to privileged modec:\>telnet 192.168.6.1Trying 192.168.6.1...Connected ...

  3. linux netlink套接字实现相似ss命令 ,统计套接字以及TCP信息

    參考了 ss的源码 以及 netlink相关资料:http://blog.csdn.net/scdxmoe/article/details/27711205 实现结果为: gcc netlink_di ...

  4. 关于jiffies回绕以及time_after,time_before

    系统中有非常多变量用来记录一个单调递增的现实,典型的有两个,一个是TCP的序列号.还有一个就是jiffies,可是由于计算机内表示的数字都是有限无界的,所以不论什么数字都不能做到全然意义的单调递增,它 ...

  5. JQuery图例

  6. OBIEE开发手冊

    Creating a Repository Using the Oracle BI 11g Administration Tool cid=5690&ssid=0">http: ...

  7. 【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习

    写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文 ...

  8. Tomcat启动Web.xml引用其它XML配置报FileNotFound异常解决方案

    如果使用JEECG框架进行Tomcat启动时,如果web.xml引用了其他xml文件,需要在tomcat文件夹里的config文件夹里的context.xml文件里的Context标签里配置xmlBl ...

  9. Java DAO模式

    DAO模式: DAO(DateAccessObject,数据存取对象) 位于业务逻辑和持久化数据之间,实现对持久化数据的访问. DAO组成: DAO接口: 数据库的所有操作定义成抽象方法,可以提供多种 ...

  10. 无线网络发射选址 2014年NOIP全国联赛提高组(二维前缀和)

    P2038 无线网络发射器选址 题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南 ...