一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google。

但是能把算法说清楚,虚拟DOM说清楚的聊聊无几。对开发又没卵用,还不如来点干货看看咋用。

二.结构如下:

import reqwest from 'reqwest';
import React from 'react';
import ReactDOM from 'react-dom'; var Header = React.createClass({
handleClick:function(){
console.log(this.refs.head);
console.log(ReactDOM.findDOMNode(this.refs.head));
},
render:function(){
return (
<div style={{ backgroundColor:'blue' }} onClick={ this.handleClick } ref='head'>
<p>Header组件</p>
</div>
)
}
}) var ComponentDemo = React.createClass({
//默认state
getInitialState() {
return {
current: 1,
openKeys: [],
result_data : {}
};
},
//默认props
getDefaultProps() {
return {
key:{
value:2
}
};
},
//静态方法 调用 ComponentDemo. getBusinessName()
statics:{
getBusinessName:function(){
return console.log('getBusinessName方法被调用。。。')
}
},
handleClick(e) {
console.log('div被点击。。。');
console.log(this.refs.cct);
console.log(ReactDOM.findDOMNode(this.refs.cct))
},
componentDidMount: function() { //异步请求
reqwest({
url: 'http://localhost:90/menu',
method: 'get',
type: 'json'
}).then(result => {
if(this.isMounted()){
this.setState({
result_data : result.data
});
} },function(err, msg){
console.log(err)
console.log(msg)
}); //使用props
console.log(this.props.key.value) },
componentWillReceiveProps(nextProps) {
//接受新的props时候被触发
},
render() { return (
<div>
<Header ref='cct'/>
<div style={{ height:'100%',width:200 }} className='btn' onClick={ this.handleClick }>CCT部分</div>
</div>
);
}
}) ReactDOM.render(<ComponentDemo />,
document.getElementById('contain'));

这个例子中涉及了开发中常用的几个知识点。

1.improt 这样的引入方式是es6的语法 ,也可require

2.Header是个组件,组件的创建使用React.createClass({}),es6也还有别的写法,反正我是用不惯

3.每个组件都需要一个render函数,return中只能包含一个顶层标签,我们一般用div来包裹。且组件名称应该大写开头。

4.refs的属性可以帮助我们突破虚拟DOM的限制,可以获取到DOM结构,但是不要使用中文网上的类似:this.refs.xxx.getDOMNode(),因为这样的写法已经不被支持。

this.refs.XXX的写法是用来获取react结构的。

我们应该使用react-dom提供的专门操作DOM的方法:ReactDOM.findDOMNode(this.refs.XXX)。

this.refs.XXX与ReactDOM.findDOMNode(this.refs.XXX)是不同的,虽然有时候我们打印出来的有时会相同。

5.当然,react最核心的就是一个状态机。getInitialState(只会在组件初始化的时候调用一次)就是用来初始化状态的,我们可以通过this.setState()来修改状态。状态的每次修改都会出发render函数。

6.getDefaultProps这个函数可以帮助我们设置一个不变的数据结构,以便取用。相当于定义了一个常量。

7.statics就是用来顶一个静态方法的,我们可以定义各种函数,并通过ComponentDemo. getBusinessName()方式来调用。结构:组件名.函数名

8.最重要的事件机制也是存在的,就像例子中的onClick,大部门事件机制都是支持的。

9.componentDidMount(只会在组件渲染结束后调用一次)这个函数就是跟组件的生命周期相关了。我们一般在里面会进行异步的请求之类的操作。

componentWillMount(只会在组件执行初始化渲染之前调用一次)刚好跟上面的相反。

还有其他的几个,个人理解为组件进入,开始,离开的钩子。

shouldComponentUpdate(object nextProps,boject nextState) (在函数有新的props或state的时候触发)这个钩子会主要管理组件是否更新的,返回的是个布尔值。默认是true,一般不建议使用。

10.组件肯定也少不了css的润色。但是这里添加style必须以对象的形式写,如果是数字的话,默认单位是px。

其他的属性必须用驼峰格式:style={{ backgroundColor:'red' }};

class必须写成className。

11.isMounted()是用来判断组件是否已经插入DOM。一般请求后强烈建议在判断是否插入DOM后,再来修改state。

绝对不要直接改变 this.state,因为在之后调用 setState() 可能会替换掉你做的更改。把 this.state 当做不可变的。

