一般 ,我们就通过父组件向子组件传递数据,或者方法(从而获取子组件想要传递到父组件的数据),在子组件通过props 接收,以此达到数据的单向数据流,数据流动的方向仍然是从父组件到子组件(通过props传递方法),而子组件则通过回调函数将事件或数据传递回父组件
如果说 我现在不想通过props 传递了,我就想直接 在父组件里面调用子组件方法,改变子组件的属性呢? 这个岂不是违背了单向数据流???
可以采用 ref 的方式处理
子组件
首先 在子组件中,需要引入 react 的两个属性 useImperativeHandle
forwardRef
React.forwardRef
和 useImperativeHandle
是 React 中用于处理函数组件与 ref
相关的两个高级 API。它们允许函数组件接收和使用 ref
,这在某些场景下非常有用,比如当你需要将一个函数组件暴露给某些依赖于 ref
的库或者需要在父组件中直接访问子组件的方法或属性时。
React.forwardRef
是一个高阶组件(HOC),它接收一个渲染函数作为参数,并返回一个新的函数组件。这个新的组件能够接收一个 ref
属性,并将其转发到渲染函数中的一个子组件上
useImperativeHandle
是一个自定义 Hook,它允许你在使用 React.forwardRef
的函数组件中定制暴露给父组件的实例值。这个 Hook 应该在函数组件内部与 React.forwardRef
一起使用。
只有在 子组件内部 使用这两个属性包裹,这个方法才被暴露出去了,在父组件才可以调用
父组件
在父组件中 给这个子组件绑定ref
const hmaccordionRef = useRef(null)
以上就可以实现 父组件调用子组件的方法,通过ref了