React 精华一页纸

同 angularJS、Vue一样,React 也是一种替换框架,采用JSX语法进行替换

react.min.js - React 的核心库

react-dom.min.js - 提供与 DOM 相关的功能

browser.min.js - 用于将 JSX 语法转为 JavaScript 语法

1、典型用法

入门例子

ReactDOM.render(

Hello, world!

,

document.getElementById('example')

);

过程:

I、使用框架 ReactDOM.render 方法操作dom

II、第一个参数时是 插入的 JSX 语法生成的元素 ;第二个参数是绑定 到的DOM的节点

如果要解析 JSX,则type 要设定为

JSX:类似 HTML + JS的语法,编译后进行了优化,效率更高

2、基础概念

I、表达式

ReactDOM.render(

{i == 1 ? 'True!' : 'False'}

,

document.getElementById('example')

);

和 angular和vue不同的是,没有采用双括号{{}}, 而使用单括号 {} 取值和表达式运算

II、逻辑控制

因为是类HTML的语法,所以没有设计 一些 指令,都是 API操作;事件,也是使用的js 的原生事件,没有封装

React 的 JSX 使用大、小写的约定来区分本地组件的类(自定义组件)和 HTML 标签

3、绑定

同angularJS和Vue不一样,React 没有绑定指令,所以他的绑定,是直接引用和操纵对象的状态(这个对象是 state,具体参照下面关于state的描述)

4、组件化

I、组件化的例子

var WebSite = React.createClass({

render: function() {

return (

);

}

});

var Name = React.createClass({

render: function() {

return (

{this.props.name}

);

}

});

var Link = React.createClass({

render: function() {

return (

{this.props.site}

);

}

});

React.render(

,

document.getElementById('example')

);

II、组件化的步骤

一、注册组件

通过 React.createClass 创建类,创建一个 自定义标签替换规则

固定属性 render 返回一个 HTML 模板

二、父控件(外层)向自定义组件(内层)传递数据

I、通过 this.props 传递数据

通过 getDefaultProps 获取默认数据

propTypes 属性可以校验传递的数据

II、操纵状态属性 state

React 把组件看成状态机,每个自定义组件,都会添加一个 state 对象

通过 this.state 可以获取state对象

通过 getInitialState 函数获取初始的 state对象 存储的数据

通过 this.setState 本对象的方法来设置 state对象 存储的数据

var LikeButton = React.createClass({

getInitialState: function() {

return {liked: false};

},

handleClick: function(event) {

this.setState({liked: !this.state.liked});

},

render: function() {

var text = this.state.liked ? '喜欢' : '不喜欢';

return (

{text}我。点我切换状态。

);

}

});

React.render(

,

document.getElementById('example')

);

state VS props

props 传递数据给子组件,不可变;state 因为可变,可以和用户交互

同angularJS和Vue相比,

5、组件 API 与生命周期

设置状态:setState

替换状态:replaceState

设置属性:setProps

替换属性:replaceProps

强制更新:forceUpdate

获取DOM节点:findDOMNode

判断组件挂载状态:isMounted

Mounting - 已经插入DOM

Updating - 正在重新渲染

Unmounint - 移除DOM

生命周期的方法 - 回调函数

componentWillMount

componentDidMount

componentWillReceiveProps

shouldComponentUpdate

componentWillUpdate

componentDidUpdate

componentWillUnmount

6、ref 属性

这个和 vue的 el属性类似,可以获取整个元素,这样可以方便的操作元素

var MyComponent = React.createClass({

handleClick: function() {

// 使用原生的 DOM API 获取焦点

this.refs.myInput.focus();

},

render: function() {

// 当组件插入到 DOM 后,ref 属性添加一个组件的引用于到 this.refs

return (

type="button"

value="点我输入框获取焦点"

onClick={this.handleClick}

/>

);

}

});

ReactDOM.render(

,

document.getElementById('example')

);

I、在需要操作的元素上,绑定 ref 属性

II、通过 react 组件对象的 this.refs 获取绑定的这个属性

后续可以对获取的元素,进行操作

7、综合应用

I、通过 state 属性,实现双向数据绑定 - 针对表单

var HelloMessage = React.createClass({

getInitialState: function() {

return {value: 'Hello Runoob!'};

},

handleChange: function(event) {

this.setState({value: event.target.value});

},

render: function() {

var value = this.state.value;

return

{value}

;

}

});

ReactDOM.render(

,

document.getElementById('example')

);

a、通过原生事件 onchange 监听,指定监听函数 handleChange

b、在监听事件 中 调用 this.setState 更新绑定数据 (通过event可以获取各种数据)

II、通过 state 和 props 属性,实现 内层触发外层更新数据

var Content = React.createClass({

render: function() {

return

点我

{this.props.myDataProp}

}

});

var HelloMessage = React.createClass({

getInitialState: function() {

return {value: 'Hello Runoob!'};

},

handleChange: function(event) {

this.setState({value: '菜鸟教程'})

},

render: function() {

var value = this.state.value;

return

updateStateProp = {this.handleChange}>

;

}

});

ReactDOM.render(

,

document.getElementById('example')

);

a、通过原生事件 onClick 监听,指定监听函数 为外层传递来的 属性 this.props.updateStateProp

b、外层传递到内层的 属性 updateStateProp 指定为自身的监听事件 this.handleChange

c、外层监听事件 中 调用 this.setState 更新绑定数据 (通过event可以获取各种数据)

外层传递到内层的 属性 updateStateProp

III、结合 ajax 请求,更新UI

React 组件的数据可以通过 componentDidMount 方法中的 Ajax 来获取,当从服务端获取数据库可以将数据存储在 state 中,再用 this.setState 方法重新渲染 UI。

var UserGist = React.createClass({

getInitialState: function() {

return {

username: '',

lastGistUrl: ''

};

},

componentDidMount: function() {

this.serverRequest = $.get(this.props.source, function (result) {

var lastGist = result[0];

this.setState({

username: lastGist.owner.login,

lastGistUrl: lastGist.html_url

});

}.bind(this));

},

// 这里的 bind(this) 是因为 function 里面使用了 this.setState,此时的this 指针并没有指向外层的class对象,.bind()创建了一个新函数(原先函数的拷贝),当这个函数在被调用的时候,它的 this 关键词会被设置成被传入的值(这里指调用bind()时传入的参数)

componentWillUnmount: function() {

this.serverRequest.abort();

},

render: function() {

return (

{this.state.username} 用户最新的 Gist 共享地址:

{this.state.lastGistUrl}

);

}

});

ReactDOM.render(

{/* */}

,

mountNode

);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,809评论 1 18
  • 现在最热门的前端框架,毫无疑问是 React 。上周,基于 React 的 React Native 发布,结果一...
    sakura_L阅读 419评论 0 0
  • 目前,react组件有三种写法,分别是es5的createClass写法,es6的class写法,以及statel...
    ZoomFunc阅读 1,613评论 0 1
  • JSX 知识准备 JSX 并不是一门全新的语言,仅仅是一个语法糖,允许开发者在javascript中编写XML语言...
    艾伦先生阅读 4,494评论 4 20
  • “妈妈,我要妈妈!”秦云赶快过去,想抱住儿子。“妈妈在这,别怕!”“你不是我妈妈!我要妈妈!”子杰一边推开她一边大...
    就要马甲线阅读 343评论 0 1