大家好,我是Kason。新的React文档有一个非常有趣的细节:引入了useRef和useEffect两个API,文档中的章节叫做EscapeHatches(逃生舱口)。显然,在正常航行期间不需要逃生舱,只有在遇到危险时才需要。如果开发者过分依赖这两个API,则可能是误用。在新的React文档:Don'tabuseeffect中,我们谈到了useEffect的正确使用场景。今天,我们就来说说Ref.的??使用场景。为什么是逃生舱?先思考一个问题:为什么ref和effect被归类为“逃生舱口”?这是因为两者都对“React无法控制的因素”起作用。实际上处理的是“副作用”。例如:修改useEffect中的document.title。document.title在React中不属于state,React无法感知它的变化,所以归类到effect中。同样,“聚焦DOM”需要调用element.focus(),直接执行DOMAPI不受React控制。虽然它们是“React无法控制的因素”,但为了保证应用程序的健壮性,React应该尽量避免它们失控。Ref失控对于Ref,什么是失控?我们先来看“没有失控”的情况:执行ref.current的focus、blur等方法。执行ref.current.scrollIntoView使元素滚动到视图中。执行ref.current.getBoundingClientRect以测量DOM大小。在这些情况下,虽然我们对DOM进行了操作,但涉及到“React无法控制的因素”,所以并不是失控。但是下面的情况:执行ref.current.remove来移除DOM。执行ref.current.appendChild插入子节点。同样是操作DOM,但这些都是“React控制范围内的因素”,通过ref进行这些操作是不受控制的。比如下面是React文档[1]中的例子:“Button1”点击后会插入/移除P节点,“Button2”点击后会调用DOMAPI移除P节点:exportdefault函数Counter(){const[show,setShow]=useState(true);constref=useRef(null);return(
