总结
Component:React最大的好处就是组件编程,组件可以嵌套和循环。
JSX:JSX
Props:用来在组件间传递数据的,这里的数据传递是单向的,只能从父组件向子组件传递。
State:用来管理组件状态的,通过setState改变状态后,组件会自动调用render函数重新渲染。由于this.props
和 this.state
都用于描述组件的特性,可能会产生混淆。一个简单的区分方法是,this.props
表示那些一旦定义,就不再改变的特性,而this.state
是会随着用户互动而产生变化的特性。
事件响应:组件内的事件响应很简单,比如鼠标点击事件,加个onClick={this.***}}然后在***里响应就可以了。但是如果父组件需要知晓子组件的事件怎么办呢,父组件可以通过props传递个callback函数给子组件,这样就可以处理子组件的事件了
例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="https://unpkg.com/react@latest/dist/react.js"></script>
<script src="https://unpkg.com/react-dom@latest/dist/react-dom.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
<style type="text/css">
table{ border-collapse: collapse; border: 1px solid #000; width: 600px; margin: 20px auto; }
th,td{ border: 1px solid #000; }
tbody .active{ background-color: skyblue; }
</style>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
var namelist=[
{
id: 1,
name: "Emma",
gender: "female"
},
{
id: 2,
name: "Jerry",
gender: "male"
},
{
id: 3,
name: "Loura",
gender: "female"
}
];
var Bodylist = React.createClass({
getInitialState: function(){
return {ischecked:false};
},
toggle: function(e){
this.setState({ ischecked:e.target.checked });
},
render: function(){
return(
<tbody>
<tr className={this.state.ischecked ? 'active' : ''}>
<td>{this.props.user.name}</td>
<td>{this.props.user.gender}</td>
<td><input type="checkbox" onClick={this.toggle} /></td>
</tr>
</tbody>
);
}
});
var Toplist = React.createClass({
render: function(){
return(
<table>
<caption>组件的嵌套</caption>
<thead>
<tr><th>name</th><th>gender</th></tr>
</thead>
{
namelist.map(function(user){
return(<Bodylist user={user} key={user.id} />);
})
}
</table>
);
}
});
ReactDOM.render(
<Toplist/>,
document.getElementById("example")
)
</script>
</body>
</html>
namelist模拟后台的数据传递到虚拟dom中,组件嵌套使用,通过tihis.state.{***}传递表格某一行是否被勾选的状态,如果被勾选,对应行背景为蓝色