State
- state是组件对象最重要的属性,值是对象(可以包含多个Key-value的组合)
- 组件被称为状态机,通过更新组件的state来更新对应的页面显示(重新渲染组件)
class MyComponent extends React.Component {
render(){
console.log(this)
return <h1>今天天气很炎热</h1>
}
}
// 渲染虚拟DOM到页面
ReactDOM.render(<MyComponent/>,document.getElementById("test"))
有状态的组件
除了使用外部数据(通过this.props访问)以外,组件还可以维护其内部的状态数据(通过this.state访问)。当组件的状态数据改变时,组件会再次调用render()方法重新渲染对应的标记。
绑定事件 - 解决类中this的指向问题
render中绑定的事件是作为onClick的回调,不是通过实例调用,类中的方法默认开启了局部的严格模式,如果直接打印类中方法的this为undefined。
<script type="text/babel">
class MyComponent extends React.Component {
constructor(props){
super(props)
this.state = {
content:'今天天气很炎热',
flag:true
}
this.clickFn = this.clickFn.bind(this)
}
render(){
console.log(this)
return <h1 onClick={this.clickFn}>{this.state.content}</h1>
}
clickFn(){
console.log(this.state)
}
}
// 渲染虚拟DOM到页面
ReactDOM.render(<MyComponent/>,document.getElementById("test"))
</script>
setState的使用
状态state不可以直接更改,需要借助setState来修改
<script type="text/babel">
class MyComponent extends React.Component {
constructor(props){
super(props)
this.state = {
content:'今天天气很炎热',
isHot:true
}
this.clickFn = this.clickFn.bind(this)
}
render(){
console.log(this)
return <h1 onClick={this.clickFn}>{this.state.content}</h1>
}
clickFn(){
let content = ''
let isHot = this.state.isHot
if(this.state.isHot){
content = '今天天气很炎热'
}else{
content= '今天天气很凉爽'
}
this.setState({
content:content,
isHot:!isHot
})
}
}
// 渲染虚拟DOM到页面
ReactDOM.render(<MyComponent/>,document.getElementById("test"))
</script>
简化代码
-
省略构造器,类中可以直接写赋值语句
-
类中函数使用箭头函数绑定在实例对象上
- 箭头函数没有自己得this,它的this是继承而来的,默认指向在定义它时所处的对象,此处指父级作用域
- 自定义方法——要用赋值语句的形式+箭头函数
class MyComponent extends React.Component {
// 类中可以直接写赋值语句
state={isHot:false,content:"今天天气很凉爽"}
render(){
return <h1 onClick={this.changeWeather}>{this.state.content}</h1>
}
// 使用箭头函数将方法绑定在实例对象上,箭头函数没有自己的this
// 自定义方法
changeWeather = ()=>{
let content = ''
let isHot = this.state.isHot // 此处的this是父级作用域
if(this.state.isHot){
content = '今天天气很炎热'
}else{
content= '今天天气很凉爽'
}
this.setState({
isHot:!isHot,
content:content
})
}
}
// 渲染虚拟DOM到页面
ReactDOM.render(<MyComponent/>,document.getElementById("test"))
总结
- 组件中render方法中的this为组件实例对象
- 组件自定义的方法中this为undefined:
- 强制绑定this,通过函数对象的bind()
- 箭头函数
- 状态数据,不能直接修改或者更新,通过this.setState()进行修改