对ReactJs的认知.

Slides:



Advertisements
Similar presentations
第 15 章 Mobile PHP 與 Ajax 15-1 Mobile PHP 15-2 Ajax 的基礎 15-2 Ajax 的基礎 15-3 jQuery 的 Ajax 方法 15-3 jQuery 的 Ajax 方法 15-4 應用實例:關鍵字建議清單 15-4 應用實例:關鍵字建議清單.
Advertisements

事件驱动的移动数据中心 广州舜飞信息科技有限公司 谭荣棉.
浅析浏览器解析和渲染 偏右.
第5章 HTML 標籤介紹.
2011年管理培训生 招聘.
JQuery Mobile 網頁切換 靜宜大學 資管系 楊子青.
网页制作 第一讲
动态网页制作 第1章 HTML语言1.
Web Programming 網際網路程式設計
JavaScript中常用的互動方式 認識簡單的交談與基本的運算.
第12讲 Javascript 复习 信息学院 孙辉.
年度校樹選拔秀 主辦單位:楊梅國小.
第8章 CSS基础知识 【学习目标】 对于一个网页设计者来说,对HTML语言一定不感到陌生,因为它是网页制作的基础,但是如果希望网页能够美观、大方,并且升级维护方便,那么仅仅知道HTML还是不够的,还需要了解CSS。了解CSS基础知识,可以为后面的学习打下基础。 本章主要内容包括: 为什么在网页中加入CSS。
P303 HTML/DHTML/CSS/JavaScript 專業HTML網頁設計 陳錦輝.
Css2/css3全教程 选择器 群号: 韬略课堂:何韬.
浏览器工作原理浅析 TID Ghostzhang.
第一讲 JavaScript编程基础 信息学院 周宝刚.
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
第3章 JavaScript语言基础.
《网页设计与制作》 教学课件 主讲人:湖南铁道职业技术学院 陈承欢
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
第三章 使用XMLHttpRequest对象
5.1 – 表格(FORM) 輸入元素 : 兩種傳遞方法 : GET or POST 範例 1. 文字欄位 Text box
第六章 操作浏览器窗口.
Ch07 PHP程式基礎 網頁程式設計.
Ajax编程技术 第十章 使用外部数据.
Hello World 體驗實作第一個JSP程式.
ASP VBScript 基础知识.
JQuery Mobile简介 唐瑶 Write less, do more.
DhtmlXGrid表格显示控件简介.
网络协会2017培训 恶补Web知识训练营 2017/4/7 – Payne.
Ajax编程技术 第一章 Ajax简介.
PHP 5 入門基礎 第一個PHP 程式 PHP 資料型態.
Cookie 存取Cookie Cookie有效時間 Session 存取Session session 函數
張智星 台大資工系 多媒體檢索實驗室 第五章 自訂函數 張智星 台大資工系 多媒體檢索實驗室.
JavaScript 语言3 学习网站:心蕊设计
本單元介紹何謂變數,及說明變數的宣告方式。
JavaScript 靜宜大學 資管系 楊子青.
十二年國民基本教育中等學校教師教學專業能力研習五堂課
前终端一体化开发解决方案 腾讯 lucaspei(裴伟).
网 站 设 计 与 建 设 Website design and developments
Cookie 存取Cookie Cookie有效時間 Session 存取Session session 函數
从渲染原理到性能优化.
A New Kind of JavaScript Library
2.2 Web界面设计 信息工程系 向模军 Tel: QQ:
JQuery Mobile简介 唐瑶 Write less, do more.
Open方法和close方法 主讲人:傅伟玉.
2013年5月 前端性能优化与模块化开发 李周全
第一個cordova project Cordova project建立與平台設定,均藉由cli(command line interface來完成 建立project請打開命令提示字元視窗應輸入下列命令 cordova create hello tw.edu.stust.mis.hello HelloWorld.
Ajax编程技术 第六章 调试与错误处理.
JQuery基礎與動畫、特效 靜宜大學 資管系 楊子青.
JQuery基礎與動畫、特效 靜宜大學 資管系 楊子青 網路參考資源:
Ch09 在網頁之間傳遞資訊 網頁程式設計.
主讲:陶建平 华中科技大学网络与计算中心
JavaScript Sunxiaoshen.
網站HOLMES DATA監測代碼.
UI 软件 设计 页面布局(一).
JavaScript 语言2 学习网站: 第 4 章 JavaScript 语言2 学习网站:
Action Script 使用介紹 第六組 張瀚之.
第3章 JavaScript基本语句.
JQuery Mobile基礎 (開發跨平台行動裝置網頁)
网 站 设 计 与 建 设 Website design and developments
Unity回傳統計資訊程式說明: 填寫回傳資訊網址(theUrl)。
JQuery 標籤操作 建國科技大學 資管系 饒瑞佶 2013/4 V1.
第二章 Java基本语法 讲师:复凡.
React.js.
知识分享:使用web写UI, 使用js对接C++项目, 提高开发效 率。
第6章 PHP基本語法介紹.
讀取網路資料及JSON開放資料 靜宜大學資管系 楊子青
JavaScript 教师:魏小迪
Presentation transcript:

对ReactJs的认知

一、ReactJS原理与组件化 React引入虚拟DOM的机制:基于React进行开发时所有的DOM构造都是通过虚拟DOM进行,每当数据变化时,React都会重新构建整个DOM树,然后React将当前整个DOM树和上一次的DOM树进行对比,得到DOM结构的区别,然后仅仅将需要变化的部分进行实际的浏览器DOM更新。 所谓组件,即封装起来的具有独立功能的UI部件。 React推荐以组件的方式去重新思考UI构成,将UI上每一个功能相对独立的模块定义成组件,然后将小的组件通过组合或者嵌套的方式构成大的组件,最终完成整体UI的构建。 React组件的特性:可重用性、可组合性、可维护性。

二、ReactJs使用 React不需要安装,直接到官网下载ReactJs即可。 一个完整使用例子: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello React!</title> <script src="http://static.runoob.com/assets/react/react-0.14.7/build/react.min.js"></script> <script src="http://static.runoob.com/assets/react/react-0.14.7/build/react-dom.min.js"></script> <script src="http://static.runoob.com/assets/react/browser.min.js"></script> </head> <body> <div id="example"></div> <script type="text/babel"> ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('example') ); </script> </body> </html>

