当前位置: 首页 > news >正文

React(9)-组件引用传递(高级应用)

目录

受控组件

非受控组件

 组件应用传递

需求:获取子组件中某个DOM实例

1.类组件形式

2.函数组件形式

调用React.forwardRef()引用转发:引用地址的转发,自动传递ref的一种技术。


受控组件

非受控组件

 组件应用传递

//类组件

class ChildInput extends React.Component{

        render(){

                return(

                        <div>

                                <h2>child input</h2>

                                <inpur type="text" />

                        </div>

                )

        }

}

class FatherForm extends React.Componet{

        constructor(){

               super()

                this.inputRef = React.createRef() //容器:{current:null}

        }

        callbackRef=(e)=>{

                this.inputRef = e

        }

        handleClick=()=>{

                console.log(this.inputRef)//获取到子组件实例

                console.log(this.inputRef.current) //获取不到子组件中DOM操作

        }

        render(){

                return(

                        <div>

                                <ChildInput  callbackRef = {this.callbackRef} />

                                <button onClick={this.handleClick}>commit</button>

                        </div>

                )

        }

}

需求:获取子组件中某个DOM实例

通过回调函数的方式:给子组件传递一个回调函数callback,子组件通过ref={callback},把子组件具体DOM挂载在父组件上,使得父组件可以获取子组件的值。

1.类组件形式

class ChildInput extends React.Component{

        //this.props = props 自动操作

        render(){

                console.log(this.props)

                 console.log(this.props.callbackRef)

                return(

                        <div>

                                <h2>child input</h2>

                                <inpur type="text" ref={this.props.callbackRef}/>

                        </div>

                )

        }

}

class FatherForm extends React.Componet{

        callbackRef=(e)=>{

                console.log(this) //父组件实例

                this.inputRef = e

        }

        handleClick=()=>{

                console.log(this) //父组件实例

                 //需求:获取子组件中某个DOM

                this.inputRef.focus()

        }

        render(){

                return(

                        <div>

                                <ChildInput  callbackRef = {this.callbackRef} />

                                <button onClick={this.handleClick}>commit</button>

                        </div>

                )

        }

}

2.函数组件形式

 注意:函数组件没有this,没有实例的概念,传值依靠props

function ChildInput(props){

        render(){

                return(

                        <div>

                                <h2>child input</h2>

                                <inpur type="text" ref={props.callbackRef}/>

                        </div>

                )

        }

}

class FatherForm extends React.Componet{

        callbackRef=(e)=>{

                this.inputRef = e

        }

        handleClick=()=>{

                this.inputRef.focus()

        }

        render(){

                return(

                        <div>

                                <ChildInput  callbackRef = {this.callbackRef} />

                                <button onClick={this.handleClick}>commit</button>

                        </div>

                )

        }

}

调用React.forwardRef()引用转发:引用地址的转发,自动传递ref的一种技术。

 function ChildInput(props){

        render(){

                return(

                        <div>

                                <h2>child input</h2>

                                <inpur type="text" ref={props.callbackRef}/>

                        </div>

                )

        }

}

 function ChildInput2(props,ref){ //子组件添加ref参数接

        render(){

                return(

                        <div>

                                <h2>child input</h2>

                                <inpur type="text" ref={ref}/> // 地址=>{current:null}=>{current:input}

                        </div>

                )

        }

}

const RefChildInput2 = React.forwardRef(ChildInput2)

class FatherForm extends React.Componet{

        constructor(){

                super()

                this.inputRef1 = React.createRef()

        }

        callbackRef=(e)=>{

                this.inputRef2 = e

        }

        handleClick=()=>{

                //点击input2自动获取焦点

                this.inputRef2.focus()

                //点击input1自动获取焦点

                console.log(thiis)

 

                this.inputRef1.current.focus()

        }

        render(){

                return(

                        <div>

                                <ChildInput  callbackRef = {this.callbackRef} />

                                <RefChildInput2 ref={this.inputRef1}/>

                                <button onClick={this.handleClick}>commit</button>

                        </div>

                )

        }

}

相关文章:

  • Flink在Window上的开发环境搭建
  • elasticsearch ES新增字段并赋初始值
  • DOM--预加载和懒加载
  • HCIA网络课程第七周作业
  • Nacos2.1.1 github下载zip太慢解决方法及资源分享
  • 集群外Prometheus 集群 k8s
  • 《Python编程:从入门到实战》学习笔记 第4章 操作列表
  • Linux当中如何隐藏和查看进程
  • 【C++ Primer Plus】第6章 分支语句和逻辑运算符
  • 案例分享 | 建筑师灵活用工平台产品规划设计
  • 基于springboot+vue的大学生交友活动管理网站 elementui
  • 神经网络建模的基本思想,神经网络语言模型详解
  • 使用VMware搭建OceanStor_eStor存储超详细教程
  • main函数执行前执行和执行后执行
  • idea git提交代码
  • 【译】JS基础算法脚本:字符串结尾
  • 自己简单写的 事件订阅机制
  • 【Leetcode】104. 二叉树的最大深度
  • codis proxy处理流程
  • Java|序列化异常StreamCorruptedException的解决方法
  • javascript 总结(常用工具类的封装)
  • Java方法详解
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • node和express搭建代理服务器(源码)
  • Spring Cloud Feign的两种使用姿势
  • Spring-boot 启动时碰到的错误
  • Vue学习第二天
  • 创建一个Struts2项目maven 方式
  • 听说你叫Java(二)–Servlet请求
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 自动记录MySQL慢查询快照脚本
  • kubernetes资源对象--ingress
  • MyCAT水平分库
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # 计算机视觉入门
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (算法设计与分析)第一章算法概述-习题
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET BackgroundWorker
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net下简单快捷的数值高低位切换
  • :“Failed to access IIS metabase”解决方法
  • ?php echo ?,?php echo Hello world!;?
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @test注解_Spring 自定义注解你了解过吗?
  • [ C++ ] STL---string类的使用指南
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [Angular] 笔记 8:list/detail 页面以及@Input