Ref模式(非受控模式)
非钩子模式
javascript
1.createRef()方式
js:
userNameEl=createRef()
<input type="text" name="userName" ref={this.userNameEl} />
获取值的方式:
this.userNameEl.current.value
2.refs(废弃)
js:
const { userName } = this.refs;
<input type="text" name="userName" ref="userName" />
3.回调函数方式(不推荐)
js:
this.userNameRef.value
<input type="text" name="userName" ref={(el) => (this.userNameRef = el)} />
钩子函数模式
javascript
import React, { useRef, useEffect } from 'react';
function MyComponent() {
const myRef = useRef();
useEffect(() => {
myRef.current.focus();
}, []);
return <input ref={myRef} />;
}
非ref模式(受控模式)
非钩子模式
javascript
import { Component } from "react";
export default class TestValue extends Component {
state = {
userName: null,
};
inputChange = (e) => {
this.setState({ userName: e.target.value });
};
getInputValue = () => {
console.log(this.state.userName);
};
render() {
return (
<div>
<input type="text" name="userName" onChange={this.inputChange} />
<button onClick={this.getInputValue}>TestValue</button>
</div>
);
}
}
钩子模式
javascript
import { useState } from "react";
export default function TestValue() {
//函数式组件使用
const [userName, setUserName] = useState(null);
function inputChange(e) {
setUserName(e.target.value);
}
function getInputValue() {
console.log(userName);
}
return (
<div>
<input type="text" name="userName" onChange={inputChange} />
<button onClick={getInputValue}>TestValue</button>
</div>
);
}
总结
ref模式和非ref模式的区别
ref模式是在类组件或使用Hooks的函数组件中创建并使用ref的方式,可以用来访问和控制DOM节点或其他组件实例。非ref模式主要是指无状态组件,它们不支持ref。
受控组件和非受控组件的区别
React受控组件和非受控组件之间的最大区别是组件的值是由React状态控制还是由DOM节点控制。