返回顶部
首页 > 资讯 > 前端开发 > JavaScript >一篇文章带你理解ReactProps的原理
  • 857
分享到

一篇文章带你理解ReactProps的原理

2024-04-02 19:04:59 857人浏览 薄情痞子
摘要

目录props理解1)props 可以是:2)props在React充当角色(3个角度):3)监听props改变:操作 props1、抽象 props1)混入 props2)抽离 p

props理解

props 是 React 组件通信最重要的手段

props:对于在 React 应用中写的子组件,父组件绑定在它们标签里的 属性和方法,最终会变成 props 传递给它们。

1)props 可以是:

  • ① props 作为一个子组件渲染数据源。
  • ② props 作为一个通知父组件的回调函数。
  • ③ props 作为一个单纯的组件传递。
  • ④ props 作为渲染函数。
  • ⑤ render props , 和④的区别是放在了 children 属性上。
  • ⑥ render component 插槽组件。

function ChidrenComponent(){
    return <div> In this chapter, let's learn about react props ! </div>
}

class PropsComponent extends React.Component{
    componentDidMount(){
        console.log(this,'_this')
    }
    render(){
        const {  children , mes , renderName , say ,Component } = this.props
        const renderFunction = children[0]
        const renderComponent = children[1]
        
        return <div>
            { renderFunction() }
            { mes }
            { renderName() }
            { renderComponent }
            <Component />
            <button onClick={ () => say() } > change content </button>
        </div>
    }
}

class Index extends React.Component{
    state={  
        mes: "hello,React"
    }
    node = null
    say= () =>  this.setState({ mes:'let us learn React!' })
    render(){
        return <div>
            <PropsComponent  
               mes={this.state.mes}  // ① props 作为一个渲染数据源
               say={ this.say  }     // ② props 作为一个回调函数 callback
               Component={ ChidrenComponent } // ③ props 作为一个组件
               renderName={ ()=><div> my name is alien </div> } // ④ props 作为渲染函数
            >
                { ()=> <div>hello,world</div>  } {  }
                <ChidrenComponent />             {  }
            </PropsComponent>
        </div>
    }
}

2)props在React充当角色(3个角度):

① 组件层级

  • ​ 父传子:props 和 子传父:props 的 callback
  • 将视图容器作为 props 进行渲染

② 更新机制

​ 在 fiber 调和阶段中,diff 可以说是 React 更新的驱动器,props 可以作为组件是否更新的重要准则

​ (PureComponentmemo性能优化方案)

③ 插槽层面

​ 组件的闭合标签里的插槽,转化成 chidren 属性

3)监听props改变:

类组件: componentWillReceiveProps(废弃) componentWillReceiveProps(新)函数组件: useEffect (初始化会默认执行一次) props chidren模式

① props 插槽组件

<Container>
    <Children>
</Container>

在 Container 组件中,通过 props.children 属性访问到 Chidren 组件,为 React element 对象。

作用:

  • 可以根据需要控制 Chidren 是否渲染。
  • Container 可以用 React.cloneElement 强化 props (混入新的 props ),或者修改 Chidren 的子元素。

② render props模式

<Container>
   { (ContainerProps)=> <Children {...ContainerProps}  /> }
</Container>
————————————————————————————————————————————————————————————————————————————————
Container组件:
function  Container(props) {
    const  ContainerProps = {
        name: 'alien',
        mes:'let us learn react'
    }
     return  props.children(ContainerProps)
}

根据需要控制 Chidren 渲染与否。可以将需要传给 Children 的 props 直接通过函数参数的方式传递给执行函数 children 。

操作 props

1、抽象 props

用于跨层级传递 props ,一般不需要具体指出 props 中某个属性,而是将 props 直接传入或者是抽离到子组件中。

1)混入 props

给父组件 props 中混入某个属性,再传递给子组件

function Son(props){
    console.log(props)
    return <div> hello,world </div>
}
function Father(props){
    const fatherProps={
        mes:'let us learn React !'
    }
    return <Son {...props} { ...fatherProps }  />
}
function Index(){
    const indexProps = {
        name:'alien',
        age:'28',
    }
    return <Father { ...indexProps }  />
}

2)抽离 props

从父组件 props 中抽离某个属性,再传递给子组件

function Son(props){
    console.log(props)
    return <div> hello,world </div>
}
function Father(props){
    const { age,...fatherProps  } = props
    return <Son  { ...fatherProps }  />
}
function Index(){
    const indexProps = {
        age:'28',
        mes:'let us learn React !'
    }
    return <Father { ...indexProps }  />
}

2、注入 props

1)显式注入 props

能够直观看见标签中绑定的 props

function Son(props){
    console.log(props)
    return <div> hello,world </div>
}
function Father(props){
    const fatherProps={
        mes:'let us learn React !'
    }
    return <Son {...props} { ...fatherProps }  />
}
function Index(){
    const indexProps = {
        name:'alien',
        age:'28',
    }
    return <Father { ...indexProps }  />
}

2)隐式注入 props

一般通过 React.cloneElement 对 props.chidren 克隆再混入新的 props

function Son(props){
     console.log(props) // {name: "alien", age: "28", mes: "let us learn React !"}
     return <div> hello,world </div>
}
function Father(prop){
    return React.cloneElement(prop.children,{  mes:'let us learn React !' })
}
function Index(){
    return <Father>
        <Son  name="alien"  age="28"  />
    </Father>
}

总结

1、pros作用、角色

2、props的children(插槽)

3、操作props

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 一篇文章带你理解ReactProps的原理

