组件
组件的定义、传参(props)、数据响应(State)、生命周期(liefCycle)、事件处理(Events)
- 任何 MVVM Js框架都离不开组件的概念,组件的使用、扩展、复用、独立性,构成了组件使用的优越及带来的便利
- 下面梳理了一个组件的定义,传参、数据响应,生命周期、事件处理的全过程
定义组件
React
定义组件最简单的方式是使用函数
- 亦可以使用
ES6 class
来继承、定义组件
- 组件的定义、使用,首字母都必须大写
Props
用来传递参数,要注意:Props
不能被更改
function Hello (props) {
return <h1>Hello, {props.name}</h1>
}
class Hello extends React.Component {
render () {
return <h1>Hello, {this.props.name}</h1>
}
}
复杂组件
class Welcome extends React.Component {
constructor (props) {
super(props)
this.state = {
school: '',
city: ''
}
}
componentDidMount () {
this.setState({
school: 'QingHua',
city: 'BeiJing'
})
}
componentWillMount () {
this.setState({
school: '',
city: ''
})
}
setSchool = (e) => {
this.setState({
school: e.target.value
})
}
resetSchool (school, e) {
this.setState({
school: school
})
}
render () {
return (
<div className={'react-comp'}>
<input type="text" value={this.state.school} onChange={this.setSchool}/>
<div>This is <b>{this.state.school}</b> : Welcome new student: <b>{this.props.student}</b></div>
<button onClick={this.resetSchool.bind(this, 'QingHua')}>reset</button> {/*函数的传递参数,一般使用 .bind(this. params) 来进行传递*/}
{/*props是通过属性传递*/}
</div>
)
}
}
注意事项
- state 不能直接使用 this.state.xx = yy 来进行更新,这样不会渲染组件
- 多个setState() 将会被合并成一个来调用,以此提高性能
- Props 是只读的,意味着它不能用来修改,这一点跟 vue 一致
- 由于 this.props 与this.state 可能是异步更新的,所以不能依靠它们来计算下一个状态,例如以下代码
this.setState({
counter: this.state.counter + this.props.increment
})
- 因为此时,counter 跟 increment 可能还在等待更新中,所以应采用下面这种方法
this.setState((prevState, props) => ({
counter: prevState.counter + props.increment
})
this.setState(function (prevState, props) {
return {
counter: prevState.counter + props.increment
}
})
- 在 react 中的事件绑定,如果直接定义函数并且调用,是取不到 this 指针对像的,如下
{
onClickEvt () {
this.setState(...)
}
render () {
return (<div onClick={onClickEvt}></div>)
}
}
{
constructor(){
this.onClickEvt = this.onClickEvt.bind(this)
}
onClickEvt = () => {}
render () {
return (
<div onClick={(e) => this.onClickEvt(e)}</div>
)
}
}
- 父组件或子组件都不能知道某个组件是有状态还是无状态,并且它们不应该关心某组件是被定义为一个函数还是一个类
- 这一点跟高内聚、低耦合的概念很相似,组件只依据传入的参数进行业务执行、并根据规则对外界反应
- 而不是通过一些属性暴露本身的状态
- 强调的是:数据自顶向下流动