我们也了解到 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. pojWindow Pains(拓扑排序)

    题目链接: 啊哈哈,点我点我 题意: 一快屏幕分非常多区域,区域之间能够相互覆盖,要覆盖就把属于自己的地方所有覆盖. 给出这块屏幕终于的位置.看这块屏幕是对的还是错的.. 思路: 拓扑排序,这个简化点 ...

  2. Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源

    2015年项目接到一个需求,实现一个向导动画,这个动画一共六十张图片,当时使用的是全志A33的开发(512的内存),通过使用Android的动画集实现,效果特别卡顿,然后想到这样的方式来实现,效果非常 ...

  3. Velocity高速新手教程

    变量 (1)变量的定义: #set($name = "hello")      说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引號中的字面字符串将解析和又 ...

  4. Struts2默认拦截器栈及内建拦截器使用具体解释

    Struts2内建拦截器介绍:   alias (别名拦截器):同意參数在跨越多个请求时使用不同别名,该拦截器可将多个Action採用不同名字链接起来,然后用于处理同一信息.  autowiring  ...

  5. Hibernate连接数据库

    包结构如下图所示(按图标进行对齐): 环境搭好后代码分为以下几步: /** * private static final Configuration CONFIGURATION; * private ...

  6. Linux ALSA声卡驱动之一:ALSA架构简介【转】

    本文转载自:http://blog.csdn.net/droidphone/article/details/6271122 声明:本博内容均由http://blog.csdn.net/droidpho ...

  7. bzoj 3308 九月的咖啡店

    题目大意: 求若干个<=n的数 两两互质 使和最大 求这个最大的和 思路: 显然,得到两个结论 1 最终的所有数都只能分解为两个质因数 2 这两个质因数 一个<根号n 一个>根号n ...

  8. 【JSOI 2011】 分特产

    [题目链接] 点击打开链接 [算法] 考虑求每个人可以不分的方案 那么,对于每件物品,我们把它分成n份,每一份对应分给每一个人,有C(a[i]+n-1,m-1)种方案,而总方案数就是每种 物品方案数的 ...

  9. bzoj 4883 棋盘上的守卫 —— 基环树转化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4883 首先,注意到每个点可横可竖,但花费一样: 所以考虑行列的交集,那么这个条件可以转化为行 ...

  10. Python 之reduce()函数

    reduce()函数: reduce()函数也是Python内置的一个高阶函数.reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce() ...