IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React(9)-组件引用传递(高级应用) -> 正文阅读

[JavaScript知识库]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>

????????????????)

????????}

}

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:02:48  更:2022-09-04 01:06:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:51:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码