React组件三大属性之refs

news/2024/7/15 19:49:03 标签: javascript, js, react.js, react

一、理解

Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。
Ref 转发是一项将 ref 自动通过组件传递到子组件的技巧。 通常用来获取 DOM 节点或者 React 元素实例的工具。在 React 中 Refs 提供了一种方式,允许用户访问 DOM 节点或者在 render 方法中创建的 React 元素。

二、使用

1、回调函数形式的ref

☆这种方式是最常用的,如果 ref 回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null,然后第二次会传入参数 DOM 元素。这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的。

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

上述代码中的 input 域包含了一个 ref 属性,该属性声明的回调函数会接收 input 对应的 DOM 元素,我们将其绑定到 this 指针以便在其他的类函数中使用。

2、createRef 的使用

React.createRef 调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是“专人专用”的,所以使用起来较为复杂,虽然这是最新的

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

一般情况不推荐这种使用方法,虽然这种方式很简单, string 类型的 refs 存在 一些问题。它已过时并可能会在未来的版本被移除。

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

http://www.niftyadmin.cn/n/1527262.html

相关文章

vue-i18n 实现国际化,支持切换不同语言

需求&#xff1a;后台管理系统&#xff0c;可以实现语言切换 实现过程&#xff1a;用的i18n来实现的语言切换&#xff0c;网上能看到好多模板&#xff0c;根据自己的需求&#xff0c;修改一下即可使用&#xff0c;大概都是差不多的&#xff0c;因为涉及到后端&#xff0c;所以…

素数的性质

素数的性质 素数是无限的4n3型的素数是无限的4n1型的数乘以4n1型的数结果还是4n1型的数&#xff08;dirichlet&#xff09;给定两个整数a&#xff0c;b&#xff0c;如果a&#xff0c;b是互素的&#xff0c;即&#xff08;a&#xff0c;b&#xff09;1&#xff0c;则存在无穷多…

Vue中的全局导航守卫(beforeEach、afterEach)

在项目开发中每一次路由的切换或者页面的刷新都需要判断用户是否已经登录&#xff0c;前端可以判断&#xff0c;后端也会进行判断的&#xff0c;我们前端最好也进行判断。 vue-router 提供了导航钩子:全局前置导航钩子 beforeEach 和全局后置导航钩子 afterEach&#xff0c;他…

Vue中组件内导航守卫(beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave)

在组件中使用路由守卫: beforeRouteEnter (to, from, next) { // 注意&#xff0c;在路由进入之前&#xff0c;组件实例还未渲染&#xff0c;所以无法获取this实例&#xff0c;只能通过vm来访问组件实例if(userData.status 0){//userData为接口返回数据。next(vm > {vm.$m…

基于java awt包的附带登录的学生管理系统图形用户界面程序

文章目录1.前言2.程序入口3.登录注册页面3.主界面4.添加学生界面5.查找学生界面6.显示学生信息7.删除学生界面(和查找学生界面相似,自己太菜,没提高代码复用率)8.根据序号查找学生(相似界面)9.显示所以学生信息(未完成)10.删除所有学生信息,获取学生人数,退出11.学生类12.学生库…

React中受控组件和非受控组件

一、受控组件 受控组件就是可以被 react 状态控制的组件 在 react 中&#xff0c;Input textarea 等组件默认是非受控组件&#xff08;输入框内部的值是用户控制&#xff0c;和 React 无关&#xff09;。但是也可以转化成受控组件&#xff0c;就是通过 onChange 事件获取当前输…

React中高阶函数和函数的柯里化

一、高阶函数&#xff1a; 如果一个函数符合下面2个规范中的任何一个&#xff0c;那该函数就是高阶函数。 若A函数&#xff0c;接收的参数是一个函数&#xff0c;那么A就可以称之为高阶函数。若A函数&#xff0c;调用的返回值依然是一个函数&#xff0c;那么A就可以称之为高阶…

maven安装与配置到idea中

maven安装 在官网下载压缩包,网址: https://maven.apache.org/download.cgi?.解压到一个目录,目录最好不要有中文和空格配置环境变量: 新建一个变量: M2_HOME , 变量值为maven的路径(不带bin目录),在PATH变量中追加值: %M2_HOME%\bin 打开cmd输入 mvn -v出现以下内容安装成功…