React个人整理

  • React基础
//ReactDOM.render(reactWhat,domWhere)在浏览器中渲染应用的一种途径
//React.DOM表示预定义好的HTML元素集合
//React.DOM.h1(attributes,children)表示一个预定义的React 组件
//h1()第一个参数接收一个对象,用于指定该组件的任何属性(比如id属性,三个特殊属性class:className,for:htmlFor,style:对象形式赋值)。
//h1()第二个参数定义了该组件的子元素(Hello world!)
//document.getElementById("app") 方法访问DOM 节点,告诉React 需要把应用渲染在页面的哪个部分
ReactDOM.render(React.DOM.h1({id: 'my-heading'
}, 'Hello world!'), document.getElementById('app'));// JSX版本
ReactDOM.render(<h1 id="my-heading" ><span><em>Hell < /em>o</span > world!< /h1>,
document.getElementById('app')
);
复制代码
  • 自定义新组件
//自定义新组件
var Component = React.createClass({//该对象需要包含一个名为render() 的方法来显示组件render: function () {//该方法必须返回一个React 组件,不能只返回文本内容。return React.DOM.span(null, 'I\'m so custom');}
});
//使用自定义组件
ReactDOM.render(//React.createElement() 是创建组件“实例”的方法之一React.createElement(Component),//如果你想创建多个实例,还有另一种途径,就是使用工厂方法:React.createFactory(Component);document.getElementById('app')
);
复制代码
  • props和propTypes
//自定义的组件可以接收属性,所有属性都可以通过this.props对象获取
var Component = React.createClass({//propTypes是可选的,声明组件需要接收的属性列表及其对应类型propTypes: {//清晰地指明了name 属性是一个必须提供的字符串值name: React.PropTypes.string.isRequired,middleName: React.PropTypes.string,},//getDefaultProps() 方法返回一个对象,并为每个可选属性(不带.isRequired的属性)提供了默认值。getDefaultProps: function () {return {middleName: 'chris'};},render: function () {//请把this.props 视作只读属性。从父组件传递配置到子组件时,属性非常重要return React.DOM.span(null, 'My name is ' + this.props.name);}
});
ReactDOM.render(React.createElement(Component, {name: 'Bob'}),document.getElementById('app')
);
复制代码
  • 带状态的文本框组件
var TextAreaCounter = React.createClass({propTypes: {text: React.PropTypes.string,},getDefaultProps: function () {return {text: '',};},// 无状态版本render: function () {return React.DOM.div(null,//文本框使用了defaultValue 属性,而不是你在常规HTML 中习惯使用的文本子元素React.DOM.textarea({defaultValue: this.props.text,}),React.DOM.h3(null, this.props.text.length));},// 有状态版本(状态state负责组件内部数据的维护)_textChange: function (ev) {//数据发生改变时(即用户在文本框中输入内容时),组件可以通过一个事件监听器更新statethis.setState({//改变state 必须使用this.setState() 方法。该方法接收一个对象参数,并把对象与this.state 中已存在的数据进行合并text: ev.target.value,});},getInitialState: function () {//在初始化时,定义state中需要包含的属性,以保证可以通过this.state.text访问属性return {text: this.props.text,};},render: function () {return React.DOM.div(null,//文本框使用了defaultValue 属性,而不是你在常规HTML 中习惯使用的文本子元素React.DOM.textarea({value: this.state.text,//React 使用了合成事件来消除浏览器之间的不一致情况,React 在事件处理中使用驼峰法命名。//当用户输入时触发。而不是像原生DOM 事件那样,在用户结束输入并把焦点从输入框移走时才触发。onChange: this._textChange,}),React.DOM.h3(null, this.state.text.length));}
});
// 使用自定义组件
ReactDOM.render(React.createElement(TextAreaCounter, {text: "Bob",}),document.getElementById("app")
);
复制代码
  • 从外部访问组件(谨慎使用)
