React组件开发

目录:

  1. 属性:props
  2. 内联样式
  3. 状态记忆 : state
  4. 生命周期
  5. 访问DOM
  6. 表单输入

承接快速入门篇:http://www.cnblogs.com/jasonnode/p/4444504.html

属性 : props

组件应该提供一些属性供开发者在不同的场景下可以对组件实例元素的行为 外观进行调整,这样可以提高组件的利用效率。

在React中,使用props字段访问实例元素的属性。

例如,在下面的JSX片段中,EzLampComp组件的实例元素有一个属性onoff:

  1. React.render(
    <ezlampcomp onoff="off"></ezlampcomp> ,
    document.querySelector("#content"));

那么在EzLampComp组件的实现中,我们可以通过props字段访问这个属性, 并根据属性值设置其样式类。

在JSX中,我们也可以将一个JavaScript表达式赋给React元素的属性,这时需要 使用一对大括号来代替引号:

  1. var myOnoff = "on";
    React.render(
    <ezlampcomp onoff="{myOnoff}"></ezlampcomp>,
    document.querySelector("#content"));

如果你觉得不好理解,那么我们把上面的JSX代码转换成JavaScript:

  1. var myOnoff = "on";
    React.render(
    React.createElement(
    EzLampComp,
    {
    onoff : myOnoff
    }),
    document.querySelector("#content"));

内联样式

在前面的示例中,每当需要设定元素的样式,我们总是使用样式类。但有时我们的确需要 直接在元素上声明内联样式,就像在HTML中一样:

  1. //HTML
    <div style="width:200px;height:200px;"></div>

在React元素中声明样式,需要给出一个JSON对象,其字段对应样式名称,比如要渲染出 上面的HTML片段,需要这样:

  1. var myStyle = {
    width:"200px",
    height:"200px"
    };
    //JSX
    var e = <div style="{myStyle}"></div>;
    //JavaScript
    var e = React.createElement(
    "div",{
    style : myStyle
    });
    //render
    React.render(e,...);
  • 注意1 - 对应样式名称的字段,需要使用驼峰式命名

比如:border-radius样式需要使用borderRadius来访问,而background-image 样式需要使用backgroundImage来访问。

  • 注意2 - 样式名称中的供应商前缀,除ms外都需要大写首字母

对于供应商前缀(-webkit, -moz, -o, -ms),除了ms,其他都需要将首字母大写。 比如:-webkit-transition应当通过WebkitTransition来访问,然而-ms-transition 则需要通过msTransition来访问。

状态记忆 : state

很多情况下,组件实例的外观及行为通过使用props变量进行定制就可以了。 这样的组件我们称之为无状态/stateless的组件,因为在任何时刻,组件 实例的表现都仅仅取决于外部传入的props属性,与 它自身之前的表现毫无关系,即,它本身没有任何记忆。

让一个组件拥有记忆能力,意味着它不仅能对外界的刺激产生反应(通过props 传入的数据、或用户的交互事件),也能根据自身的状态对同样的刺激做出 不同的反应。

比如示例中的切换开关,它可以响应用户的点击事件,如果当前状态是关,那么它就 切换到开的状态(显示开状态的图片);而如果当前状态是开,那么它就切换到关的 状态(显示关状态的图片):

现在思考一下,使用props可以实现这个切换开关吗?

React的组件的确引入了状态机的概念,通过将组件划分为不同的状态,使组件具有 了一定的记忆能力:

  • state - 组件的状态变量

每个React组件实例都有一个state变量,用来保存组件的当前状态。可以在 任何时刻使用this.state读取当前状态。

  • getInitialState() - 设置组件初始状态

组件的实现者应当实现一个getInitialState()方法来设置组件的初始状态。 getInitialState()方法必须返回一个JSON对象或空值null, 这意味着即使你只需要一个简单的标志作为状态,比如true或false,也要把它放到JSON对象里。

  • setState(currentState) - 设置组件当前状态

尽管可以使用this.state来直接设置组件当前状态,但React要求我们使用 setState()方法来进行状态设置。这是因为,setState()方法会自动 地重新渲染组件,而这通常是我们所期望的。

