React---新扩展RenderProps和ErrorBoundary

简介: React新特性

一、render props

1.如何向组件内部动态传入带内容的结构(标签)?

 

   Vue中:

       使用slot技术, 也就是通过组件标签体传入结构  <AA><BB/></AA>

   React中:

       使用children props: 通过组件标签体传入结构

       使用render props: 通过组件标签属性传入结构, 一般用render函数属性

 

2.children props

   <A>

     <B>xxxx</B>

   </A>

   {this.props.children}

   问题: 如果B组件需要A组件内的数据, ==> 做不到

3.render props

   <A render={(data) => <C data={data}></C>}></A>

   A组件: {this.props.render(内部state数据)}

   C组件: 读取A组件传入的数据显示 {this.props.data}

4.代码

importReact, { Component } from'react'import'./index.css'importCfrom'../1_setState'exportdefaultclassParentextendsComponent {
render() {
return (
<divclassName="parent"><h3>我是Parent组件</h3><Arender={(name)=><Cname={name}/>}/></div>        )
    }
}
classAextendsComponent {
state= {name:'tom'}
render() {
console.log(this.props);
const {name} =this.statereturn (
<divclassName="a"><h3>我是A组件</h3>                {this.props.render(name)}
</div>        )
    }
}
classBextendsComponent {
render() {
console.log('B--render');
return (
<divclassName="b"><h3>我是B组件,{this.props.name}</h3></div>        )
    }
}

二、ErrorBoundary错误边界

1. 理解:


  错误边界:用来捕获后代组件错误,渲染出备用页面


2. 特点:


  只能捕获后代组件生命周期产生的错误,不能捕获自己组件产生的错误和其他组件在合成事件、定时器中产生的错误


3. 使用方式:


  getDerivedStateFromError配合componentDidCatch

 

  // 生命周期函数,一旦后台组件报错,就会触发

  static getDerivedStateFromError(error) {

     console.log(error);

     // 在render之前触发

     // 返回新的state

     return {

         hasError: true,

     };

  }


  componentDidCatch(error, info) {

     // 统计页面的错误。发送请求发送到后台去

     console.log(error, info);

  }

4. 代码

(1)child.jsx

importReact, { Component } from'react'exportdefaultclassChildextendsComponent {
state= {
users:[
            {id:'001',name:'tom',age:18},
            {id:'002',name:'jack',age:19},
            {id:'003',name:'peiqi',age:20},
        ]
// users:'abc'    }
render() {
return (
<div><h2>我是Child组件</h2>                {
this.state.users.map((userObj)=>{
return<h4key={userObj.id}>{userObj.name}----{userObj.age}</h4>                    })
                }
</div>        )
    }
}

(2)parent.jsx

importReact, { Component } from'react'importChildfrom'./Child'exportdefaultclassParentextendsComponent {
state= {
hasError:''//用于标识子组件是否产生错误    }
//当Parent的子组件出现报错时候,会触发getDerivedStateFromError调用,并携带错误信息staticgetDerivedStateFromError(error){
console.log('@@@',error);
return {hasError:error}
    }
componentDidCatch(){
console.log('此处统计错误,反馈给服务器,用于通知编码人员进行bug的解决');
    }
render() {
return (
<div><h2>我是Parent组件</h2>                {this.state.hasError?<h2>当前网络不稳定,稍后再试</h2> : <Child/>}
</div>        )
    }
}
相关文章
|
2月前
|
前端开发 调度
react 使用 Reducer 和 Context 进行纵向扩展
react 使用 Reducer 和 Context 进行纵向扩展
|
3月前
|
存储 前端开发 JavaScript
【思维扩展】状态机与 React 中的状态
【思维扩展】状态机与 React 中的状态
|
3月前
|
存储 JavaScript 开发者
Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
59 0
|
3月前
|
缓存 前端开发
react扩展
react扩展
63 0
|
前端开发
前端项目实战伍拾肆react-admin+material ui-踩坑-扩展运算符写增删改
前端项目实战伍拾肆react-admin+material ui-踩坑-扩展运算符写增删改
45 0
|
存储 JavaScript 开发者
Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案
81 0
|
前端开发
【React工作记录五十四】形成新数组的方式扩展运算符
【React工作记录五十四】形成新数组的方式扩展运算符
46 0
|
存储 前端开发 JavaScript
每个开发人员都应该使用的可扩展和可维护的 React 项目结构
每个开发人员都应该使用的可扩展和可维护的 React 项目结构
129 0
|
前端开发
#yyds干货盘点#【React工作记录五十四】形成新数组的方式扩展运算符
#yyds干货盘点#【React工作记录五十四】形成新数组的方式扩展运算符
78 0
#yyds干货盘点#【React工作记录五十四】形成新数组的方式扩展运算符
|
前端开发 JavaScript API
React 入门学习(十七)-- React 扩展
React 入门学习(十七)-- React 扩展
102 0
React 入门学习(十七)-- React 扩展