一,基本格式
1,需要引入的文件
<!-- react核心库 -->
<script src="build/react.js"></script>
<!-- 提供与DOM相关的一些功能 -->
<script src="build/react-dom.js"></script>
<!-- 将JSX语法转换成javascript -->
<script src="build/browser.min.js"></script>
2,DOM节点
<!-- react渲染的模版内容会插入到这个节点中,作为一个容器 -->
<div id="container"></div>
3,JSX语法
在react开发中使用JSX,跟javascript不兼容,在使用JSX的地方,要设置type:text/babel
<script type="text/babel">
// 在此处编写react代码
</script>
JSX不是一门新的语言,是个语法(语法糖)
1,jsx必须借助React环境运行
2,jsx标签其实就是html标签,只不过我们在javascript中书写这些标签的时候,不使用“”括起来,可以像XML一样书写。
3,能够让我们更直观的看到组件的dom结构,不能直接在浏览器上运行,最终会转换成javascript代码。
js写法:
ReactDOM.render(
React.createElement("h1",null,"你好,react"),
document.getElementById("container")
)
JSX写法:
var text="aaa";
ReactDOM.render(
<h1>{text}</h1>,
document.getElementById("container")
)
在JSX中运行javascript代码,使用{}括起来 {表达式}4, ReactDOM.render()
React最基本的方法,用于将模版转换成HTML语言,渲染DOM,并插入制定的DOM节点中。
ReactDOM.render(
<h1>你好,react</h1>,
document.getElementById("container")
);
3个参数
第一个:模版的渲染内容(HTML形式)
第二个:这段模版需要插入的DOM节点(本程序中,是以ID为container的div节点)
第三个:渲染后的回调,一般不用
二,定义组件
1,组件格式
1>在react中创建的组件类以大写字母开头,驼峰命名发;
2>在React中使用React.createClass方法创建一个组件类;
3>核心代码:每个组件类都必须实现自己的render方法。输出定义号的组件模版;
4>注意:每个组件类只能包含一个顶层标签;
var HelloMessage = React.createClass({
render:function(){
return <h1>Hello react</h1>
}
});
ReactDOM.render(
//在模版中插入<HelloMessage />会自动生成一个实例
<HelloMessage />,
document.getElementById("container")
)
2,组件样式
1,内敛样式
2,对象样式
3,选择器样式
在react和html5在react和html5中设置样式的书写格式是有区别的
1,html5以‘;’结尾;react以‘,’结尾。
2,html5中key、value都不加引号;react中属于javascript对象,key的名字不能出现“-”,需要使用驼峰命名发。如果value为字符串,需要加引号。3,html5中,value如果是数字,需要带单位;react中不需要带单位。
<style media="screen">
.pStyle{
font-size: 20px;
}
</style>
在react中,如果要使用选择器样式设置组件样式时,属性名称不能使用class,需要使用className替换。类似的,用htmlFor代替for
// 创建设置h1样式对象
var HStyle= {
backgroundColor:"green",
color:"red"
}
var ShowMessage = React.createClass({
render:function(){
return (
// 里面对象,外面语法,不用单位
<div style={{backgroundColor:"yellow",borderWidth:5,borderColor:"blue",borderStyle:"solid"}}>
<h1 style={HStyle}>{this.props.firstRow}</h1>
<p className="pStyle">{this.props.secondRow}</p>
</div>
)
}
});
ReactDOM.render(
<ShowMessage firstRow='你好' secondRow='react'/>,
document.getElementById("container")
);
3,复合组件。
// 定义WebName
var WebName = React.createClass({
render:function(){
return <h1>百度</h1>;
}
});
// 定义WebLink组件
var WebLink = React.createClass({
render:function(){
return<a href="http://www.baidu.com">baidu</a>
}
});
var WebShow= React.createClass({
render:function() {
return(
<div>
<WebName />
<WebLink />
</div>
);
}
});
ReactDOM.render(
<WebShow />,
document.getElementById("container")
)
</script>
三,组件属性
1,props
props是组件自身的属性,一般用于潜逃的内外层组件中,负责传递信息(通常是父组件向子组件传递)。
注意:props对象中的属性与组件的属性一一对应,uyao直接去修改props中属性的值。
// 定义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="baidu" wlink="www.baidu.com" />,
document.getElementById("container")
)
2,...this.props
props提供的语法糖,可以将父组件的全部属性都复制给子组件。
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")
);
3,this.props.children
children是一个例外,不是跟组件的属性对应的显示组件的所有子节点
var ListComponent = React.createClass({
render:function(){
return(
<ul>
{
/* 列表项数量及内容不确定,在创建模版的时候才能确定
利用this.props.children从父组件获取需要展示的列表项内容
获取到列表项内容后,需要遍历children,逐项进行设置
使用React.Childern.map方法
返回值:数组对象。这里的数组中的元素是li
*/
React.Children.map(this.props.children,function(child){
// child是遍历得到的父组件的子节点
return <li>{child}</li>
})
}
</ul>
);
}
});
ReactDOM.render(
(
<ListComponent>
<h1>这是名字</h1>
<a>www.baidu.com</a>
</ListComponent>
),
document.getElementById("container")
)
4,属性验证 propTypes
组建类的属性,用于验证组件实例的属性是否复合要求。
var ShowTitle = React.createClass({
propTypes:{
//title数据类型必须为字符串类型
title:React.PropTypes.string.isRequired
},
render:function(){
return <h1>{this.props.title}</h1>
}
})
ReactDOM.render(
<ShowTitle title="a"/>,
document.getElementById("container")
)
5,getDefaultProps
设置组件属性的默认值
var MyTitle=React.createClass({
getDefaultProps:function (){
return{
title:"wyy"
}
},
render:function(){
return <h1>{this.props.title}</h1>
}
})
ReactDOM.render(
<MyTitle />,
document.getElementById("container")
)
四,表单
react中的事件名称,首字母小写,驼峰命名法。
var MyButton=React.createClass({
handleClick(){
alert("hehe")
},
render(){
return<button onClick={this.handleClick}>{this.props.buttonTitle}</button>
}
})
ReactDOM.render(
<MyButton buttonTitle="anniu"/>,
document.getElementById("container")
)
2,state 状态
与props一样,都是组件自身属性
var CheckButton=React.createClass({
//定义初始状态
getInitialState(){
return {
//在这个对象中设置的属性,将会存储在state中
//默认状态 未选中
isCheck:false
}
},
//定义事件绑定的方法
handleChange(){
//修改状态值,通过this.state读取设置的状态值
this.setState({
isCheck:!this.state.isCheck
})
},
render(){
//根据状态值设置显示的文字
//在JSX中不能直接使用if()else{},使用三目运算符
var text=this.state.isCheck?"已选中":"未选中";
return(
<div>
<input type="checkbox" onChange={this.handleChange} />
{text}
</div>
)
}
} )
ReactDOM.render(
<CheckButton />,
document.getElementById("container")
)
当state发生变化时,组件也会调用组件内部的render方法
定义个组件,当用户输入的时候,实时显示出来:
var InputText=React.createClass({
getInitialState(){
return{
value:"请输入"
};
},
toChange(event){
//通过event.target.value读取用户输入的值
this.setState({
value: event.target.value
});
},
render(){
var value=this.state.value;
return(
<div>
<input type="text" value={value} onChange={this.toChange}/>
<p>{value}</p>
</div>
)
}
})
ReactDOM.render(
<InputText />,
document.getElementById("container")
)
五,生命周期
1,三个状态:mounting:组件挂载,已插入真实DOM
updating:组件更新,正在被重新渲染
unmountong:组件移除,已移出真是DOM
2,四个阶段
创建、实例化、更新、销毁
六,生命周期相关方法
1,挂载相关方法:
(1)componentWillMount
组件即将要挂载。
在render之前执行,但仅执行一次,即使多次重复渲染该组件,或者改变了组件的state
(2)componentDidMount
组件已经挂载。在render之后执行,同一个组件重复渲染只执行一次
2,更新相关方法
(1)componentWillReceiveProps(object nextProps)
已加载组件受到新的props之前调用,注意组件初始化渲染时则不会执行
(2)shouldComponentUpdate(object nextProps,object nextState)
组件判断是否重新渲染时调用,该接口实际时在组件接收到了新的props或者新的state的时候会立即调用,然后通过
(3)componentWillUpdate(obkect nextProps,object nextState)
组件将要更新
(4)componentDidUpdate(object prevPorps,object prevState)
组件已经更新
3,组件移除相关方法。
componentWillUnmount
在组件要被移除之前的时间点触发。可以利用该方法来执行一些必要的清理组件将要移除
4,生命周期中与props和state相关:
(1)getDefaultProps 设置props属性默认值
(2)getInitialState 设置state属性初始值
5,生命周期各阶段 介绍
var Demo=React.createClass({
/*一,创建阶段
流程:
只调用getDefaultProps方法
*/
getDefaultProps(){
console.log("getDefaultProps");
return {};
},
/*
二,实例化阶段
流程:
getInitialState
componentWillMount
render
componentDidMount
*/
getInitialState(){
console.log("getInitialState");
return {};
},
componentWillMount(){
console.log("componentWillMount");
},
render(){
// 用来渲染并返回一个虚拟DOM
console.log("render:用来渲染并返回一个虚拟DOM");
return <div>生命周期</div>;
},
componentDidMount(){
/*
在render之后调用
在该方法中,react会使用render方法返回的虚拟DOM对象创建真实的DOM结构
可以在这个方法中读取DOM节点
*/
console.log("componentDidMount");
},
/*
三,更新流程
流程:
componentWillReceiveProps
shouldComponentUpdate 如果返回值时false,那么后面三个方法不执行
componentWillUpdate
render
componentDidUpdate
*/
componentWillReceiveProps(){
console.log("componentWillReceiveProps");
},
shouldComponentUpdate(){
console.log("shouldComponentUpdate");
return true
},
componentWillUpdate(){
console.log("componentWillUpdate");
},
componentDidUpdate(){
console.log("componentDidUpdate");
},
/*
四,销毁阶段
流程:
componentWillUnmount
*/
componentWillUnmount(){
console.log("componentWillUnmount");
}
})
//第一次创建并加载组件
ReactDOM.render(
<Demo />,
document.getElementById("container")
);
//重新渲染组件
ReactDOM.render(
<Demo />,
document.getElementById("container")
)
//移除组件
ReactDOM.unmountComponentAtNode(document.getElementById("container"));