所有分类
  • 所有分类
  • 后端开发

React:Ref在React中的交叉用法

React:React中Ref的交叉用法。

首先,解释什么是Ref。

Ref 转发是一个将军 ref 通过组件自动传输到其子组件的技能。这通常不是大多数应用程序中的组件所必需的。但它对某些组件非常有用,特别是可重用的组件库

Ref官网说明:点击此处

二、ref在hooks中的用法

1、HTMLDom在hooks中使用ref,官网例子:【https://zh-hans.reactjs.org/docs/hooks-reference.html#useref】。

const Fn = ()=>{
    const testRef = useRef(null);
    console.log('testRef',testRef.current); // 会渲染两次,第一次打印null,第二次是<div>测试</div>
    return (
        <div ref={testRef}>测试</div>
    )
}

2、在hooks中使用ref和函数组件,

只需将ref属性传输到函数组件中即可。

const Fn = ()=>{
    const testRef = useRef(null);
    // Test函数组件的定义
    const Test = ({ refs }) => <div ref={refs}>我是ReactDOM test</div>;
    console.log('testRef',testRef.current); // 会渲染两次,第一次打印null,第二次是<div>我是ReactDOM test</div>
    return (
        {/* 之所以使用refs而不是ref作为prop,是因为ref会被react特别处理,不会作为props传输到react组件,类似于key */}
         <Test refs={testRef} /> 
    )
}

3、在hooks中,ref与类组件一起使用

这里只需要在类组件的回调ref中手动赋值useref对象,更多的回调ref【https://zh-hans.reactjs.org/docs/hooks-faq.html#how-can-i-measure-a-dom-node】

import ReactDom from 'react-dom';

const Fn = ()=>{
    const testClassRef = useRef(null);
    // Testclass组件的定义
    class TestClass extends React.Component {
        render() {
          return (
            <div >
                我是Testclass组件 测试
            </div>
          )
        }
    }
    console.log('testClassRef',testClassRef.current); // 会渲染两次,第一次打印null,第二次是<div>我是Testclass组件 测试</div>
    return (
        {/* 之所以使用refs而不是ref作为prop,是因为ref会被react特别处理,不会作为props传输到react组件,类似于key */}
         <TestClass 
             ref={el => {
                console.log('new render refs')
                testClassRef.current = ReactDom.findDOMNode(el);
             }} 
         /> 
    )
}

4、hooks中的classref、react-redux一起使用

当遇到connect包裹的类组件时,因为最外层已经被包裹成react-reduxProvider,因此,有必要将ref属性传播到真实的react组件中,此时需要关注conect的forwardref属性。

import ReactDom from 'react-dom';
import { connect } from 'react-redux';

const Fn = ()=>{
    const testClassRef = useRef(null);
    // Testclass组件的定义
    class TestClass extends React.Component {
        render() {
          return (
            <div >
                我是Testclass组件 测试
            </div>
          )
        }
    }
    ///定义Testclassconect包裹后的组件
    //forwardRef:true 设置redux允许将ref作为props传输到connect包装的组件中
    const TestClassConnect = connect(null, null, null, { forwardRef: true })(TestClass);
    
    console.log('testClassRef',testClassRef.current); // 会渲染两次,第一次打印null,第二次是<div>我是Testclass组件 测试</div>
    return (
        {/* 之所以使用refs而不是ref作为prop,是因为ref会被react特别处理,不会作为props传输到react组件,类似于key */}
         <TestClassConnect
            ref={el => {
              console.log('new render refs')
              testClassRef.current = ReactDom.findDOMNode(el);
            }}
          />
    )
}

原文链接:https://www.icz.com/technicalinformation/web/seo/2023/05/9382.html,转载请注明出处~~~
0
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?