React学习(day8)

Class API

类组件基础结构

类组件通过JS中的类来组织组件的代码

1.通过类属性state定义状态数据

2.通过setState方法来修改状态数据

3.通过render来写UI模板(JSX语法一致)

// Class API

import { Component } from "react"

class Counter extends Component {
  //编写组件的逻辑代码
  //1.状态变量 2.事件回调 3.UI(JSX)
  //1.定义状态变量
  state = {
    count:0
  }

  //2.定义事件回调修改状态的数据
  setCount = ()=>{
    //修改状态数据
    this.setState({
      count:this.state.count +1
    })
  }

  render (){
    return <button onClick={this.setCount}>{this.state.count}</button>
  }
}

function ClassApi(){
  return (
    <>
      <Counter />
    </>
  )
}

export default ClassApi

类组件的生命周期函数

1.componentDidMount:组件挂载完毕自动执行 - 异步数据获取

2.componentWillUnmount:组件卸载时自动执行 - 清除副作用

...........

import { Component, useState } from "react";

class Son extends Component{
  //声名周期函数
  //组件渲染完毕执行一次  - 适合发送网络请求
  componentDidMount(){
    console.log('组件渲染完毕,发送请求获取数据')
    //开启定时器
    this.timer = setInterval(()=>{
      console.log('定时器运行')
    },1000)
  }

  //组件卸载的时候自动执行, 副作用清除的工作 清除定时器 清除事件绑定
  componentWillUnmount(){
    console.log('组件son被卸载了')
    clearInterval(this.timer)
  }

  render(){
    return <div>子组件</div>
  }
}

function PreLifeFunction(){
  const [show,setShow] = useState(true)

  return (
    <>
      {show && <Son />}
      <button onClick={()=>setShow(false)}> unmount </button>    
    </>
  )
}

export default PreLifeFunction

useEffect
 

1. 组件挂载时执行一次(类似 componentDidMount)

useEffect(() => {
  console.log("组件挂载");
}, []);

2. 依赖更新时重新执行(类似 componentDidUpdate)

useEffect(() => {
  console.log(`count 变成了 ${count}`);
}, [count]);

3. 组件卸载前清理(类似 componentWillUnmount)

useEffect(() => {
  const timer = setInterval(() => console.log("定时器"), 1000);

  return () => {
    clearInterval(timer); // 清除定时器
    console.log("组件卸载或依赖更新,清理副作用");
  };
}, []);

类组件的组件通讯

概念:类组件和Hooks编写的组件在组件通讯的思想上完全一致

1.父传子:通过prop绑定数据

2.子传父:通过prop绑定父组件的函数,子组件调用

3.兄弟通信:状态提升,通过父组件做桥接

import { Component } from "react";
//1.父传子 直接通过prop子组件标签身上绑定父组件中的数据即可
//2.子传父 在子组件标签身上绑定父组件中的函数,子组件中调用这个函数传递参数

//子组件
class Son extends Component{
  render(){
    return (
      <>
        <div>我是子组件 {this.props.msg}</div>
        <button onClick={()=>this.props.onGetSonMsg('我是son组件的消息')}>向父组件传递消息</button>
      </>
    )
  }
}

//父组件
class Parent extends Component{
  state = {
    msg: 'this is parent msg'
  }

  getSonMsg = (sonMsg)=>{
    console.log(sonMsg)
  }

  render (){
    return <div>我是父组件<Son msg={this.state.msg}  onGetSonMsg={this.getSonMsg}/></div>
  }
}

function PreCommunication(){
  return (
    <>
      <Parent />
    </>
  )
}

export default PreCommunication

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值