• React-4(state、props、表单、通信、生命周期)


    目录

    一、state(状态)

    1、读取状态

    2、修改状态

    3、setState注意点

    二、属性props(只读)

    1、数据传递

    2、属性验证

    3、默认属性

    三、表单

    1、受控表单组件

    1.1、理解

    1.2、实现步骤

    2、非受控表单组件

    四、通信

    1、父组件向子组件传递

    1.1、步骤

    1.2、实现

    2、子组件向父组件传递

    2.1、步骤

    2.2、实现

    3、兄弟组件通信

    4、发布订阅模式

    5、context状态树传参(官方提供)

    步骤

    五、生命周期(钩子函数)

    1、初始化阶段

    1.1、componentWillMount

    1.2、render

    1.3、componentDidMount

    2、运行中阶段

    2.1、componentWillReceiveProps(nextProps)

    2.2、shouldComponentUpdate(nextProps,nextState)

    2.3、render

    2.4、componentDidUpdate(preProps,preState)

    3、销毁阶段

    componentWillUnmount


    一、state(状态)

    设置了state的组件称之为有状态组件

    没有设置state的组件称之为无状态组件

    1、读取状态

    1. export class exer extends Component {
    2. state = {
    3. count: 0,
    4. }
    5. render() {
    6. return (
    7. <div>{this.state.count}div>
    8. )
    9. }
    10. }

    2、修改状态

    this.setState({ 要修改的数据 })

    注意:不能直接修改state中的值(例如:state:this.state.count = 1),必须通过setState方法进行修改

    1. export class exer extends Component {
    2. state = {
    3. count: 0,
    4. }
    5. setcount = () => {
    6. this.setState({
    7. count: this.state.count + 1,
    8. })
    9. }
    10. render() {
    11. return (
    12. <div>
    13. <p>{this.state.count}p>
    14. <button
    15. style={{
    16. width: '50px',
    17. height: '20px',
    18. }}
    19. onClick={
    20. this.setcount
    21. }
    22. >
    23. 按钮
    24. button>
    25. div>
    26. )
    27. }
    28. }

    3、setState注意点

    在同步逻辑中,异步更新状态与真实dom

    在异步逻辑中,同步更新状态与真实dom

    接受第二个参数,是个回调函数,在这里状态与dom更新完成

    二、属性props(只读)

    1、数据传递

    props是为了更好的实现复用性,从外部接受数据

    1. //父组件
    2. <MyNav title={this.title} />
    3. //MyNav.js组件
    4. render(){
    5.  return (
    6.   <div>
    7.     <p>{this.props.title}<p/>
    8.   div>
    9.  )
    10. }

    2、属性验证

    1. import mypro from 'prop-types'
    2. static proTypes={
    3.    title: mypro.string,
    4.    letBtn: mypro.bool
    5. }

    3、默认属性

    1. static defaultProps={
    2.       title: '首页'
    3. }

    三、表单

    1、受控表单组件

    1.1、理解

    input框自己的状态被React组件状态控制就是受控组件

    1.2、实现步骤

    2.1、在组件的state中声明组件的状态数据

    2.2、将状态数据设置为input标签元素的value属性的值

    2.3、为input添加change事件,通过事件对象e获取到当前文本框的值

    2.4、调用setState方法,将文本框的值作为state状态的新值

    1. export class exer extends Component {
    2. //组件状态数据
    3. state = {
    4. mesg: 'msg',
    5. }
    6. //通过事件对象e获取当前文本框的值,并把文本框的值作为state状态的新值
    7. getinput = (e) => {
    8. this.setState({
    9. mesg: e.target.value,
    10. })
    11. }
    12. render() {
    13. return (
    14. <div>
    15. <input value={this.state.mesg} onChange={this.getinput}/>
    16. div>
    17. )
    18. }
    19. }

    2、非受控表单组件

    通过操作DOM获取文本框的值

    在constructor中React.createRef()

    四、通信

    1、父组件向子组件传递

    使用属性值

    1.1、步骤

    1、父组件提供传递的数据

    2、给子组件标签添加属性,值为state中的数据

    3、子组件中通过props接收父组件中传过来的数据

    1.2、实现

    1. // 子组件
    2. export class tab extends Component {
    3. render() {
    4. return (
    5. <div>
    6. {this.props.msg}
    7. div>
    8. )
    9. }
    10. }
    11. // 父组件
    12. export class exer extends Component {
    13. state = {
    14. mesg: 'msg',
    15. }
    16. render() {
    17. return (
    18. <div>
    19. <tab msg={this.state.mesg} />
    20. div>
    21. )
    22. }
    23. }

    2、子组件向父组件传递

    使用回调函数

    2.1、步骤

    1、父组件提供一个回调函数,用于接收数据

    2、将函数作为属性的值,传给子组件

    3、子组件通过props调用回调函数

    4、将子组件中的数据作为参数传给回调函数

    2.2、实现

    1. // 子组件
    2. export class tab extends Component {
    3. render() {
    4. return (
    5. <div>
    6. <p
    7. onClick={() =>{
    8. this.props.changeMes("返回数据")
    9. }
    10. }
    11. >tabp>
    12. div>
    13. )
    14. }
    15. }
    16. // 父组件
    17. export class exer extends Component {
    18. state = {
    19. mesg: 'msg',
    20. }
    21. changemes = (newmsg) => {
    22. this.state({
    23. meg: newmsg
    24. })
    25. }
    26. render() {
    27. return (
    28. <div>
    29. <tab changeMes={this.changemes} />
    30. div>
    31. )
    32. }
    33. }

    3、兄弟组件通信

    由父组件充当中间人,利用子传父+父传子模式完成

    1、公共父组件提供共享状态,提供共享状态的方法

    2、要接收数据状态的子组件通过 props 接收数据

    3、要传递数据状态的子组件通过props接收方法,调用方法传递数据

    4、发布订阅模式

    1. let  bus = {
    2.    list:[],   //存放订阅者
    3.    //订阅者
    4.    subscrible(cb){
    5.       this.list.push(cb);
    6.    },
    7.    //发布者
    8.    publish(text){
    9.       this.list.forEach(cb => cb &&  cb(text))
    10.    }
    11. }

    5、context状态树传参(官方提供)

    Context提供了一个无需为每层组件手动添加props,就能在组件树间进行数据传递的方法

    步骤

    1、创建Context对象

    const GlobalContext = React.createContext()

    2、使用GlobalContext.Provider包裹上层组件提供数据

    1. <GlobalContext.Provider  value = {{a:1,b:2}}>
    2.       <p>p>
    3.       <p>p>
    4. GlobalContext.Provider>

    3、需要用到数据的组件使用GlobalContext.Consumer包裹获取数据

    1. <GlobalContext.Consumer>
    2.    {
    3.       value =>{
    4.          return  (
    5.             <div>子组件{value}div>
    6.          )
    7.       }
    8.    }
    9. GlobalContext.Consumer>

    五、生命周期(钩子函数

    1、初始化阶段

    1.1、componentWillMount

    组件即将挂载,render之前最后一次修改state的机会

    常用于:state的初始化

    备注:如果有警告,可使用UNSAFE_componentWillMount

    1.2、render

    只能访问props与state,不能修改state及进行dom输出

    1.3、componentDidMount

    成功执行完毕render并完成dom节点的渲染,可以对dom修改

    常用于:axios请求,订阅函数调用,计时器,dom操作

    2、运行中阶段

    2.1、componentWillReceiveProps(nextProps)

    父组件修改属性触发

    最先获取父组件传来的属性,可以在这里进行axios请求或者其他逻辑处理

    备注:如果有警告,可使用UNSAFE_componentWillReceiveProps

    2.2、shouldComponentUpdate(nextProps,nextState)

    返回false,会阻止render的调用

    参数是被修改之后的新的属性及状态

    2.3、render

    只能访问props与state,不能修改state及进行dom输出

    2.4、componentDidUpdate(preProps,preState)

    可以修改dom

    参数是被修改之前的属性及状态

    3、销毁阶段

    componentWillUnmount

    在删除组件前进行清理工作

  • 相关阅读:
    JavaScript基础 JavaScript第一天 1. JavaScript介绍
    Unity UGUI的EventSystem(事件系统)组件的介绍及使用
    MySQL 9.0创新版发布!功能又进化了!
    企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
    热更新:Chrome 插件开发提效
    Nginx 市场份额全球第一,10月全球Web服务器调查报告出炉!
    使用helm部署clickhouse
    极智嘉(Geek+)柔性货箱到人拣选方案,助力Starlinks实现高效运营
    Java项目:高校教学评价管理系统(java+JSP+JavaScript+servlet+Mysql)
    嵌入式分享合集37
  • 原文地址:https://blog.csdn.net/weixin_43765641/article/details/127351323