1、在dom元素中直接使用ref

意思就是可以在组件中创建一个dom节点的textInput,并将ref直接绑定到他

<script src="https://unpkg.com/@babel/standalone/babel.js"></script>
<script src="https://unpkg.com/react/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
<div id="root"/>
<script type="text/babel">
//在dom元素上使用ref
class App extends React.Component{
constructor(props){
super(props)
this.textInput = React.createRef() (ref对象)
this.focusTextInput = this.focusTextInput.bind(this)
}
focusTextInput(){
this.textInput.current.focus()
}
render(){
return (
<div>
<input type="button" onClick={this.focusTextInput} value="获取焦点" />
<input type="text" ref={this.textInput} />
</div>
)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
</script>

2、为class组件添加refs 这个时候 refs指向的是子组件的实例 这样在父组件中可以调用子组件中的方法

当为了使用更方便时可以直接在子组件上定义一个refs别名 作为props传递个子组件 

在父组件中想获取子组件的哪个dom元素 就将刚刚传递个子组件的props 作为dom元素ref属性的值

<script src="https://unpkg.com/@babel/standalone/babel.js"></script>
<script src="https://unpkg.com/react/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
<div id="root"/>
<script type="text/babel">
class CustomeInput extends React.Component{
constructor(props){
super(props)
this.textInput = React.createRef()
this.textInputFocus = this.textInputFocus.bind(this) }
textInputFocus(){
this.textInput.current.focus()
}
render(){
return (
<React.Fragment>
<input readOnly type="button" value="点击我" />
<input onChange={()=>{}} ref={this.textInput} value="Focus the text input" />
</React.Fragment>
)
}
} class App extends React.Component{
constructor(props){
super(props)
this.textInput = React.createRef()
}
componentDidMount(){
this.textInput.current.textInputFocus()
}
render(){
return (
<div><CustomeInput ref={this.textInput} /></div>
)
}
} ReactDOM.render(<App />, document.getElementById('root'));
</script>
import React, { Component } from 'react';
import ReactDOM from 'react-dom'
import { ThemeContext,themes } from './components/ThemeContext';
import ThemeButton from './components/ThemeButton' class CustomInput extends React.Component{
constructor(props){
super(props)
}
render(){
return <input onChange={()=>{}} value="fouse" ref={this.props.inputRef} />
}
} class App extends React.Component{
constructor(props){
super(props)
this.input = React.createRef()
}
componentDidMount() {
this.input.current.focus()
}
render(){
return (
<div>
<CustomInput inputRef={this.input} />
</div>
)
}
} ReactDOM.render(<App />,document.getElementById('root'))

3、通过转发的方式将将 DOM Refs 暴露给父组件

<script src="https://unpkg.com/@babel/standalone/babel.js"></script>
<script src="https://unpkg.com/react/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
<div id="root"/>
<script type="text/babel">
//利用forwardRef 将ref转发给dom元素的button
const FancyButton = React.forwardRef((props,ref)=>(
<button ref={ref} onClick={props.onClick}>
{props.children}
</button>
)) class App extends React.Component{
constructor(props){
super(props)
this.ref = React.createRef()
this.clickHandle = this.clickHandle.bind(this)
}
clickHandle(){
console.log(this.ref.current)
}
render(){
return (
<FancyButton ref={this.ref} onClick={this.clickHandle}>clickME</FancyButton>
)
}
}
</script>

 4、回调refs

注:内联的回调refs 会调用二次 第一次返回null

内联的写法:

<input ref={(e)=>this.inputText=el} onChange={()=>{}} value="inputfocus" />
<script src="https://unpkg.com/@babel/standalone/babel.js"></script>
<script src="https://unpkg.com/react/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
<div id="root"/>
<script type="text/babel">
//回调refs
class App extends React.Component{
constructor(props){
super(props)
this.inputText=null;
this.setInputRef = (element)=>{
this.inputText = element;
}
this.focusTextInput=()=>{
if(this.inputText) this.inputText.focus()
}
}
componentDidMount(){
this.inputText.focus()
}
render(){
return (
<div>
<input type="button" value="点击" onClick={this.focusTextInput} />
<input ref={this.setInputRef} onChange={()=>{}} value="inputfocus" />
</div>
)
}
} ReactDOM.render(<App />, document.getElementById('root'));
</script>

react中refs的使用的更多相关文章

  1. React 中 refs 的作用是什么?

    Refs 是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄.我们可以为元素添加 ref 属性然后在回调函数中接受该元素在 DOM 树中的句柄,该值会作为回调函数的第一个参数返回 ...

  2. react中refs详解

    https://zh-hans.reactjs.org/docs/refs-and-the-dom.html 字符串形式ref 1 <input ref="myinput" ...

  3. React中refs持久化

    根据使用React的版本,选择合适的方法. 字符串模式 :废弃不建议使用 回调函数,React版本 < 16.3 React.createRef() :React版本 >= 16.3 回调 ...

  4. 九、React中的组件、父子组件、React props父组件给子组件传值、子组件给父组件传值、父组件中通过refs获取子组件属性和方法

    一.概述 React中的组件: 解决html 标签构建应用的不足. 使用组件的好处:把公共的功能单独抽离成一个文件作为一个组件,哪里里使用哪里引入. [父子组件]:组件的相互调用中,我们把调用者称为父 ...

  5. react中input自动聚焦问题

    input自动聚焦问题 在react中可以使用refs解决这个问题,首先看一下refs的使用场景: (1)处理焦点.文本选择或媒体控制. (2)触发强制动画. (3)集成第三方 DOM 库. 使用re ...

  6. react中这些细节你注意过没有?

    react中的一些细节知识点: 1.组件中get的使用(作为类的getter) ES6知识:class类也有自己的getter和setter,写法如下: Class Component { const ...

  7. React中ref的使用方法

    React中ref的使用方法 在react典型的数据流中,props传递是父子组件交互的唯一方式:通过传递一个新的props值来使子组件重新re-render,从而达到父子组件通信.当然,就像reac ...

  8. React中ref的用法

    在React数据流中,父子组件唯一的通信方式是通过props属性:那么如果有些场景需要获取某一个真实的DOM元素来交互,这时候就要用到React的refs属性. 1.可以给DOM元素添加ref属性 c ...

  9. React中setState学习总结

    react中setState方法到底是异步还是同步,其实这个是分在什么条件下是异步或者同步. 1.先来回顾一下react组件中改变state的几种方式: import React, { Compone ...

  10. react中父组件给子组件传值

    子组件 state = { msg: 'a' } render(){ return<h1>{this.state.msg}</h1> } setInfo = (val)=> ...

随机推荐

  1. 基于sqli-labs Less-5 sql报错注入详解

    按照之前的思路发现,是正常的'闭合的字符型,但是在联合注入0' union select 1,2,3--+没有回显注入点,只是回显You are in,因此无法使用联合注入,考虑使用报错注入或者盲注. ...

  2. DCDC电路设计之FB引脚布线

    该随笔从与非网上搬运,原文: 案例讲解,DCDC电源反馈路径的布线规则 下面为正文内容: 在本文中,将对用来将输出信号反馈给电源ic的FB引脚的布线进行说明. 反馈路径的布线 反馈信号的布线在信号布线 ...

  3. 根据docker镜像反推dockerfile

    Dockerfile 是一个文本文件,其中包含我们为了构建 Docker 镜像而手动执行的所有命令. Docker 可以从 Dockerfile 中读取指令来自动构建镜像.我们可以使用 docker ...

  4. AI智能学生体测小程序解决方案

    引言: 近年来,随着教育理念的提升,对学生综合素质的教育越发重视,特别是越发重视学生的身体素质提升,各阶段的升学考试也将体测纳入考核范围.学校也推出了各种体测锻炼促进手段,今天为您介绍一个基于小程序的 ...

  5. git pull发现有ahead of xx commits问题如何解决

    git pull 的时候发现有提示你ahead of xx commits 这个时候怎么办呢? 直接一句话定位到远程最新分支 git reset --hard origin/分支名称

  6. 简单几步,基于云主机快速为Web项目添加AI助手

    在华为开发者空间,借助华为云对话机器人服务 CBS您可以零代码创建一个大模型 RAG (Retrieval-Augmented Generation,即检索增强生成)应用,来实现 AI 助手的智能问答 ...

  7. Tornado框架之深入(二)

    知识点 Application设置 debug模式 路由设置扩展 RequestHandler的使用 输入方法 输出方法 可重写接口 目录: Application settings 路由映射 输入 ...

  8. 全球气象数据ERA5的下载方法

      本文介绍在ERA5气象数据的官方网站中,手动下载.Python代码自动批量下载逐小时.逐日与逐月的ERA5气象数据各类产品的快捷方法.   ERA5(fifth generation ECMWF ...

  9. MySql 9 in Docker 主从切换

    继上一篇<MySql 9 in Docker 利用克隆插件搭建主从>我们说了主从复制后, 那么我们接下来说说如何手动的进行主从切换. 动手~ 1. 原主库设置 切断应用对主库的访问 主库设 ...

  10. redmine部署,踩坑而过

    背景:部门想用个工具来做项目执行进度的管理,为了保证数据私有并且不想花钱,选了redmine. 环境:阿里云服务器,windows server R2企业版 软件版本构成: 官方版本说明http:// ...