index.html
main.js
import React from "react";
import {render} from "react-dom";
import App from "./App.js";
render(
,
document.getElementById("app_wrap")
)
App.js
import React from "react";
class App extends React.Component{
render() {
return hello
}
}
export default App;
main.js
import React from "react";
import {render} from "react-dom";
import App from "./App.js";
//ES6形式定义组件的调用
render(
,
document.getElementById("app_wrap")
);
App.js
import React from "react";
//ES6形式定义组件
class App extends React.Component{
//类中定义的函数
haha(lanmu) {
if(lanmu="篮球") {
return (
- 乔丹
- 科比
- 沃尔
);
} else if(lanmu="足球") {
return (
- djfh
- dsfs
- fhyg
);
}
};
render() {
//render中定义的函数
let xixi = () => {
return(
我是render中定义的函数:1+1={1+1}
);
}
//设置样式:方法二
let mystyle = {
"width":"600px",
"height":20+200+"px",
"backgroundColor":"gray",
"margin":"10px auto"
}
//数组:要求有key属性,属性值不能重复
let domarr = [
数组元素1
,
数组元素2
,
数组元素3
];
let arr = ["白板","妖姬","二手"].map((item,index)=>{
return {item}
});
return (
hello
北京时间:{this.props.date.toLocaleDateString()}
{/*调用类中的函数:加this*/}
{this.haha("篮球")}
{/*调用render中的函数*/}
{xixi()}
{/*设置样式:方法一*/}
{/*设置样式:方法二*/}
{/*react数组(含有DOM)自动展开*/}
{domarr}
{arr}
);
}
}
export default App;
只有这三兄弟才会引发virtual DOM 的改变,从而改变DOM.
show.js
import React from "react";
import {render} from "react-dom";
//连接State.js(状态)
import State from "./State.js";
render(
,
document.getElementById("state")
)
state.js
import React from "react";
class State extends React.Component{
//构造函数:初始化状态
constructor() {
super();//要求调用super
this.state = {//定义state
a:100
}
}
add() {
this.setState({//改变state。改变a的值,只能用this.setState
a: this.state.a + 1 //不能写成++
})
}
render() {
return (
{this.state.a}{/* 使用state */}
)
}
}
export default State;
安装prop-types:cnpm install --save-dev prop-types
show.js
import React from "react";
import {render} from "react-dom";
//连接Props.js(父组件数据传递给子组件)import Props from "./Props.js";
render(
,
document.getElementById("props")
)
import React from "react";
import Props2 from "./Props2.js";
class Props extends React.Component{
constructor() {
super();
}
render() {
return (
);
}
}
export default Props;
props2.js
import React from "react";
//引入PropTypes验证props的有效性
import {PropTypes} from "prop-types";
class Props2 extends React.Component{
constructor(param) {
super();
// alert(param.name);//构造函数中的参数param.name传入的是this.props.name
this.state = {
num:param.num //将param.name的值传给this.state.name,所以最终是将this.props.name值传给this.state.name
}
}
render() {
return (
复合组件:我是{this.props.name}
{/* this.props是固定的,调用时属性为name,打印出name的属性值 */}
{/* props只能打印不能更改,数据是单向的 */}
{/* state能改变数据 */}
this.props.num为:{this.props.num}
this.state.num为:{this.state.num}
{/* 调用this.state.num,值与上方相同 */}
{this.setState({num:this.state.num + 1})}}/>
{/* 点击后this.state.num改变,this.props.num不变 */}
);
}
}
//组件传入的参数验证:当调用时没传入或传错类型name和num值时报错
//类名.propTypes
Props2.propTypes = {
name:PropTypes.string.isRequired,
num:PropTypes.number.isRequired
}
export default Props2;
show.js
//连接PropsReverse.js 子组件改变父组件数据(后期用redux代替)
import PropsReverse from "./PropsReverse.js";
render(
,
document.getElementById("propsReverse")
)
PropsReverse.js
//子组件改变父组件数据(后期用redux代替)
import React from "react";
import PropsReverse2 from "./PropsReverse2.js";
class PropsReverse extends React.Component{
constructor() {
super();
this.state={
a:1
}
}
setA(number) {
this.setState({'a':number});
}
render() {
return (
我是PropsReverse父组件,我有一个a状态:{this.state.a}
);
}
}
export default PropsReverse;
PropsReverse2.js
import React from "react";
class PropsReverse2 extends React.Component {
constructor() {
super();
}
render() {
return (
子组件收到父组件数据:{this.props.a}
{this.props.setA(this.props.a+1)}} />
);
}
}
export default PropsReverse2;
show.js
import React from "react";
import {render} from "react-dom";
//连接Yeye.js
import Yeye from "./Yeye.js";
render(
,
document.getElementById("yeye")
)
Yeye.js
import React from "react";
import Baba from "./Baba.js";
import {PropTypes} from "prop-types";
class Yeye extends React.Component{
constructor() {
super();
this.state = {
a:10
}
}
addA() {
this.setState({
a: this.state.a+1
})
}
render() {
return (
我是爷爷{this.state.a}
{/* 改变爷爷数据值时,孙子接受爷爷的数据值也跟着改变 */}
);
}
//获取家族共享的数据,并设置其值
getChildContext() {
return {
a:this.state.a
}
}
}
//家族共享数据的类型和要求
Yeye.childContextTypes = {
a:PropTypes.number.isRequired
}
export default Yeye;
Baba.js
import React from "react";
import Sunzi from "./Sunzi.js";
//引入PropTypes验证props的有效性
// import {PropTypes} from "prop-types";
class Baba extends React.Component{
constructor() {
super();
}
render() {
return (
我是爸爸
);
}
}
export default Baba;
Sunzi.js
import React from "react";
import {PropTypes} from "prop-types";
class Sunzi extends React.Component{
constructor() {
super();
}
render() {
return (
我是孙子
通过context取得爷爷是数据:{this.context.a}
);
}
}
//获取家族共享数据
Sunzi.contextTypes = {
a:PropTypes.number
}
export default Sunzi;
Yeye.js
import React from "react";
import Baba from "./Baba.js";
import {PropTypes} from "prop-types";
class Yeye extends React.Component{
constructor() {
super();
this.state = {
a:10
}
}
addA() {
this.setState({
a: this.state.a+1
})
}
render() {
return (
我是爷爷{this.state.a}
{/* addA自己使用,改变爷爷数据值时,孙子接受爷爷的数据值也跟着改变 */}
);
}
//获取家族共享的数据,并设置其值
getChildContext() {
return {
a:this.state.a,
addA:(this.addA).bind(this) //将addA共享给后代
}
}
}
//家族共享数据的类型和要求
Yeye.childContextTypes = {
a:PropTypes.number.isRequired,
addA:PropTypes.func.isRequired
}
export default Yeye;
Sunzi.js
import React from "react";
import {PropTypes} from "prop-types";
class Sunzi extends React.Component{
constructor() {
super();
}
render() {
return (
我是孙子
通过context取得爷爷是数据:{this.context.a}
);
}
}
//获取家族共享数据
Sunzi.contextTypes = {
a:PropTypes.number,
addA:PropTypes.func
}
export default Sunzi;
Realoutput.js
import React from "react";
class Realoutput extends React.Component{
constructor(props) {
super();
this.state = {
txt:"hello"
}
}
change(event) {
this.setState({
txt:event.target.value
})
}
render() {
return (
{this.state.txt}
);
}
}
export default Realoutput;
Ref.js
//ref:DOM钩子
import React from "react";
class Ref extends React.Component{
constructor() {
super();
}
render() {
return (
this.refs.mybox.style.backgroundColor="yellow"} />
);
}
}
export default Ref;