直接上代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.7.2/prop-types.js"></script>
<script type="text/babel">
class Demo extends React.Component {
// 创建一个ref容器
input3 = React.createRef();
render(){
return <div>
{/* 字符串形式的ref */}
<input ref="input1" type="text" placeholder="input1"/><button onClick={this.showInput1}>显示input1</button><br/>
{/* 回调函数形式的ref 回调的形参就是DOM的节点实例 写行内回调组件状态更新时会调用两次,第一次会传入null,为了清空上一次的ref,把回调绑定到class实例就可以避免这个问题 */}
<input ref={this.bindInput2Ref} type="text" placeholder="input2"/><button onClick={this.showInput2}>显示input2</button><br/>
{/* createRef()API绑定 一个ref对应一个返回的容器 通过current属性获取 最新版官方推荐的方式 */}
<input ref={this.input3} type="text" placeholder="input3"/><button onClick={this.showInput3}>显示input3</button><br/>
</div>
}
bindInput2Ref = (node) => {
this.input2 = node;
}
showInput1 = () => {
// 字符串形式的ref会被存储到实例对象的refs对象中,使用时直接通过key获取
window.alert(this.refs.input1.value)
}
showInput2 = () => {
// 回调形式的ref 绑在实例上了就直接从实例上获取
window.alert(this.input2.value)
}
showInput3 = () => {
// 通过createRef()获取的得到的是一个{current: value}形式的对象
window.alert(this.input3.current.value);
}
}
ReactDOM.render(<Demo/>,document.getElementById('app'))
</script>
</body>
</html>
官方推荐使用createRef的方式,尽量的少使用ref,然后就是字符串形式的ref官方不推荐使用了