当前位置:   article > 正文

React:高阶组件|ref转发

React:高阶组件|ref转发

高阶组件

        参考文档:高阶组件 – React (reactjs.org)

        高阶组件(Higher-Order Components,简称 HOC)是React中用于复用组件逻辑的一种高级技巧。具体而言:高阶组件是参数为组件,返回值为新组件的函数

        组件是将 props 转换为 UI,而高阶组件是将组件转换为另一个组件。

        HOC 在 React 的第三方库中很常见,例如 Redux 的 connect 和 Relay 的 createFragmentContainer

        此处不再搬运高阶组件具体如何使用的部分,详情参考React官网文档即可。

ref转发:forwardRef

        forwardRef函数的作用,

forwardRef 允许组件使用 ref 将 DOM 节点暴露给父组件。

        简单讲:就是让子级函数式组件除了props参数之外,额外拥有第二个参数ref;之后就可以在父组件中拿到这个ref,从而去调用子组件中暴露出来的方法。

  1. import { forwardRef } from 'react';
  2. const MyInput = forwardRef(function MyInput(props, ref) {
  3. // ...
  4. });

        然后在父组件中,可以定义ref属性,来拿到子组件的引用,伪代码示例如下,

  1. //这里是父组件
  2. export default ()=>{
  3. const myInputRef = useRef();
  4. //调用方式:
  5. //myInputRef.current.doXXX();
  6. return (<MyInput ref={myInputRef}/>);
  7. }

 暴露句柄:useImperativeHandle

        那么,通过forwardRef转发给子组件的ref所调用的具体方法/句柄如何定义呢?

useImperativeHandle 是 React 中的一个 Hook,它能让你自定义由 ref 暴露出来的句柄。

useImperativeHandle(ref, createHandle, dependencies?)

        例如:以下代码就为MyInput组件提供了doSomething句柄,供父组件通过ref来调用,

  1. import { forwardRef, useImperativeHandle } from 'react';
  2. const MyInput = forwardRef(function MyInput(props, ref) {
  3. useImperativeHandle(ref, () => {
  4. return {
  5. //向外暴露的句柄
  6. doSomething:() =>{
  7. console.log('here is children method!');
  8. return 'do-something'
  9. },
  10. };
  11. }, []);
  12. return <input {...props} />;
  13. });

完整示例代码

子组件:MyInput

  1. import { forwardRef, useImperativeHandle } from 'react';
  2. const MyInput = forwardRef(function MyInput(props, ref) {
  3. useImperativeHandle(ref, () => {
  4. return {
  5. //向外暴露的句柄
  6. doSomething:() =>{
  7. console.log('here is children method!');
  8. return 'do-something'
  9. },
  10. };
  11. }, []);
  12. return <input {...props} />;
  13. });

父组件

  1. //这里是父组件
  2. export default ()=>{
  3. const myInputRef = useRef();
  4. //调用方式:
  5. //myInputRef.current.doXXX();
  6. const clickHandler = ()=>{
  7. myInputRef.current.doSomething(/*params*/);
  8. }
  9. return (<>
  10. <MyInput ref={myInputRef}/>
  11. <button onClick={clickHandler}>click here</button>
  12. </>);
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/83008
推荐阅读
相关标签
  

闽ICP备14008679号