react.js 、react-dom.js 和 Browser.js这三个库需先加载 react.js 是 React 的核心库,react-dom.js 是提供与 DOM 相关的功能,Browser.js 的作用是将 JSX 语法转为 JavaScript 语法,这一步很消耗时间,应该将它放到服务器完成。 凡是使用 JSX 的地方,都要加上 type="text/babel",JSX遇<开头用html规则解析,遇到{用Javascript规则解析。 var names=['alice','emily','kate']; ReactDOM.render( <div> { names.map(function(name){ return <div>Hello,{name}!</div> }) } </div>, document.getElementById('example') ); 模板转为html语言并插入DOM节点 ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('example') );

2.1 Hello World例子 <!DOCTYPE html> <html> <head> <script src="../build/react.js"></script> <script src="../build/react-dom.js"></script> <script src="../build/browser.min.js"></script> </head> <body> <div id="example"></div> <script type="text/babel"> ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('example') ); </script> </body> </html>

2.2 ReactJS组件 创建组件 React 允许将代码封装成组件,然后像插入普通 HTML 标签一样,在网页中插入这个组件。React.createClass 方法就用于生成一个组件类。 组件类首字母必须大写 组件类只能够包含一个顶层标签 组件类必须有自己的render方法,用于输出组件 组件属性用this.props获取(注:class要变为className,for变为htmlFor) 自定义属性用data-为前缀 var HelloWorld=React.createClass({ render:function(){ return <h1> Hello {this.props.name}</h1>; } }); ReactDOM.render( <HelloWorld name="Join" className="helloworld" />, document.getElementById('example') );

