为何Refs并非常规Props?React设计及19版本变化疑问
React把Refs和常规Props分开设计,核心是为了维护它的核心设计原则和避免潜在问题,具体来说有这几点:
区分声明式和命令式逻辑
Props是React声明式数据流的核心——你告诉React要渲染什么,它帮你处理渲染过程。而Refs是用来做命令式操作的,比如直接操作DOM节点、调用组件实例的方法。把两者分开,就是为了不让你把两种完全不同的编程逻辑混在一起,防止你因为滥用命令式操作,破坏了React数据流的可预测性。避免无意义的重渲染
常规Props只要变了,组件就会重渲染。但Ref的更新不需要触发渲染——你只是拿到一个节点或实例的引用,不需要重新渲染组件。如果把Ref当普通Props传,React没法判断这个Prop是用来传数据还是拿引用,很可能会导致没必要的重渲染,拖慢性能。单独的Ref机制让React能精准处理这类操作,跳过渲染流程。保护组件封装性
早期函数组件没有类组件那样的实例,要是允许随便通过Props传Ref,父组件很容易拿到子组件内部的DOM节点或状态细节,这相当于把组件的内部实现暴露出去了,不利于组件的复用和维护。后来的React.forwardRef是一种显式的方式让父组件能拿到子组件的内部节点,但这是开发者主动选择的,不是默认行为,这样能保持组件的封装性。历史设计的延续
React早期Ref主要是为类组件设计的,用来访问类组件实例或DOM。那时候函数组件还没有Hooks,本身没有状态和实例的直接访问方式。把Ref和Props分开,既能保持API一致性,也避免了在函数组件还不成熟的时候引入复杂的交互逻辑。
内容的提问来源于stack exchange,提问作者user26676509