参数currentState是一个JSON对象,不必包含状态变量的所有字段,setState()方法会 将这个参数值与当前状态this.sate进行合并,结果作为状态变量的新值。

生命周期

在组件实例的整个周期中,React将在特定的时间点调用以下方法:

  • componentWillMount() - 组件实例即将挂接(初次渲染)时被调用

这个方法在整个生命周期中只会被调用一次。

  • componentDidMount() - 组件实例挂接(初次渲染)后被调用

这个方法在整个生命周期中只会被调用一次。

  • componentWillReceiveProps(nextProps) - 组件实例即将设置新属性时被调用

参数nextProps表示即将应用到组件实例上的新属性值。

这个方法在初次渲染时不会被调用。在此方法内调用setState()不会引起重新渲染。

  • shouldComponentUpdate(nextProps, nextState) - 组件实例即将重新渲染时被调用

参数nextProps传入即将应用到组件实例上的新属性值,参数nextState传入组件实例即将被 设置的状态值。如果这个方法返回false,那么组件实例就不会被重新渲染。除非我们明确地 知道,新的属性和状态不需要进行重新渲染,否则这个方法都应该返回true。

这个方法在初次渲染时或通过forceUpdate()方法进行渲染时不会被调用。

  • componentWillUpdate(nextProps, nextState) - 组件实例即将重新渲染时被调用

这个方法在初次渲染时不会被调用。注意:不能在此方法内调用setState()。

  • componentDidUpdate(prevProps, prevState) - 组件实例重新渲染后被调用

这个方法在初次渲染时不会被调用。

  • componentWillUnmount() - 组件实例即将从DOM树移除时被调用

这个方法在整个生命周期中只会被调用一次。

访问DOM

在React中,有时需要直接访问React元素对应的DOM对象,比如读取用户的输入。 这需要两个步骤:

  • 设置React元素的ref属性

如果需要在代码中访问某个React元素的DOM对象,那么首先需要设置这个React 元素的ref属性。

比如,我们需要读取文本输入框的值,那么首先给这个input元素指定ref属性:

  1. //JSX
    <input type="text" defaultvalue="beijing" ref="q" placeholder="请输入城市拼音,如:beijing">

声明了React元素的ref属性之后,可以通过this.refs对象访问 这个组件,比如上面的示例中:this.refs.q指向input组件对象,你应该已经注意到, 我们为React元素设置的ref属性值,在这里被用为this.refs对象的键值。

  • 获得DOM对象

在设置了React元素的ref属性后,可以使用React.findDOMNode()方法获得对应的 DOM对象:

  1. React.findDOMNode(component)

参数component是一个React组件对象,如前所述,我们可以通过this.refs对象获得。

如果React元素已经渲染到DOM树上,findDOMNode()方法将返回组件对象对应的DOM节 点对象,后续就可以使用标准的DOM API操作这个DOM对象了。

表单输入

在React中,表单输入元素如 input, textarea, option等,和其他标准的HTML元素 相比需要特殊的注意:

  • 文本输入框

不要使用value属性设置文本输入框元素的初值,应当使用defaultValue:

  1. //JSX
    <input type="text" defaultvalue="demo">
  • 复选按钮

不要使用checked属性设置复选按钮的初始选中状态,应当使用defaultChecked:

  1. //JSX
    <input type="checkbox" defaultchecked="">
  • 单选按钮组

不要使用option元素的selected属性设置单选按钮组的初始选中状态,应当使用 select元素的defaultValue:

  1. //JSX
    <select defaultvalue="A">
    <option value="A">China</option>
    <option value="B">India</option>
    <option value="C">Japan</option>
    </select>

在  示例代码 中添加一个要登入系统的选择框,使其看起来像这样:

可选的系统有:OA、财务、人力资源 。 默认选中人力资源。

时间: 2024-08-26 18:08:46

React组件开发的相关文章

react组件开发规范(一)