复合组件 创建多个组件来合成一个组件,即把组件的不同功能点进行分离 var WebSite = React.createClass({ render: function() { return ( <div> <Name name={this.props.name} /> <Link site={this.props.site} /> </div> ); } }); var Name = React.createClass({ <h1>{this.props.name}</h1> var Link = React.createClass({ <a href={this.props.site}> {this.props.site} </a> React.render( <WebSite name="hello" site="https://www.baidu.com/" />, document.getElementById('example') 创建多个组件来合成一个组件,即把组件的不同功能点进行分离

组件state state通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。只需更新组件的 state,然后根据新的 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 ( <p onClick={this.handleClick}> 你<b>{text}</b>我。点我切换状态。 </p> ); } }); React.render( <LikeButton />, document.getElementById('example') getInitialState 方法用于定义初始状态。通过 this.state 属性读取。当用户点击组件,导致状态变化,this.setState 方法就修改状态值,每次修改以后,自动调用 this.render 方法,再次渲染组件。

组件props state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。有些容器组件需要定义 state 来更新和修改数据, 而子组件只能通过 props 来传递数据。 var WebSite = React.createClass({ getInitialState: function() { return { name: "测试", site: "http://www.baidu.com" }; }, render: function() { return ( <div> <Name name={this.state.name} /> <Link site={this.state.site} /> </div> ); } }); React.render( <WebSite />, document.getElementById('example') 混合使用state跟props var HelloMessage = React.createClass({ render: function() { return <h1>Hello {this.props.name}</h1>; } }); ReactDOM.render( <HelloMessage name="Runoob" />, document.getElementById('example') ); 使用props var Name = React.createClass({ render: function() { return ( <h1>{this.props.name}</h1> ); } }); var Link = React.createClass({ <a href={this.props.site}> {this.props.site} </a> var HelloMessage = React.createClass({ getDefaultProps: function() { return { name: 'Runoob' }; }, render: function() { return <h1>Hello {this.props.name}</h1>; } }); ReactDOM.render( <HelloMessage />, document.getElementById('example') ); 使用state

组件设置默认值及验证 var Mytitle=React.crateClass({ propTypes:{title:React.propTypes.String.isRequired},//此可验证属性值是否符合要求 getDefaultProps:function(){ return {title:'hello world'}; //设置组件默认值 }, render:function(){ return <h1>{this.props.title}</h1>; } }); Props 验证使用 propTypes,它可以保证我们的应用组件被正确使用,React.PropTypes 提供很多验证器 (validator) 来验证传入数据是否有效。当向 props 传入无效数据时,JavaScript 控制台会抛出警告。

更多验证器 React.createClass({ propTypes: { // 可以声明 prop 为指定的 JS 基本数据类型,默认情况,这些数据是可选的 optionalArray: React.PropTypes.array, optionalBool: React.PropTypes.bool, optionalFunc: React.PropTypes.func, optionalNumber: React.PropTypes.number, optionalObject: React.PropTypes.object, optionalString: React.PropTypes.string, optionalNode: React.PropTypes.node, // 可以被渲染的对象 numbers, strings, elements 或 array optionalElement: React.PropTypes.element,// React 元素 optionalMessage: React.PropTypes.instanceOf(Message), // 用 JS 的 instanceof 操作符声明 prop 为类的实例。 optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),// 用 enum 来限制 prop 只接受指定的值。 optionalUnion: React.PropTypes.oneOfType([ React.PropTypes.string, React.PropTypes.number, React.PropTypes.instanceOf(Message) ]), // 可以是多个对象类型中的一个 optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number), // 指定类型组成的数组 optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),// 指定类型的属性构成的对象 optionalObjectWithShape: React.PropTypes.shape({ color: React.PropTypes.string, fontSize: React.PropTypes.number }),// 特定 shape 参数的对象 requiredFunc: React.PropTypes.func.isRequired, // 任意类型加上 `isRequired` 来使 prop 不可空。 requiredAny: React.PropTypes.any.isRequired, // 不可空的任意类型 customProp: function(props, propName, componentName) { if (!/matchme/.test(props[propName])) { return new Error('Validation failed!'); } }// 自定义验证器。如果验证失败需要返回一个 Error 对象。 });

组件API 设置状态:setState 替换状态:replaceState 设置属性:setProps 替换属性:replaceProps 强制更新:forceUpdate 获取DOM节点:findDOMNode 判断组件挂载状态:isMounted setState(object nextState[, function callback]) replaceState(object nextState[, function callback]) setProps(object nextProps[, function callback]) replaceProps(object nextProps[, function callback]) forceUpdate([function callback]) DOMElement findDOMNode() bool isMounted() replaceProps(object nextProps[, function callback]) nextProps,将要设置的新属性,该属性会替换当前的props。 callback,可选参数,回调函数。该函数会在replaceProps设置成功,且组件重新渲染后调用。 replaceProps()方法与setProps类似,但它会删除原有props forceUpdate([function callback]) callback,可选参数,回调函数。该函数会在组件render()方法调用后调用。 forceUpdate()方法会使组件调用自身的render()方法重新渲染组件,组件的子组件也会调用自己的render()。但是,组件重新渲染时,依然会读取this.props和this.state,如果状态没有改变,那么React只会更新DOM。 forceUpdate()方法适用于this.props和this.state之外的组件重绘(如:修改了this.state后),通过该方法通知React需要调用render() 一般来说,应该尽量避免使用forceUpdate(),而仅从this.props和this.state中读取状态并由React触发render()调用。 DOMElement findDOMNode() 返回值:DOM元素DOMElement 如果组件已经挂载到DOM中,该方法返回对应的本地浏览器 DOM 元素。当render返回null 或 false时,this.findDOMNode()也会返回null。从DOM 中读取值的时候,该方法很有用,如:获取表单字段的值和做一些 DOM 操作。 bool isMounted() 返回值:true或false,表示组件是否已挂载到DOM中 isMounted()方法用于判断组件是否已挂载到DOM中。可以使用该方法保证了setState()和forceUpdate()在异步场景下的调用不会出错。 setProps(object nextProps[, function callback]) nextProps,将要设置的新属性,该状态会和当前的props合并 callback,可选参数,回调函数。该函数会在setProps设置成功,且组件重新渲染后调用。 设置组件属性,并重新渲染组件。 props相当于组件的数据流,它总是会从父组件向下传递至所有的子组件中。当和一个外部的JavaScript应用集成时,我们可能会需要向组件传递数据或通知React.render()组件需要重新渲染,可以使用setProps()。 更新组件,我可以在节点上再次调用React.render(),也可以通过setProps()方法改变组件属性,触发组件重新渲染。 setState(object nextState[, function callback]) nextState,将要设置的新状态,该状态会和当前的state合并 callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。合并nextState和当前state,并重新渲染组件。setState是React事件处理函数中和请求回调函数中触发UI更新的主要方法。 不能在组件内部通过this.state修改状态,因为该状态会在调用setState()后被替换。 setState()并不会立即改变this.state,而是创建一个即将处理的state。setState()并不一定是同步的,为了提升性能React会批量执行state和DOM渲染。 setState()总是会触发一次组件重绘,除非在shouldComponentUpdate()中实现了一些条件渲染逻辑。 setState例子 var Counter = React.createClass({ getInitialState: function () { return { clickCount: 0 }; }, handleClick: function () { this.setState(function(state) { return {clickCount: state.clickCount + 1}; }); render: function () { return (<h2 onClick={this.handleClick}>点我!点击次数为: {this.state.clickCount}</h2>); } ReactDOM.render( <Counter />, document.getElementById('message') ); replaceState(object nextState[, function callback]) nextState,将要设置的新状态,该状态会替换当前的state。 callback,可选参数,回调函数。该函数会在replaceState设置成功,且组件重新渲染后调用。 replaceState()方法与setState()类似,但是方法只会保留nextState中状态,原state不在nextState中的状态都会被删除。

组件生命周期 组件的生命周期可分成三个状态: Mounting:已插入真实 DOM Updating:正在被重新渲染 var Button = React.createClass({ getInitialState: function() { return { data:0 }; }, setNewNumber: function() { this.setState({data: this.state.data + 1}) render: function () { return ( <div> <button onClick = {this.setNewNumber}>INCREMENT</button> <Content myNumber = {this.state.data}></Content> </div> ); } }); var Content = React.createClass({ componentWillMount:function() { console.log('Component WILL MOUNT!') componentDidMount:function() { console.log('Component DID MOUNT!') componentWillReceiveProps:function(newProps) { console.log('Component WILL RECIEVE PROPS!') shouldComponentUpdate:function(newProps, newState) { return true; }, componentWillUpdate:function(nextProps, nextState) { console.log('Component WILL UPDATE!'); componentDidUpdate:function(prevProps, prevState) { console.log('Component DID UPDATE!') componentWillUnmount:function() { console.log('Component WILL UNMOUNT!') render: function () { return ( <div> <h3>{this.props.myNumber}</h3> </div> ); } }); ReactDOM.render( <Button /> </div>, document.getElementById('example') 组件的生命周期可分成三个状态: Mounting:已插入真实 DOM Updating:正在被重新渲染 Unmounting:已移出真实 DOM 生命周期的方法有: componentWillMount 在渲染前调用,在客户端也在服务端。 componentDidMount : 在第一次渲染后调用,只在客户端。之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。 如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异部操作阻塞UI)。 componentWillReceiveProps 在组件接收到一个新的prop时被调用。这个方法在初始化render时不会被调用。 shouldComponentUpdate 返回一个布尔值。在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。 可以在你确认不需要更新组件时使用。 componentWillUpdate在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。 componentDidUpdate 在组件完成更新后立即调用。在初始化时不会被调用。 componentWillUnmount在组件从 DOM 中移除的时候立刻被调用

组件 AJAX React 组件的数据可以通过 componentDidMount 方法中的 Ajax 来获取,当从服务端获取数据库可以将数据存储在 state 中,再用 this.setState 方法重新渲染 UI。 当使用异步加载数据时,在组件卸载前使用 componentWillUnmount 来取消未完成的请求。 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)); componentWillUnmount: function() { this.serverRequest.abort(); render: function() { return ( <div> {this.state.username} 用户最新的 Gist 共享地址: <a href={this.state.lastGistUrl}>{this.state.lastGistUrl}</a> </div> ); } }); ReactDOM.render( <UserGist source="https://api.github.com/users/octocat/gists" />, document.body