大家好,我是Kason。新的React文档有一个非常有趣的细节:引入了useRef和useEffect两个API,文档中的章节叫做EscapeHatches(逃生舱口)。显然,在正常航行期间不需要逃生舱,只有在遇到危险时才需要。如果开发者过分依赖这两个API,则可能是误用。在新的React文档:Don'tmisuseeffect中,我们谈到了useEffect的正确使用场景。今天,我们就来说说Ref.的??使用场景。欢迎加入人类优质前端框架群,为什么是逃生舱?先思考一个问题:ref和effect为什么要归入逃生舱?这是因为两者都在React无法控制的因素下运行。Effect处理副作用。例如:修改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后,会插入/移除P个节点,点击按钮2后,会调用DOMAPI移除P个节点:exportdefaultfunctionCounter(){const[show,setShow]=useState(true);constref=useRef(null);return(
