React Ref和 React forwardRef

更新日期: 2019-11-02 阅读: 2.8k 标签: refs

Ref 和dom,Ref是reference(引用)的简写。

能力:

大多数情况下,props前递可以解决一切问题,但是依然有需要触达react实例或者Dom节点的情况,这时候应该使用React Ref。

使用:

用来处理立即执行的动画。
用来处理非受控组件的焦点。
用来与第三方库对接,我知道的有d3 或者 cocos。


React.forwardRef((props,ref)=><Compnent>)

简而言之就是自动透传引用(Ref),能让组件接收传过来的ref, 向下(或者说向前)传递Ref。

const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="FancyButton">
    {props.children}
  </button>
));
 
// You can now get a ref directly to the DOM button:
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;

上述代码的解释:

首先创建了一个ref, 这个ref的目的就是抓到孙子组件中的input节点
通过组件属性把ref传给子组件<FancyButton>
子组件通过React.forwardRef透传props和ref,这里ref才是我们要注意的点。
参数ref赋值给孙子组件<button>
这个ref就能抓到孙子组件的实例。


React.forwardRef((props, ref)=><Componnet>)在高阶组件中的使用:

比如我们写一个打印前后属性的高阶组件logProps,这个高阶组件能够透传ref

function logProps(Component) {
  class LogProps extends React.Component {
    componentDidUpdate(prevProps) {
      console.log('old props:', prevProps);
      console.log('new props:', this.props);
    }

    render() {
      const {forwardedRef, ...rest} = this.props;
      // 把常规属性"forwardedRef"作为ref赋值给传过来的Component组件
      return <Component ref={forwardedRef} {...rest} />;
    }
  }

  // 注意React.forwardRef提供的第二个参数ref.
  // 我们可以把ref作为一个常规属性"forwardedRef"传给LogProps这个组件
  // 就可以跟实例绑定.
  return React.forwardRef((props, ref) => {
    return <LogProps {...props} forwardedRef={ref} />;
  });
}


    1.  

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/6246

相关推荐

vue中关于$refs获取子组件的DOM节点方法

目标是做一个向下滚动时到底自动加载的table效果。实现的思想其实很简单,就是获取到table里的tbody,然后滚动时计算下滚动高度,差不多到底了就加载更多。

vue 使用v-for动态生成的ref不能通过this.refs.name获取到内容

在vue的项目中做图片上传时,我通过上传图片后获取到input中的files属性将其进行处理,然后将其转换为base64传给后台。这个方法用在非v-for上动态生成的ref上时

在 React 组件中使用 Refs 指南

使用 React 时,我们的默认思维方式应该是 不会强制修改 DOM ,而是通过传入 props 重新渲染组件。但是,有些情况却无法避免修改 DOM 。React 中的 Refs 提供了一种访问 render() 方法

你想知道的关于 Refs 的知识都在这了

Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。在某些情况下,我们需要在典型数据流之外强制修改子组件,被修改的子组件可能是一个 React 组件的实例

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!