通过props传递ref对象给子组件:该写法是否符合React规范?
这种写法完全不违反React原则,也几乎不存在未来的兼容性问题,下面给你拆解清楚:
先明确React ref的本质
useRef创建的是一个可变的容器对象,它的current属性可以在组件渲染周期之外自由修改,而且不会触发组件重渲染——这本身就是React设计ref的核心用途之一:存储那些不需要触发视图更新的可变值。你这里用它存数组,完全符合ref的使用场景。子组件修改数组的逻辑没问题
数组是引用类型,父组件把myRef.current(也就是数组的引用)通过props传给子组件,子组件调用push修改数组内容,本质上和在父组件里直接执行myRef.current.push()是一样的——因为两者操作的是同一个内存地址里的数组。React对这种操作没有任何限制,因为ref的可变特性就是允许这种跨组件的引用修改的。兼容性无需担心
从React 16.8引入hooks至今,useRef的这个行为从来没有变过,未来也不太可能改动——这是ref的基础设计逻辑。只要你不做替换current引用的操作(比如子组件里写props.array = [4,5,6],这属于直接修改props的赋值,而不是修改数组内容,props本身是只读的,但你这里只是修改数组内部元素,完全没问题),就不会有兼容性风险。关于子组件用独立ref存储的对比
如果你的需求就是让子组件修改父组件的这个数组,那完全没必要在子组件里存独立ref——多此一举。但如果子组件需要保留父组件传入的初始数组副本,修改副本不影响父组件的原数组,那才需要用独立ref并做数组拷贝(比如const childRef = useRef([...props.array]))。你的场景里父组件不需要重渲染且符合预期,直接操作传入的数组引用更高效直接。
最后提醒一句:这种写法的前提是你明确知道这个数组的修改不需要触发组件重渲染。如果未来父组件需要根据这个数组更新UI,那应该把数组存在state里而不是ref里,因为state变化会触发重渲染更新视图。
内容的提问来源于stack exchange,提问作者stefkrger

