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,{'\n'}
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); // 注册
.