状态 state

state状态又称为数据,是组件内部私有的数据,只能在组件内部使用

初始化state

  1. class Abc extends React.Component{
  2. constructor(){
  3. super()
  4. // 初始化state
  5. this.state = {
  6. name:'老李'
  7. }
  8. }
  9. render(){
  10. return (<div>{this.state.name}</div>)
  11. }
  12. }

简写形式

  1. class Abc extends React.Component{
  2. // 初始化state
  3. state = {
  4. name:'老李'
  5. }
  6. render(){
  7. return (<div>{this.state.name}</div>)
  8. }
  9. }

setState() 修改状态

使用setState()方法修改state的状态 参数为一个对象,对象的键为state中的属性,值为state修改后的值

  1. class Abc extends React.Component{
  2. // 初始化state
  3. state = {
  4. num:0
  5. }
  6. render(){
  7. return (<div onClick={
  8. ()=>{
  9. this.setState({num:this.state.num++},()=>{
  10. // 这个方法在setState执行完成后执行,避免在更新DOM异步的情况下计算出错
  11. })
  12. }
  13. }>加1</div>)
  14. }
  15. }

抽离事件处理程序

使用以上方式对state进行修改,JSX的结构变得不清晰,需要对事件抽离程序进行抽离

  1. // 使用这种方式将事件处理程序抽离 但这种方法存在错误,在事件抽离程序中this的指向为undefined
  2. // 会报错
  3. class Abc extends React.Component{
  4. // 初始化state
  5. state = {
  6. num:0
  7. }
  8. handleIncrease(){
  9. this.setState({{num:this.state.num++})
  10. }
  11. render(){
  12. return (<div onClick={this.handleIncrease}>加1</div>)
  13. }
  14. }

解决this指向问题

箭头函数方式

依据箭头函数没有this,this指向外部的特点,在箭头函数中调用事件抽离程序

  1. class Abc extends React.Component{
  2. // 初始化state
  3. state = {
  4. num:0
  5. }
  6. handleIncrease = ()=>(){
  7. this.setState({num:this.state.num++})
  8. }
  9. render(){
  10. return (<div onClick={this.handleIncrease}>加1</div>)
  11. }
  12. }

bind方法

通过bind方法改变事件处理程序中this.指向

  1. class Abc extends React.Component{
  2. constrtor(){
  3. super()
  4. // 初始化state
  5. state = {
  6. num:0
  7. }
  8. // 改变this指向
  9. this.handleIncrease = this.handleIncrease.bind(this)
  10. }
  11. handleIncrease(){
  12. this.setState({{num:this.state.num++})
  13. }
  14. render(){
  15. return (<div onClick={this.handleIncrease}>加1</div>)
  16. }
  17. }

calss实例方法 (推荐使用)

此方法也利用到了箭头函数的特性,使this指向了class类

  1. class Abc extends React.Component{
  2. // 初始化state
  3. state = {
  4. num:0
  5. }
  6. handleIncrease=()=>{
  7. this.setState({{num:this.state.num++})
  8. }
  9. render(){
  10. return (<div onClick={this.handleIncrease}>加1</div>)
  11. }
  12. }