setState() 不会立刻改变 this.state,而是创建一个即将处理的 state 转变。在调用该方法之后获取 this.state 的值可能会得到现有的值,而不是最新设置的值。

不保证 setState() 调用的同步性,为了提升性能,可能会批量执行 state 转变和 DOM 渲染。

setState() 将总是触发一次重绘,除非在 shouldComponentUpdate() 中实现了条件渲染逻辑。如果使用可变的对象,但是又不能在 shouldComponentUpdate() 中实现这种逻辑,仅在新 state 和之前的 state 存在差异的时候调用 setState() 可以避免不必要的重新渲染。

以上仅属于个人愚见,如果错处,欢迎指出!

React在开发中的常用结构以及功能详解的更多相关文章

  1. 在ASP.NET 5应用程序中的跨域请求功能详解

    在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...

  2. 【重构】AndroidStudio中代码重构菜单Refactor功能详解

    代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...

  3. Spring常用jar包功能详解

    很多小伙伴包括我自己,在使用spring的时候导入了一堆jar包,但是并不明白每个jar的用途,使用spring的不同功能时也不知该导入哪个jar包,今天记录一下spring各个jar包的含义,供大家 ...

  4. Java——Spring常用jar包功能详解

    很多小伙伴包括我自己,在使用spring的时候导入了一堆jar包,但是并不明白每个jar的用途,使用spring的不同功能时也不知该导入哪个jar包,今天记录一下spring各个jar包的含义,供大家 ...

  5. Python中pandas透视表pivot_table功能详解(非常简单易懂)

    一文看懂pandas的透视表pivot_table 一.概述 1.1 什么是透视表? 透视表是一种可以对数据动态排布并且分类汇总的表格格式.或许大多数人都在Excel使用过数据透视表,也体会到它的强大 ...

  6. TableView 常用技巧与功能详解

    分割线顶格iOS8 UITableview分割线顶格的做法 //iOS8 Cell分割线顶格 if ([_tableView respondsToSelector:@selector(setSepar ...

  7. Windows开发中一些常用的辅助工具

    经常有人问如何快速的定位和解决问题,很多时候答案就是借助工具, 记录个人Windows开发中个人常用的一些辅助工具.   (1) Spy++ 相信windows开发中应该没人不知道这个工具, 我们常用 ...

  8. react + antiDesign开发中遇到的问题记录

    react + antiDesign开发中遇到的问题记录 一:页面中子路由失效: antiDesign的官方实例中,会把路由重复的地方给去重,而且路由匹配模式不是严格模式.所以我们需要在util.js ...

  9. React Native开发中自动打包脚本

    React Native开发中自动打包脚本 在日常的RN开发中,我们避免不了需要将我们编写的代码编译成安装包,然后生成二维码,供需要测试的人员扫描下载.但是对于非原生的开发人员来说,可能不知如何使用X ...

随机推荐

  1. ASP.NET Core 之 Identity 入门(一)

    前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...

  2. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  3. 【趣事】用 JavaScript 对抗 DDOS 攻击

    继续趣事分享. 上回聊到了大学里用一根网线发起攻击,今天接着往后讲. 不过这次讲的正好相反 -- 不是攻击,而是防御.一个奇葩防火墙的开发经历. 第二学期大家都带了电脑,于是可以用更高端的方法断网了. ...

  4. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  5. django server之间通过remote user 相互调用

    首先,场景是这样的:存在两个django web应用,并且两个应用存在一定的联系.某些情况下彼此需要获取对方的数据. 但是我们的应用肯经都会有对应的鉴权机制.不会让人家随随便便就访问的对吧.好比上车要 ...

  6. javascript匹配各种括号书写是否正确

    今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...

  7. log4net使用手册

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  8. mount报错: you must specify the filesystem type

    在linux mount /dev/vdb 到 /home 分区时报错: # mount /dev/vdb /homemount: you must specify the filesystem ty ...

  9. could not initialize proxy - no Session

    这是一个精典的问题:因为我们在hibernate里面load一个对象出来时,用到的是代理对象,也就是说当我们在执行load方法时并没有发sql语句,而是返回一个proxy对象.只有当们具体用到哪个ge ...

  10. 学习笔记:URL Protocol在浏览器中打开本地应用程序

    看到阿里的网站上可以通过点击卖家的旺旺图标从而调用本地的阿里旺旺程序,而且还可以传递当前浏览者需要咨询的商品.这是怎么实现的呢?是通过URLProtocol来完成. 原理还没有太清楚,即在系统里注册一 ...