1.react 基础 (创建组件及在浏览器上渲染组件)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 1.react.js是React的核心库 --> <script src="js/react.min.js" charset="utf-8"></script> <!-- 2.react-dom.js的作用是提供与DOM相关的功能 --> <script src="js/react-dom.min.js" charset="utf-8"></script> <!-- 3.browser.min.js的作用是将JSX语法转换成JavaScript语法 --> <script src="js/browser.min.js" charset="utf-8"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js" charset="utf-8"></script> --> </head> <body> <!-- 6.React渲染的模板内容会插入到这个DOM节点中,作为一个容器 --> <div id="container"> </div> </body> <!-- 4.在React开发中,使用JSX,跟JavaScript不兼容,在使用JSX的地方,要设置type:text/babel --> <!-- 5.babel是一个转换编译器,ES6转成可以在浏览器中运行的代码 --> <script type="text/babel"> // 7.在此处编写React代码 // 8.需求:渲染一行标题,显示"Hello React" // /* ReactDOM.render() React的基本方法,用于将模板转换成HTML语言,渲染DOM,并插入指定的DOM节点中 3个参数 第一个:模板的渲染内容(HTML形式) 第二个:这段模板需要插入的DOM节点(本程序中,是id为container的div节点) 第三个:渲染后的回调,一般不用 */ // ReactDOM.render( // <h1>Hello React</h1>, // document.getElementById("container") // ); /* JSX入门 JSX不是一门新的语言,是个语法(语法糖) */ // 1.JSX必须借助React环境运行 // 2.JSX标签其实就是HTML标签,只不过我们在JavaScript中书写这些标签的时候,不用使用""括起来, // 可以像XML一样书写 ReactDOM.render( <h1> Hello React </h1>, document.getElementById("container") ); // 3.转换:JSX语法能够让我们更直观的看到组件的DOM结构,不能直接在浏览器上运行,最终会转化成JavaScript代码执行 ReactDOM.render( React.createElement("h1",null,"Hello React"), document.getElementById("container") ); // 4.在JSX中运行JavaScript代码 // 使用{}括起来 {表达式} // var text = "百度"; ReactDOM.render( <h1>{text}</h1>, document.getElementById("container") ); // 5.例如:属性、设置样式、事件绑定 </script> </html>
2.设置组件样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 1.react.js是React的核心库 --> <script src="js/react.min.js" charset="utf-8"></script> <!-- 2.react-dom.js的作用是提供与DOM相关的功能 --> <script src="js/react-dom.min.js" charset="utf-8"></script> <!-- 3.browser.min.js的作用是将JSX语法转换成JavaScript语法 --> <script src="js/browser.min.js" charset="utf-8"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js" charset="utf-8"></script> --> <style> .pStyle { font-size: 20px; } </style> </head> <body> <!-- 6.React渲染的模板内容会插入到这个DOM节点中,作为一个容器 --> <div id="container"> </div> </body> <!-- 4.在React开发中,使用JSX,跟JavaScript不兼容,在使用JSX的地方,要设置type:text/babel --> <!-- 5.babel是一个转换编译器,ES6转成可以在浏览器中运行的代码 --> <script type="text/babel"> // 7.在此处编写React代码 /* 创建一个组件类,用于输出Hello React 1.React中创建的组件类以大写字母开头,驼峰命名法 2.在React中使用React.createClass方法创建一个组件类 3.核心代码:每个组件类都必须实现自己的render方法。输出定义好的组件模板。返回值:null、false、组件模板 4.注意:组件类只能包含一个顶层标签 */ // var HelloMessage = React.createClass({ // render:function(){ // return <h1>Hello React</h1>; // } // }); // // 渲染 // ReactDOM.render( // // 在模板中插入<HelloMessage />会自动生成一个实例 // <HelloMessage />, // document.getElementById("container") // ); /* 设置组件的样式,三种: 1.内联样式 2.对象样式 3.选择器样式 注意:在React和HTML5中设置样式时的书写格式是有区别的 * 1.HTML5以 ; 结尾 React以 , 结尾 * 2.HTML5中key、value都不加引号 React中属于JavaScript对象,key的名字不能出现"-",需要使用驼峰命名法(例:backgroundColor)。如果value为字符串,需要加引号。 * 3.HTML5中,value如果是数字,需要带单位 React中不需要带单位 * 我们定义一个组件类,同时使用三种设置组件样式的方式 * 需求:定义一个组件,分为上下两行显示内容 * <div> 内联样式:设置背景颜色,边框大小,边框颜色 * <h1></h1> 对象样式:设置背景颜色,字体颜色 * <p></p> 选择器样式:设置字体大小 * </div> * * class 和 for 是React中的保留字 * 注意:在React中使用选择器样式设置组件样式时,属性名不能使用class,需要使用className替换。 * 类似的:使用htmlFor替换for */ // 创建设置h1样式对象 var hStyle = { backgroundColor:"green", color:"red" } // 创建组件 通过this.props传值 var ShowMessage = React.createClass({ render:function() { return ( // 外面的{}是JSX语法,里面的{}表示对象 <div style={{backgroundColor:"yellow",borderWidth:5,borderColor:"black",borderStyle:"solid"}}> <h1 style={hStyle}>{this.props.firstRow}</h1> <p className="pStyle">{this.props.secondRow}</p> </div> ); } }); ReactDOM.render( <ShowMessage firstRow="你好" secondRow="世界" />, document.getElementById("container") ); </script> </html>
3.复合组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 1.react.js是React的核心库 --> <script src="js/react.min.js" charset="utf-8"></script> <!-- 2.react-dom.js的作用是提供与DOM相关的功能 --> <script src="js/react-dom.min.js" charset="utf-8"></script> <!-- 3.browser.min.js的作用是将JSX语法转换成JavaScript语法 --> <script src="js/browser.min.js" charset="utf-8"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js" charset="utf-8"></script> --> </head> <body> <!-- 6.React渲染的模板内容会插入到这个DOM节点中,作为一个容器 --> <div id="container"> </div> </body> <!-- 4.在React开发中,使用JSX,跟JavaScript不兼容,在使用JSX的地方,要设置type:text/babel --> <!-- 5.babel是一个转换编译器,ES6转成可以在浏览器中运行的代码 --> <script type="text/babel"> // 7.在此处编写React代码 /* 复合组件 也被称为组合组件,创建多个组件合成一个组件。 */ /* 定义一个组件WebShow。功能:输出网站的名字和网址,网址是一个可以点击的链接。 分析:定义一个组件WebName负责输出网站名字,定义组件WebLink显示网站的网址,兵器可以点击 */ // 定义WebName组件 var WebName = React.createClass({ render:function() { return <h1>百度</h1>; } }); // 定义WebLink组件 var WebLink = React.createClass({ render:function() { return <a href="http://www.baidu.com">http://www.baidu.com</a>; } }); // 定义复合组件 WebShow var WebShow = React.createClass({ render:function() { return ( // 嵌套组件 <div> <WebName /> <WebLink /> </div> ); } }); // 将组件类WebShow渲染到网页上 ReactDOM.render( <WebShow />, document.getElementById("container") ); </script> </html>
4.props 传值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 1.react.js是React的核心库 --> <script src="js/react.min.js" charset="utf-8"></script> <!-- 2.react-dom.js的作用是提供与DOM相关的功能 --> <script src="js/react-dom.min.js" charset="utf-8"></script> <!-- 3.browser.min.js的作用是将JSX语法转换成JavaScript语法 --> <script src="js/browser.min.js" charset="utf-8"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js" charset="utf-8"></script> --> </head> <body> <!-- 6.React渲染的模板内容会插入到这个DOM节点中,作为一个容器 --> <div id="container"> </div> </body> <!-- 4.在React开发中,使用JSX,跟JavaScript不兼容,在使用JSX的地方,要设置type:text/babel --> <!-- 5.babel是一个转换编译器,ES6转成可以在浏览器中运行的代码 --> <script type="text/babel"> // 7.在此处编写React代码 /* props、state props是组件自身的属性,一般用于嵌套的内外层组件中,负责传递信息(通常是由父层组件向子层组件传递) 注意:props对象中属性与组件的属性一一对应,不要直接去修改props中属性的值 */ /* 定义一个组件WebShow。功能:输出网站的名称和地址,网址是一个可以点击的链接 分析:定义一个组件WebName负责输出网站名字,定义组件WebLink显示网站的网址,并且可以点击 思路: 1.给WebShow设置两个属性,wname,wlink 2.WebShow的props对象增加了两个属性值 3.WebName从WebShow的props对象中获取wname的值,即网站的名称。 */ // 定义WebName var WebName = React.createClass({ render:function() { return <h1>{this.props.webname}</h1>; } }); // 定义WebLink var WebLink = React.createClass({ render:function() { return <a href={this.props.weblink}>{this.props.weblink}</a>; } }); // 定义WebShow var WebShow = React.createClass({ render:function() { return ( <div> <WebName webname={this.props.wname} /> <WebLink weblink={this.props.wlink} /> </div> ); } }); // 渲染 ReactDOM.render( <WebShow wname="百度" wlink="http://www.baidu.com" />, document.getElementById("container") ); /* ...this.props props提供的语法糖,可以将父组件中的全部属性都复制给子组件 需求:定义一个组件Link,Link组件中只包含一个<a>,我们不给<a>设置任何属性,所有属性全部从父组件复制得到 */ var Link = React.createClass({ render:function(){ return <a {...this.props}>{this.props.name}</a>; } }); ReactDOM.render( <Link href="http://www.baidu.com" name="百度" />, document.getElementById("container") ); /* this.props.children children是一个例外,不是跟组件的属性对应的。 表示组件的所有子节点 HTML5中有一种标签:列表<ul> <ol> <li> 定义一个列表组件,列表项中显示的内容,以及列表项的数量都由外部决定 */ var ListComponent = React.createClass({ render:function() { return ( <ul> { /* 列表项数量以及内容不确定,在创建模板时才能确定 利用this.props.children从父组件获取需要展示的列表项内容 获取到列表项内容后,需要遍历children,逐项进行设置 使用React.Children.map方法 返回值:数组对象。这里数组中的元素是<li> */ React.Children.map(this.props.children, function(child) { // child是遍历得到的父组件的子节点 return <li>{child}</li> }) } </ul> ); } }); ReactDOM.render( ( <ListComponent> <h1>百度</h1> <a href="http://www.baidu.com">http://www.baidu.com</a> </ListComponent> ), document.getElementById("container") ); /* 属性验证 propTypes 组件类的属性 用于验证组件实例的属性是否符合要求 */ var ShowTitle = React.createClass({ propTypes: { // title 数据类型必须为字符串 title: React.PropTypes.string.isRequired }, render:function() { return <h1>{this.props.title}</h1> } }); ReactDOM.render( <ShowTitle title="123" />, document.getElementById("container") ); /* 设置组件属性的默认值 通过实现组件的getDefaultProps方法,对属性设置默认值 */ var MyTitle = React.createClass({ getDefaultProps:function() { return { title:"百度" } }, render:function() { return <h1>{this.props.title}</h1>; } }); ReactDOM.render( <MyTitle />, document.getElementById("container") ); </script> </html>
5.state管理 及 事件绑定
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 1.react.js是React的核心库 --> <script src="js/react.min.js" charset="utf-8"></script> <!-- 2.react-dom.js的作用是提供与DOM相关的功能 --> <script src="js/react-dom.min.js" charset="utf-8"></script> <!-- 3.browser.min.js的作用是将JSX语法转换成JavaScript语法 --> <script src="js/browser.min.js" charset="utf-8"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js" charset="utf-8"></script> --> </head> <body> <!-- 6.React渲染的模板内容会插入到这个DOM节点中,作为一个容器 --> <div id="container"> </div> </body> <!-- 4.在React开发中,使用JSX,跟JavaScript不兼容,在使用JSX的地方,要设置type:text/babel --> <!-- 5.babel是一个转换编译器,ES6转成可以在浏览器中运行的代码 --> <script type="text/babel"> // 7.在此处编写React代码 /* 事件处理 react中的事件名称,首字母小写,驼峰命名法 案例:定义组件,组件中包含一个button,给button绑定onClick事件 */ var MyButton = React.createClass({ handleClick:function(){ alert("点击按钮触发的效果"); }, render:function(){ return ( <button onClick={this.handleClick}>{this.props.buttonTitle}</button> ); } }); ReactDOM.render( <MyButton buttonTitle="按钮" />, document.getElementById("container") ); /* state 状态 props 组件自身的属性 this.state */ // 需求:创建一个CheckButton的组件,包含一个checkbox类型 <input> // 复选框在选中和未选中两种状态下会显示不同的文字。即根据状态渲染。 var CheckButton = React.createClass({ // 定义初始状态 getInitialState:function() { return { // 返回的是一个对象 里面包含设置的状态 和 初始值 // 在这个对象中设置的属性,将会储存在state中 // 默认状态,未选中 isCheck: false } }, // 定义事件绑定的方法 handleChange:function() { // 修改状态值,通过this.state读取设置的状态值 this.setState({ isCheck:!this.state.isCheck }); }, render:function(){ // 根据状态值,设置显示的文字 // 注:在JSX语法中,不能直接使用if else,使用三目运算符 var text = this.state.isCheck ? "已选中" : "未选中"; return ( <div> <input type="checkbox" onChange={this.handleChange} /> {text} </div> ); } }); ReactDOM.render( <CheckButton />, document.getElementById("container") ); /* 需求:定义一个组件,将用户在输入框内输入的内容进行实时显示 分析: 组件与用户交互过程中,存在状态的变化,即输入框的值 */ var Input = React.createClass({ getInitialState:function() { return { value:"请输入" }; }, handleChange:function(event) { // 通过event.target.value读取用户输入的值 this.setState({ value: event.target.value }); }, render:function() { var value = this.state.value; return ( <div> <input type="text" value={value} onChange={this.handleChange} /> <p>{value}</p> </div> ); } }); ReactDOM.render( <Input />, document.getElementById("container") ); </script> </html>
6.react 生命周期
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 1.react.js是React的核心库 --> <script src="js/react.min.js" charset="utf-8"></script> <!-- 2.react-dom.js的作用是提供与DOM相关的功能 --> <script src="js/react-dom.min.js" charset="utf-8"></script> <!-- 3.browser.min.js的作用是将JSX语法转换成JavaScript语法 --> <script src="js/browser.min.js" charset="utf-8"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js" charset="utf-8"></script> --> </head> <body> <!-- 6.React渲染的模板内容会插入到这个DOM节点中,作为一个容器 --> <div id="container"> </div> </body> <!-- 4.在React开发中,使用JSX,跟JavaScript不兼容,在使用JSX的地方,要设置type:text/babel --> <!-- 5.babel是一个转换编译器,ES6转成可以在浏览器中运行的代码 --> <script type="text/babel"> // 7.在此处编写React代码 /* 生命周期介绍: 1.组件的生命周期可分成三个状态: Mounting:组件挂载,已插入真实 DOM Updating:组件更新,正在被重新渲染 Unmounting:组件移出,已移出真实 DOM 2.组件的生命周期可分成四个阶段: 创建、实例化、更新、销毁 3.网页新闻列表页面 */ /* 1.Mounting/组件挂载相关: (1) componentWillMount 组件将要挂载。在render之前执行,但仅执行一次,即使多次重复渲染该组件,或者改变了组件的state (2) componentDidMount 组件已经挂载。在render之后执行,同一个组件重复渲染只执行一次 2.Updating/组件更新相关: (1) componentWillReceiveProps(object nextProps) 已加载组件收到新的props之前调用,注意组件初始化渲染时则不会执行 (2) shouldComponentUpdate(object nextProps,object nextState) 组件判断是否重新渲染时调用。该接口实际是在组件接收到新的 props 或者新的 state 的时候 会立即调用,然后通过 (3) componentWillUpdate(object nextProps,object nextState) 组件将要更新 (4) componentDidUpdate(object prevProps,object prevState) 组件已经更新 3.Unmounting/组件移除相关: (1) componentWillUnmount 在组件要被移除之前的时间点触发,可以利用该方法来执行一些必要的清理组件将要移除 4.生命周期中与props和state相关: (1) getDefaultProps 设置props属性默认值 (2) getInitialState 设置state属性初始值 */ /* 生命周期各阶段介绍 */ var Demo = React.createClass({ /* 一、创建阶段 流程: 只调用getDefaultProps方法 */ getDefaultProps:function() { // 在创建类的时候被调用,设置this.props的默认值 console.log("getDefaultProps--创建组件,设置this.props默认值"); return {} }, /* 二、实例化阶段 流程: getInitialState componentWillMount render componentDidMount */ getInitialState:function() { // 设置this.state的默认值 console.log("getInitialState--实例化组件,设置this.state的默认值"); return null; }, componentWillMount:function() { // 在render之前调用 console.log("componentWillMount--组件将要挂载"); }, render:function() { // 渲染并返回一个虚拟DOM console.log("render--渲染组件"); return <div>Hello React</div> }, componentDidMount:function() { // 在render之后调用 // 在该方法中,React会使用render方法返回的虚拟DOM对象创建真实的DOM结构 // 可以在这个方法中读取DOM节点 console.log("componentDidMount--组件已经挂载"); }, /* 三、更新阶段 流程: componentWillReceiveProps shouldComponentUpdate 如果返回值是false,后三个方法不执行 componentWillUpdate render componentDidUpdate */ componentWillReceiveProps:function() { console.log("componentWillReceiveProps--已加载组件收到新的props之前调用"); }, shouldComponentUpdate:function() { // 是否需要更新 console.log("shouldComponentUpdate--组件判断是否重新渲染时调用"); return true; }, componentWillUpdate:function() { console.log("componentWillUpdate--组件将要更新"); }, componentDidUpdate:function() { console.log("componentDidUpdate--组件已经更新"); }, /* 四、销毁阶段 流程: componentWillUnmount */ componentWillUnmount:function() { console.log("componentWillUnmount--在组件要被移除之前的时间点触发"); } }); // 第一次创建并加载组件 ReactDOM.render( <Demo />, document.getElementById("container") ); // 重新渲染组件 ReactDOM.render( <Demo />, document.getElementById("container") ); // 移除组件 ReactDOM.unmountComponentAtNode(document.getElementById("container")); </script> </html>
7.index.android.js 详解
/** * Sample React Native App * https://github.com/facebook/react-native * @flow */ /* 第一部分 导入ReactNative包,导入ReactNative组件 AppRegistry: JS运行所有ReactNative应用的入口。 StyleSheet:ReactNative中使用的样式表,类似CSS样式表 各种开发中需要使用的组件 模板中使用的是ES6语法,ES5语法如下: let React = require("react-native"); let { AppRegistry, StyleSheet, Text, View } = React; require函数,搜索目录加载文件 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from 'react-native'; /* 第二部分 创建ReactNative组件 模板中使用的是ES6语法, render() {} 是ES6中的函数简写 ES5语法如下: var Market = React.createClass({ render:function(){ return {}; } }); */ export default class Market extends Component { // 继承market这个类 render() { return ( <View style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> <Text style={styles.instructions}> To get started, edit index.android.js </Text> <Text style={styles.instructions}> Double tap R on your keyboard to reload,{' '} Shake or press menu button for dev menu </Text> </View> ); } } /* 第三部分 StyleSheet.create创建样式实例 在应用中只会被创建一次,不用每次在渲染周期中重新创建 */ const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, }); /* 第四部分 注册入口组件 AppRegistry:负责注册运行ReactNative应用程序的JavaScript入口 registerComponent注册应用程序的入口组件。告知ReactNative哪一个组件被注册为应用的根容器 第二个参数使用了ES6语法,箭头函数: () => Market 返回的必须是定义的组件类的名字 等价于 function() {return Market} */ AppRegistry.registerComponent('Market', () => Market); // 注册
.