ref useRef React.createRef React.forwardRef

react如何获取真实DOM:useRef, React.CreateRef()

access DOM nodes directly within React:ref.current

Let's say you want to change the value of an <input> element, but without using props or re-rendering the whole component. They're an excellent way to update part of a component without the need to re-render the entire thing.


  1. useRef

const {useRef} = React

const App=()=>{

const buttonRef=useRef();

return(

<button

onClick={()=>{console.log(buttonRef.current);}}

ref={buttonRef} >

Special Button

</button>

);

}


  1. React.createRef()

create a ref by calling React.createRef() and attaching a React element to it using the ref attribute on the element.

class Example extends React.Component {

constructor(props) {

super(props)

this.exampleRef = React.createRef() // Create the ref

}

render() {

return (

<div>

//这里是uncontrolled form

<input type="text" ref={this.exampleRef} /> // Call the ref with the `ref` attribute

</div>

)

}}


  1. Passing a callback function to ref

create a ref by passing a callback function to the ref attribute of a component.

<input type="text" ref={element=>this.textInput=element}/>

The callback is used to store a reference to the DOM node in an instance property. When we want to make use of this reference, we access it using: this.textInput.value

When you make use of callback like we did above, React will call the ref callback with the DOM node when the component mounts, when the component un-mounts, it will call it with null.

class App extends React.Component {

state = { value: '' }

handleSubmit = e => {

e.preventDefault();

this.setState({ value: this.textInput.value})

};

render() {

return (

<div>

<h3>Value: {this.state.value}</h3>

<form onSubmit={this.handleSubmit}>

<input type="text" ref={element => this.textInput = element} />

<button>Submit</button>

</form>

</div>

); }}


  1. pass ref from a parent component to a child component using callbacks.

child:

const Input = props =>{

return(

//This component is expecting inputRef props from its parent component which is then used to create a ref to the DOM node.

<inputtype="text" ref={ props.inputRef }/>

);

};

parent:

In the App component, we want to obtain the text that is entered in the input field (which is in the child component) so we can render it. The ref is created using a callback like we did in the first example of this section. The key lies in how we access the DOM of the input element in the Input component from the App component. If you look closely, we access it using this.inputElement. So, when updating the state of value in the App component, we get the text that was entered in the input field using this.inputElement.value.

class App extends React.Component{

state={

value:""

};

handleSubmit=event=>{

this.setState({ value:this.inputElement.value });

};

render() {

return(

<div>

<h3>Value: {this.state.value}</h3>

<Input inputRef={el=>(this.inputElement=el)}/>

<button onClick={this.handleSubmit}>Submit</button>

</div>

);}}


  1. Forwarding a ref from one component to another

Ref forwarding is the technique of passing a ref from a component to a child component by making use of the React.forwardRef() method.

child:

const Input=React.forwardRef((props,ref)=>(

<inputtype="text"ref={ref}/>

));

parent:

class App extends React.Component{

constructor(props) {

super(props)

this.inputRef=React.createRef();

this.state={value:''}

}

handleSubmit=e=>{

e.preventDefault();

this.setState({value:this.inputRef.current.value})

};

render() {

return(

<div>

<h3>Value: {this.state.value}</h3>

<form onSubmit={this.handleSubmit}>

<Input ref={this.inputRef}/>

<button>Submit</button>

</form>

</div>

);}}


uncontrolled form example: Using ref for form validation

class App extends React.Component {

constructor(props) {

super(props);

this.username = React.createRef();

this.password = React.createRef();

this.state = {

errors: []

};

}

handleSubmit = (event) => {

event.preventDefault();

const username = this.username.current.value;

const password = this.password.current.value;

const errors = this.handleValidation(username, password);

if (errors.length > 0) {

this.setState({ errors });

return;

}

// Submit data

};

handleValidation = (username,password) => {

const errors = [];

if (username.length === 0) { errors.push("Username cannot be empty"); }

if (password.length < 6) { errors.push("Password should be at least 6 characters long");}

return errors;

};

render() {

const { errors } = this.state;

return (

<form onSubmit={this.handleSubmit}>

{errors.map(error => <p key={error}>{error}</p>)}

<input type="text" ref={this.username} />

<input type="text" ref={this.password} />

<button>Submit</button>

</form>

);}}


访问节点的情况

将节点绑定在this.input属性上

dom api:focus

无状态
最后编辑于:2025-01-11 21:04:55
© 著作权归作者所有,转载或内容合作请联系作者

喜欢的朋友记得点赞、收藏、关注哦!!!

相关推荐
Spring AI学习7 小时前
Spring AI深度解析(9/50):可观测性与监控体系实战
java·人工智能·spring
unique_perfect8 小时前
vue2与springboot实现deepseek打印机聊天
spring boot·websocket·ai·vue2·deepseek
java1234_小锋8 小时前
Spring IoC的实现机制是什么?
java·后端·spring
生骨大头菜8 小时前
使用python实现相似图片搜索功能,并接入springcloud
开发语言·python·spring cloud·微服务
哈哈老师啊9 小时前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
前端小端长10 小时前
Vue 中 keep-alive 组件的原理与实践详解
前端·vue.js·spring
气π11 小时前
【JavaWeb】——(若依 + AI)-基础学习笔记
java·spring boot·笔记·学习·java-ee·mybatis·ruoyi
YDS82911 小时前
SpringCould —— 网关详解
后端·spring·spring cloud
老华带你飞12 小时前
列车售票|基于springboot 列车售票系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring