上节课我们深入讨论了一下关于回调式refs
被调用次数的问题,这节课我们来学洗另一个使用refs
的方法,就是createRef
回顾
在开始学习createRef
之前我们来对上节课的内容来做一个简单的回顾:
- 回调式
refs
会在页面第一次被渲染时调用一次 - 如果回调式
refs
是内联函数形式,那么在state
更新之后,会被重新调用两次 - 内联函数形式的回调式
refs
调用次数对程序不会有影响 - 类组件绑定函数的方式可以解决
refs
被多次调用的问题
以上便是对上节课内容的回顾,那么今天继续学习refs
的使用
createRef
的使用
我们先来看一下我们的代码:
class Demo extends React.Component { myRef = React.createRef(); render() { return( <div> <input ref={this.myRef} type="text" placeholder="click" /> <button onClick={this.showData} type="button">Click</button> </div> ); } showData = () => { console.log(this.myRef); }; }
我们好像看见了一个陌生的面孔,也是我们这节课的主角儿React.creatRef
,这个是干什么的呢?其实只要调用了React.createRef
那么就会得到一个容器,这个容器里面会收集所有被ref
属性标识的DOM
节点。
那看我们myRef = React.createRef();
这一步是做了什么啊?是不是把我们调用React.createRef
得到的容器放在组件实例对象自身上的myRef
属性了啊?那么我们在标签里的ref
属性就省心了。就直接ref={this.myRef}
。
那当react
通过组件实例对象调用了render
方法的时候发现这个input
标签里面有个ref
属相,而且这个属性还是React.createRef
返回的一个容器,那么是不是就自动把当前的DOM
节点传入到了这个容器中了?
那么好我们来看一下这个容器长什么样子。
大家可以看见这是一个对象,里面有一个current
属性,属性的值就是我们的input
标签所在节点。
那么我们要想拿到这个节点里的value
那么我们是不是要通过this.myRef.current.value
?那么我们来看一下效果吧。
输出结果正如我们所预期的一样。那我们就可以实现我们想要的功能了:
class Demo extends React.Component { myRef = React.createRef(); render() { return( <div> <input ref={this.myRef} type="text" placeholder="click" /> <button onClick={this.showData} type="button">Click</button> </div> ); } showData = () => { alert(this.myRef.current.value); }; }
我们是不是想要弹窗提醒啊?那我们看一下效果呗
我们的功能算是正常实现了。
那么有朋友要说了,那我们就都用createRef
吧,所有东西都往这存还挺好用的。不行!因为React.createRef
所返回的容器是“专人专用的”,也就是说这个容器只能存一个DOM
节点。比如这样:
class Demo extends React.Component { myRef = React.createRef(); render() { return ( <div> <input ref={this.myRef} type="text" placeholder="click" /> <button ref={this.myRef} onClick={this.showData} type="button">Click</button> </div> ); } showData = () => { console.log(this.myRef); }; }
大家看,我给下面的button
标签也加了ref={this.myRef}
,那么再来看一下效果
这回里面依然只又一个属性,因为button
标签中的ref
是后加的,所以就会把之前input
标签的节点给顶掉。所以说如果要有多个标签要添加ref
并且要用React.createRef
方法的话,那就得定义多个容器。那这样的话使用createRef
是不是太繁琐了?可是这个却是react
官方目前最推荐的一直形式。但是我们通常来说都不接受官方的推荐,我还是喜欢用回调的方式。
以上便是createRef
的用法
总结
createRef
可以返回一个容器用于存放被ref
属性标识的DOM
节点createRef
返回的容器“专人专用”- 如果多个标签要被标识,就要创建多个容器
Copyright statement:The articles of this site are all original if there is no special explanation, indicate the source please when you reprint.
Link of this article:https://work.lynchow.com/article/use_createRef/