React 学习笔记(10):ref

本文详细介绍了React中获取真实DOM节点或组件实例的方法——ref,包括字符串形式、回调函数形式和createRef形式的使用,并讨论了它们的特点和潜在问题。字符串形式的ref存在一些问题,如多次调用;回调函数形式通过定义class函数可避免这个问题;createRef形式提供了一个更安全的存储引用的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在业务代码中,我们有可能需要获取真实 DOM 节点或者某个组件的实例,react 中提供的 ref 可以做到这两件事。

ref 的写法有三种,分别是 字符串形式回调函数形式 以及 createRef 形式

1,字符串形式

写法如下所示:

<script type="text/babel">
	//创建组件
	class Demo extends React.Component{
		//展示左侧输入框的数据
		showData = ()=>{
			const {input1} = this.refs
			alert(input1.value)
		}
		render(){
			return(
				<div>
					<input ref="input1" type="text" placeholder="点击按钮提示数据"/>&nbsp;
					<button onClick={this.showData}>点我提示左侧的数据</button>&nbsp;
				</div>
			)
		}
	}
	//渲染组件到页面
	ReactDOM.render(<Demo/>,document.getElementById('test'))
</script>

小总结:

  • 定义 ref 的写法是在标签中写 ref = "refName"。
  • 定义好的 ref 会被保存在组件实例的 refs 属性对象中。

字符串形式存在的问题

 字符串形式 refs 存在的一些问题点击这里

2,回调函数形式

写法如下所示:

<script type="text/babel">
	//创建组件
	class Demo extends React.Component{
		//展示左侧输入框的数据
		showData = ()=>{
			const {input1} = this
			alert(input1.value)
		}
		render(){
			return(
				<div>
					<input ref={c => this.input1 = c } type="text" placeholder="点击按钮提示数据"/>&nbsp;
					<button onClick={this.showData}>点我提示左侧的数据</button>&nbsp;
				</div>
			)
		}
	}
	//渲染组件到页面
	ReactDOM.render(<Demo/>,document.getElementById('test'))
</script>

小总结:

  • react 解析 ref,发现标签绑定的 ref 是一个函数,react 会以当前标签的 DOM 节点为参数执行该函数。在上面的代码中,input DOM 节点被赋值到了实例的 input1 属性上。

回调函数形式 ref 调用次数的问题:

  • 如果 ref 回调函数是以内联函数的方式定义的话,在组件过程中该内联函数会被执行两次,第一次执行时传入参数是 null,第二次执行时传入的参数才是 DOM 元素。
  • 通过将 ref 的回调函数定义成 class 函数可以避免上述问题,代码如下所示。
<script type="text/babel">
	//创建组件
	class Demo extends React.Component{
		//展示左侧输入框的数据
		showData = () => {
			const {input1} = this
			alert(input1.value)
		}
        saveInput = (c) => {
			this.input1 = c;
			console.log('@',c);
		}
		render(){
			return(
				<div>
					<input ref={this.saveInput} type="text" placeholder="点击按钮提示数据"/>&nbsp;
					<button onClick={this.showData}>点我提示左侧的数据</button>&nbsp;
				</div>
			)
		}
	}
	//渲染组件到页面
	ReactDOM.render(<Demo/>,document.getElementById('test'))
</script>

3,createRef 形式

写法如下所示:

<script type="text/babel">
	//创建组件
	class Demo extends React.Component{
		/* 
			React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是“专人专用”的
		 */
		myRef = React.createRef()
		//展示左侧输入框的数据
		showData = ()=>{
			alert(this.myRef.current.value);
		}
		render(){
			return(
				<div>
					<input ref={this.myRef} type="text" placeholder="点击按钮提示数据"/>&nbsp;
					<button onClick={this.showData}>点我提示左侧的数据</button>&nbsp;
				</div>
			)
		}
	}
	//渲染组件到页面
	ReactDOM.render(<Demo/>,document.getElementById('test'))
</script>

小总结:

  • 通过 React.createRef()  创建一个 ref 容器。
  • 将创建出来的 ref 容器绑定到元素上即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值