本文链接: https://lsjlt.com/news/162612.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一篇文章带你理解ReactProps的原理
    目录props理解1)props 可以是:2)props在React充当角色(3个角度):3)监听props改变:操作 props1、抽象 props1)混入 props2)抽离 p...
    99+
    2024-04-02
  • 一篇文章带你了解C++多态的实现原理
    目录虚函数和多态多态的作用多态的一个例子构造函数和析构函数中存在多态吗?多态的实现原理虚函数表虚析构函数纯虚函数和抽象类总结虚函数和多态 虚函数: 在类的定义中,前面有 v...
    99+
    2024-04-02
  • 一篇文章带你学习JAVA MyBatis底层原理
    目录一、传统JDBC的弊端二、mybatis介绍三、MyBatis架构图核心类解释工作流程四、自己通过加载xml配置走mybais流程实现例子总结一、传统JDBC的弊端 j...
    99+
    2024-04-02
  • 一篇文章带你彻底搞懂VUE响应式原理
    目录响应式原理图编译创建compile类操作fragment获取元素节点上的信息获取文本节点信息操作fragment响应式数据劫持收集依赖响应式代码完善Dep类全局watcher用完...
    99+
    2024-04-02
  • 一篇文章带你搞懂Java线程池实现原理
    目录1. 为什么要使用线程池2. 线程池的使用3. 线程池核心参数4. 线程池工作原理5. 线程池源码剖析5.1 线程池的属性5.2 线程池状态5.3 execute源码5.4 wo...
    99+
    2022-11-13
    Java线程池实现原理 Java线程池原理 Java线程池实现 Java线程池
  • 一篇文章带你详解Spring的AOP
    目录1、AOP 什么?2、需求3、解决办法1:使用静态代理第一步:创建 UserService 接口第二步:创建 UserService的实现类第三步:创建事务类 MyTransac...
    99+
    2024-04-02
  • 一篇文章带你入门C++的异常处理
    目录一、背景二、C++ 异常处理三、抛出异常与捕获异常四、catch(...)的作用总结一、背景 程序运行时常会碰到一些异常情况,例如: 做除法的时候除数为 0; ...
    99+
    2024-04-02
  • 一篇文章带你吃透Vuex3的状态管理
    目录一. Vuex是什么Vue全局事件总线Vuex状态管理何时使用Vuex二. 纯vue组件案例计算总数案例添加人员案例三. Vuex工作原理和流程第一种工作流程第二种工作流程生活化...
    99+
    2024-04-02
  • 一篇文章带你入门java代理模式
    目录Java设计模式-代理模式什么是代理模式?代理模式小结:应用实例:使用场景:总结Java设计模式-代理模式 什么是代理模式? 在代理模式(Proxy Pattern)中,一个类代...
    99+
    2024-04-02
  • 一篇文章带你了解Python中的类
    目录1、类的定义2、创建对象3、继承总结1、类的定义 创建一个rectangle.py文件,并在该文件中定义一个Rectangle类。在该类中,__init__表示构造方法。其中,s...
    99+
    2024-04-02
  • 一篇文章带你详解Spring的概述
    目录1、什么是 Spring 2、Spring 起源3、Spring 特点①、方便解耦,简化开发②、AOP编程的支持③、声明式事务的支持④、方便程序的测试⑤、方便集成各种优秀框架⑥、...
    99+
    2024-04-02
  • 一篇文章教你如何理解SQL
    这篇文章主要介绍了一篇文章教你如何理解SQL,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQL 是一种为数不多的声明性语言,它的运行方式完...
    99+
    2024-04-02
  • 一篇文章带你轻松搞懂Golang的error处理
    目录Golang中的errorerror的几种玩法哨兵错误自定义错误类型Wrap errorGolang1.13版本error的新特性errors.UnWrap()errors.Is...
    99+
    2024-04-02
  • 一篇文章带你搞定JAVA注解
    目录1、注解是什么2、jdk支持的注解有哪些2.1 三种常用的注解:2.2 元注解3、注解实例1、自定义注解2、在对应的方法上增加注解3、在项目启动的时候检查注解的枚举4、总结1、注...
    99+
    2024-04-02
  • 一篇文章带你了解初始Spring
    目录为什么要使用SpringSpring概述Spring容器使用流程1.启动容器2.完成bean的初始化3.注册bean到容器中4.装配bean的属性bean的注册bean属性注入总...
    99+
    2024-04-02
  • 一篇文章带你入门java注解
    目录注解什么是注解内置注解元注解自定义注解实例总结注解 什么是注解 Annotation是从JDK5.0开始引入的新技术 Annotation的作用: ...
    99+
    2024-04-02
  • 一篇文章带你了解JavaScript-对象
    目录创建对象对象直接量通过new创建对象原型Object.create()属性的查询和设置继承属性访问错误删除属性检测属性序列化对象总结创建对象 对象直接量 对象直接量是由若干名/值...
    99+
    2024-04-02
  • 一篇文章带你了解JavaScript-语句
    目录表达式语句复合语句和空语句复合语句空语句声明语句varfunction条件语句ifif/elseelse ifswitch循环whiledo/whileforfor/in跳转标签...
    99+
    2024-04-02
  • 一篇文章带你了解XGBoost算法
    目录1. 什么是XGBoost1.1 XGBoost树的定义1.2 正则项:树的复杂度1.3 树该怎么长1.4 如何停止树的循环生成2. XGBoost与GBDT有什么不同3. 为什...
    99+
    2024-04-02
  • 一篇文章带你了解Java Stream流
    目录一、Stream流引入现有一个需求:1.用常规方法解决需求2.用Stream流操作集合,获取流,过滤操作,打印输出二、Stream流的格式三、获取流四、Stream流的常用方法方...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作