React 引用传递 Forwarding Refs

引用传递(Ref forwading)是一种通过组件向子组件自动传递 引用ref 的技术。对于应用者的大多数组件来说没什么作用。但是对于有些重复使用的组件,可能有用。例如某些input组件,需要控制其focus,本来是可以使用ref来控制,但是因为该input已被包裹在组件中,这时就需要使用Ref forward来透过组件获得该input的引用。

1.基本的使用:通过组件获得input的引用

  1. import React, { Component, createRef, forwardRef } from 'react';
  2. const FocusInput = forwardRef((props, ref) => (
  3. <input type="text" ref={ref} />
  4. ));
  5. class ForwardRef extends Component {
  6. constructor(props) {
  7. super(props);
  8. this.ref = createRef();
  9. }
  10. componentDidMount() {
  11. const { current } = this.ref;
  12. current.focus();
  13. }
  14. render() {
  15. return (
  16. <div>
  17. <p>forward ref</p>
  18. <FocusInput ref={this.ref} />
  19. </div>
  20. );
  21. }
  22. }
  23. export default ForwardRef;

核心方法是React.forwardRef,该方法接受一个有额外ref参数的react组件函数,不调用该方法,普通的组件函数是不会获得该参数的。
如果子组件中用到了该方法,那么对应的高阶组件中也需要使用React.forwardRef方法

  1. import React, { Component, createRef } from 'react';
  2. const FocusInput = React.forwardRef((props, ref) => <input type="text" ref={ref} />);
  3. const bindRef = (WrappedComponent) => {
  4. const ConvertRef = (props) => {
  5. const { forwardedRef, ...other } = props;
  6. console.log(forwardedRef);
  7. return <WrappedComponent {...other} ref={forwardedRef} />;
  8. };
  9. // “ref”是保留字段需要用普通的字段来代替,传递给传入的组件
  10. return React.forwardRef((props, ref) => {
  11. console.log(ref);
  12. return <ConvertRef {...props} forwardedRef={ref} />;
  13. });
  14. };
  15. const FocusInputWithRef = bindRef(FocusInput);
  16. class ForwardRef extends Component {
  17. constructor(props) {
  18. super(props);
  19. this.ref = createRef();
  20. }
  21. componentDidMount() {
  22. const { current } = this.ref;
  23. current.focus();
  24. }
  25. render() {
  26. return (
  27. <div>
  28. <p>forward ref</p>
  29. <FocusInputWithRef ref={this.ref} />
  30. </div>
  31. );
  32. }
  33. }
  34. export default ForwardRef;

Refs 使用场景

  • 处理焦点、文本选择或者媒体的控制
  • 触发必要的动画
  • 集成第三方 DOM 库


————————————————————————————————————
https://www.jianshu.com/p/fac884647720