这是通过修改项目运行在Google上时的警告,总结的的部分react组件开发规范: (1)编写组件时,一定要写PropTypes,切莫为了省事儿而不写! 如果一个Props不是required,一定在getDefaultProps中设置它: React.PropTypes主要用来验证组件接收到的props是否为正确的数据类型,如果不正确,控制台(console)中就会出现对应的警告(warning). 所以,为了规范我们开发,减少不必要的警告,这个要注意写上,而且保证类型写对. (2)map遍历

React组件开发注意事项

0.state的设定原则,如果render里用不到,则就不应该是一个state. 1.数组遍历时,用每一条数据的唯一标识作为key,尽量不要使用遍历的索引值作为key,如果它们从不重新排序,它们工作也很好,但是如果存在重新排序,性能将会很差. 2.处理事件,推荐使用属性初始化语法,如下: class LoggingButton extends React.Component { // 这个语法确保 `this` 绑定在 handleClick 中. // 警告:这是 *实验性的* 语法. han

wn-cli 像React组件开发一样来开发微信小程序

项目地址:wn-cli wn-cli 名字由来:wn -> weapp native 取第一个字母 Install npm install wn-cli --save-dev // 或者 yarn add wn-cli --dev Usage // 构建 npx wn ./examples ./dist // 监听模式 npx wn ./examples ./dist -w 如果你遇到一个错误,让拷贝 wn.js 文件,请按提示信息将 node_modules 中的 node_modules/w

React组件开发经典案例--todolist

点开查看代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>todolist2</title> <link rel="stylesheet" href=&qu

React组件略讲

React是前端组件化开发的开山鼻祖,这种开发方式彻底解决了的前端组件复用的痛点.今天,就来研究一下React组件开发. 前端同学一般都会从Vue入门,因为Vue使用的<template>的组件开发方式让前端人员更容易的平滑过渡.Vue的组件很简单,一般来说,一个.vue文件就是一个组件.就像webpack的模块化开发,一个文件就是一个组件.我们在使用组件时也很容易,通过 ES6 的import导入.注册(components),就可以直接使用. 上面简单说了Vue的组件模式,其实,React

结合 ES6+ 开发 React 组件

这是 Steven Luscher 写的一篇关于 React 的文章,Steven Luscher 擅长使用 React 和 GraphQL 构建应用. 原文地址:http://babeljs.io/blog/2015/06/07/react-on-es6-plus/ 当重新设计 Instagram Web 的时候,使用了一些 ES6+ 的特性来编写 React 组件.在这里简要的说一下这些语言新特性对 React 应用的开发有什么影响,这些 ES6+ 特性使得 React 开发更简单更有趣.

ES6+ 开发 React 组件

在这里简要的说一下这些语言新特性对 React 应用的开发有什么影响,这些 ES6+ 特性使得 React 开发更简单更有趣. 类 迄今为止,最能体现我们使用 ES6+ 来编写 React 组件的就是我们选择使用类定义语法.替代了使用 React.createClass 方法来定义一个组件,我们可以定义一个 bonafide ES6 类来扩展 React.Component: ? 1 2 3 4 5 class Photo extends React.Component {   render()

react组件化开发发布到npm

1.项目目录 build:webpack打包用(开发环境.发布环境) example:开发环境的模板页 lib:打包好的文件夹(用于发布到npm上) src:想要封装的公共组件 .babelrc:处理es6语法 package.json:打包的依赖文件,管理项目模块包 开发环境配置(webpack.dev.config.js) const path = require('path') const htmlWebpackPlugin = require('html-webpack-plugin')

React 组件之间如何交流

原文  http://blog.51yuekan.com/2015/07/23/2015-07-19-react-component-communicate/ 主题 React 前言 今天群里面有很多都在问关于 React 组件之间是如何通信的问题,之前自己写的时候也遇到过这类问题.下面是我看到的一篇不错英文版的翻译,看过我博客的人都知道,我翻译可能不会按部就班,会尽可能用中文的意思,来将作者要讲述的技术描述清楚.英文能力有限,如果有不对的地方请跟我留言,一定修改--^_^ 原著序 处理 Rea