var myTextAreaCounter = ReactDOM.render(React.createElement(TextAreaCounter, {defaultValue: "Bob",}),document.getElementById("app")
);
//设置了新的state 值
myTextAreaCounter.setState({ text: "Hello outside world!" });
//获取了React 创建的父元素DOM 节点的引用
var reactAppNode = ReactDOM.findDOMNode(myTextAreaCounter);
//获取DOM 结构中首个<div id="app"> 节点。这也是你让React 进行渲染的位置:
reactAppNode.parentNode === document.getElementById('app'); // true
//访问组件的属性和状态
myTextAreaCounter.props; // Object { defaultValue: "Bob"}
myTextAreaCounter.state; // Object { text: "Hello outside world!"}
复制代码
  • 中途改变属性
//这个方法会接收新属性对象,让你可以根据新属性设置state
componentWillReceiveProps: function(newProps) {this.setState({text: newProps.defaultValue,});
};
复制代码

生命周期方法

初始化

  1. getDefaultProps()

设置默认的props,也可以用dufaultProps设置组件的默认属性. 对于组件类来说只调用一次,该组件类的所有后续应用,getDefaultPops 将不会再被调用

  1. getInitialState()

在使用es6的class语法时是没有这个钩子函数的,可以直接在constructor中定义this.state

对于组件的每个实例来说,这个方法的调用有且只有一次,用来初始化每个实例的 state,在这个方法里,可以访问组件的 this.props

getInitialStategetDefaultPops 的调用是有区别的,getDefaultPops 是对于组件类来说只调用一次,后续该类的应用都不会被调用, 而 getInitialState 是对于每个组件实例来讲都会调用,并且只调一次。

  1. componentWillMount()

组件初始化之后,首次渲染之前调用,以后组件更新不调用,整个生命周期只调用一次,是在render 方法调用之前修改 state 的最后一次机会。

  1. render()

react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了。 该方法会创建一个虚拟DOM,用来表示组件的输出。对于一个组件来讲,render方法是唯一一个必需的方法。

render方法需要满足下面几点:

(1)只能通过 this.propsthis.state 访问数据(不能修改)

(2)可以返回 null,false 或者任何React组件

(3)只能出现一个顶级组件,不能返回一组元素

(4)不能改变组件的状态

(5)不能修改DOM的输出

render方法返回的结果并不是真正的DOM元素,而是一个虚拟的表现,类似于一个DOM tree的结构的对象。react之所以效率高,就是这个原因。

  1. componentDidMount()

组件渲染之后调用,只调用一次。 该方法被调用时,已经渲染出真实的 DOM,可以再该方法中通过 this.getDOMNode() 访问到真实的 DOM(推荐使用 ReactDOM.findDOMNode())。

由于组件并不是真实的 DOM 节点,而是存在于内存之中的一种数据结构,叫做虚拟 DOM (virtual DOM)。只有当它插入文档以后,才会变成真实的 DOM 。有时需要从组件获取真实 DOM 的节点,这时就要用到 ref 属性:


var Area = React.createClass({render: function () {this.getDOMNode(); //render调用时,组件未挂载,这里将报错return <canvas ref='mainCanvas' >},componentDidMount: function () {var canvas = this.refs.mainCanvas.getDOMNode();//这是有效的,可以访问到 Canvas 节点}
});
复制代码

需要注意的是,由于 this.refs.[refName]属性获取的是真实 DOM ,所以必须等到虚拟 DOM 插入文档以后,才能使用这个属性,否则会报错。

更新

此时组件已经渲染好并且用户可以与它进行交互,比如鼠标点击,手指点按,或者其它的一些事件,导致应用状态的改变,你将会看到下面的方法依次被调用

  1. componentWillReceiveProps(nextProps)

组件的 props 属性可以通过父组件来更改,这时,componentWillReceiveProps 将来被调用。可以在这个方法里更新 state,以触发 render 方法重新渲染组件。

componentWillReceiveProps: function(nextProps) {if (nextProps.checked !== undefined) {this.setState({checked: nextProps.checked})}
}
复制代码
  1. shouldComponentUpdate(nextProps, nextState)

react性能优化非常重要的一环。 组件接受新的state或者props时调用,我们可以在此对比前后两个propsstate是否相同。 如果相同,则返回false阻止更新,因为相同的属性状态一定会生成相同的dom树,这样就不需要创造新的dom树和旧的dom树进行diff算法对比,节省大量性能

如果你确定组件的 props 或者state 的改变不需要重新渲染,可以通过在这个方法里通过返回 false 来阻止组件的重新渲染,返回 false 则不会执行 render 以及后面的 componentWillUpdatecomponentDidUpdate 方法。

该方法是非必须的,并且大多数情况下不会使用。

  1. componentWillUpdate(nextProps, nextState)

这个方法和 componentWillMount 类似,在组件接收到了新的 props 或者 state 即将进行重新渲染前,componentWillUpdate(object nextProps, object nextState) 会被调用。 注意此时可以修改state,但最好不要在此方面里再去更新 props 或者 state

  1. render()

组件渲染

  1. componentDidUpdate()

这个方法和 componentDidMount 类似,在组件重新被渲染之后,componentDidUpdate(object prevProps, object prevState) 会被调用。可以在这里访问并修改 DOM

卸载

  1. componentWillUnmount()

组件将要卸载时调用,一些事件监听和定时器需要在此时清除。

// 组件卸载
React.unmountComponentAtNode(this.props.containerNode[0]);
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sketch钢笔工具_Sketch和Figma,不同的工具等于不同的结果

sketch钢笔工具We like to compare the difference between various design programs and debate about which one is the most powerful. But we often forget to reflect on how using one of these tools is impacting our product. A powerful artist would say that he ca…

程序下载

Zaxis终端前置机 版 本下 载特 性1.20.1104.102ZaxisSetup.rar 分类: 程序下载转载于:https://www.cnblogs.com/baijinlong/archive/2011/05/13/2045263.html

提升效率的Vue组件开发和实战技巧

大家好我是若川。现在的大前端时代&#xff0c;是一个动荡纷争的时代&#xff0c;江湖中已经分成了很多门派&#xff0c;主要以Vue&#xff0c;React还有Angular为首&#xff0c;形成前端框架三足鼎立的局势。Vue在前端框架中的地位就像曾经的 jQuery&#xff0c;由于其简单易懂…

合格linux运维人员必会的30道shell编程面试题及讲解

超深度讲解shell高级编程实战&#xff0c;截至目前shell编程课程国内培训机构最细的课程&#xff0c;不信请看学员表现的水平。课程牛不牛&#xff0c;不是看老师、课表&#xff0c;而是看培养的的学生水平&#xff0c;目前全免费中伙伴们赶紧看啊。http://edu.51cto.com/cours…

linux下telnet失败怎么处理,CentOS下telnet退出失败的解决办法

最近有CentOS用户反映在调试网络程序时出现了问题&#xff0c;服务虽然启动了&#xff0c;但客户端却无法连接上&#xff0c;用telnet连接后发现是Windows防火墙的问题&#xff0c;可是用telnet命令连接成功后发现退不出去了&#xff0c;这该怎么办&#xff1f;下面小编就给大家…

poj 1990

第一道树状数组 代码&#xff1a; #include<iostream> #include<fstream>using namespace std;int n;struct e{int v,x; };e a[20001];long long cnt[20001],sum[20001];int lowbit(int x){return x&(x^(x-1)); }void modify(long long a[],int s,int t){while…

figma下载_Figma中的动态内容和颜色

figma下载First off, why use dynamic data?首先&#xff0c;为什么要使用动态数据&#xff1f; It’s easy to create and manage long lists of content 创建和管理一长串内容很容易 You get a better idea of what your product will look like with actual data 通过实际…

代码自解释不是不写注释的理由

有什么比花时间写注释更令人感到兴奋的事情吗&#xff1f;如果我没有猜错&#xff0c;你可能会说&#xff1a;“不好意思&#xff0c;所有事情都比写注释更令人感到兴奋”。如果有人要你给代码加上注释&#xff0c;对你来说就像是一种侮辱。你的代码写得如此优雅&#xff0c;它…

linux汇编中的注释,Linux 汇编器:对照 GAS 和 NASM

Linux 汇编器&#xff1a;对比 GAS 和 NASM转自 http://www.ibm.com/developerworks/cn/linux/l-gas-nasm.html#ibm-pcon与其他语言不同&#xff0c;汇编语言要求开发人员了解编程所用机器的处理器体系结构。汇编程序不可移植&#xff0c;维护和理解常常比较麻烦&#xff0c;通…

你可能不知道的package.json

大家好&#xff0c;我是若川。最近组织了源码共度活动&#xff1a;1个月&#xff0c;200人&#xff0c;一起读了4周源码&#xff0c;参与的小伙伴都表示收获很大。如果感兴趣可以点击链接扫码加我微信 ruochuan12。今天推荐一篇相对简单的文章。前言在上一篇npm init vitejs/ap…

基于上下文的rpn_构建事物-产品评论视频中基于上下文的情感分析

基于上下文的rpnThe word “Social” has taken a whole new meaning in today’s digital era. Simply going out to enjoy is no longer the only “social” criteria. Social now is — giving a peek in your personal and professional life to your connections. Facebo…

可爱的 Python: 使用 mechanize 和 Beautiful Soup 轻松收集 Web 数据

可爱的 Python: 使用 mechanize 和 Beautiful Soup 轻松收集 Web 数据 使用 Python 工具简化 Web 站点数据的提取和组织 David Mertz, Ph.D., 开发人员, Gnosis Software, Inc.从 2000 年开始&#xff0c;David Mertz 就一直在为 developerWorks 专栏 Charming Python 和 XML M…

广西工学院c语言试题答案,广西工学院的C语言考试试题

广西工学院鹿山学院 2005 — 2006 学年第 2 学期课程考核试题 考核课程 《C语言程序设计》 (A卷)考核班级 学生数 印数 考核方式 闭卷 考核时间 120 分钟一、选择题(每题2分&#xff0c;共40分)1. 一个C语言的源程序中&#xff0c; 。A&#xff0e;必须有一个主函数2. 下列数据…

JavaScript 断点调试技巧

大家好&#xff0c;我是若川。最近组织了源码共度活动&#xff1a;1个月&#xff0c;200人&#xff0c;一起读了4周源码&#xff0c;参与的小伙伴都表示收获很大。如果感兴趣可以点击链接扫码加我微信 ruochuan12。之前推荐过很多次调试文章&#xff0c;说明调试的重要性&#…

大学生电子设计大赛案例分析_为大学生设计问答平台—案例研究

大学生电子设计大赛案例分析Dealing with academic-related questions like picking a course, fulfilling a major requirement can be tedious and ineffective when you have to simultaneously balance school work, social activities, and focus on personal growth and …

最新最详细最简洁Eclipse调试PHP配置详解(Xdebug,Zend Debugger)

搬家注&#xff1a;该日志写于2011 年 04 月 07 日&#xff0c;Eclipse&#xff0c;PHP等版本号很多&#xff0c;更新也比较快&#xff0c;请注意文章中的版本。本文不一定帮您解决问题&#xff0c;但能给您一些解决问题的思路及一些概念。 最近开始做SRTP项目WebOS&#xff0c…

按键精灵易语言c,求助(把按键精灵的源码转为易语言的)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼MoveTo 1203,673IfColor 1203,673,"252489",2 ThenMoveTo 417, 242Delay 10072LeftDown 1LeftClick 1LeftUp 1MoveTo 982, 551Delay 7660LeftDoubleClick 1Delay 10Delay 30LeftUp 1LeftUp 1LeftUp 1MoveTo 1102, 709Del…

入门前端学习路线图【送书】

大家好&#xff0c;我是若川。记得点上方音频听小姐姐配音&#xff0c;超级好听。华章图书又赞助了书籍送福利给大家。本次送4本书的抽奖方式是&#xff1a;截止到9月6日&#xff08;周一&#xff09;20:00&#xff0c;在留言区留言任意内容。我会在留言区抽取「1位」关注我公众…

单选按钮设置为被选中状态_为什么要设置错误的按钮状态

单选按钮设置为被选中状态当正确的方法出错时 (When the right way goes wrong) Let’s say you want to create a click effect on an HTML button. The first idea that many people get is to do something that reproduces the feeling of the sound emitted by a real but…

「娃娃分享」-常见自校检分析实例.

自校检是许多软件的保护手段之一&#xff0c;对软件加个简单的壳再增加自校检在一定程序上可以抵挡住一大部分新手&#xff0c;不过&#xff0c;对许多人来说&#xff0c;这个保护已经很弱了。。下面讲几种常见的解决自校检方法&#xff0c;写的粗略&#xff0c;希望大家补充。…