简单手写实现类组件的Ref

简介: 简单手写实现类组件的Ref

简单手写实现类组件的Ref


继续学习写源码系列,本系列是学习系列。

  1. 简单手写实现 React 的 createElement 和 render,里面有准备工作,不再赘述。
  2. 简单手写实现 react 的函数组件
  3. 简单手写实现 react 的类组件
  4. 简单手写实现 React 类组件的 state 更新
  5. 简单手写实现 React 类组件的 state 批量更新
  6. 简单手写实现元素的 Ref

本文的目标是,手写实现类组件的Ref

TL;DR

  • createRef 仍然简单的返回{current:null}
  • 类组件身上的ref,指向的就是{current:null},解析属性的时候,其current赋值为类组件的实例

准备工作

先将index.js的点击事件略微修改

// import React from './source/react';
// import ReactDOM from './source/react-dom';
import React from 'react';
import ReactDOM from 'react-dom';
class Form extends React.Component {
  constructor(props) {
    super(props);
    this.textInputRef = React.createRef();
  }
  getFocus = () => {
    // this.textInputRef.current指的是TextInput类的实例,实例有getFocus方法
    this.textInputRef.current.getFocus();
  };
  render() {
    return (
      <>
        <TextInput ref={this.textInputRef} />
        <button onClick={this.getFocus}>获得焦点</button>
      </>
    );
  }
}
class TextInput extends React.Component {
  constructor(props) {
    super(props);
    this.input = React.createRef();
  }
  getFocus = () => {
    this.input.current.focus();
  };
  render() {
    return <input ref={this.input} />;
  }
}
ReactDOM.render(<Form />, document.getElementById('root'));

点击获得焦点,输入框获得焦点:

网络异常,图片无法展示
|

分析 ref

  1. <TextInput ref={this.textInputRef} />其实本质就是将this.textInputRef赋值为TextInput类的实例
  2. React.createRef()的返回值始终一致就是{current:null}(元素的时候说过)

实现

1.解析 ref 属性的时候,赋值当前类组件实例

这个也简单,props 属性解析的时候,赋值就好

// react-dom.js
const handleClassType = (vdom) => {
  const { type: classFn, props } = vdom;
  const instance = new classFn(props);
  // props.ref在的话,将实例赋值到ref上 {props:{ref:{current:null}}
  props.ref && (props.ref.current = instance);
  // ...
};

老规矩,index.js打开自己文件的路径

正常运行,✌️~~~

目录
相关文章
|
API
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果。前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html
431 0
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
|
2天前
|
Python
Validator 类的设计和简单实现
Validator 类的设计和简单实现
32 0
|
2天前
|
Java Spring 容器
面试题:Spring框架中,一个组件是怎样向自己内部注入组件的
面试题:Spring框架中,一个组件是怎样向自己内部注入组件的
15 0
|
2天前
|
设计模式 Java 数据库连接
面试题:一个组件向自己内部注入组件有哪些方法?
面试题:一个组件向自己内部注入组件有哪些方法?
24 0
|
2天前
|
Java Spring 容器
面试题:在spring框架下面,Bean的属性lazy-init有什么作用,默认值是多少
面试题:在spring框架下面,Bean的属性lazy-init有什么作用,默认值是多少
17 0
|
2天前
|
Java Spring 容器
Spring注解驱动开发二组件赋值-@Value和@PropertySource及XXXXAware接口
Spring注解驱动开发二组件赋值-@Value和@PropertySource及XXXXAware接口
28 0
|
8月前
|
XML Java 数据格式
面试题@Component和@Bean的区别
面试题@Component和@Bean的区别
142 0
|
前端开发 JavaScript
简单手写实现函数组件的Ref - forwardRef
简单手写实现函数组件的Ref - forwardRef
143 0
|
Java 索引 Spring
【Spring注解必知必会】深度解析@Component注解实现原理
【Spring注解必知必会】深度解析@Component注解实现原理
233 0
【Spring注解必知必会】深度解析@Component注解实现原理
|
Java 自动驾驶 小程序
java面试题:哪种依赖注入方式你建议使用,构造器注入,还是Setter方法 注入?
java面试题:哪种依赖注入方式你建议使用,构造器注入,还是Setter方法 注入?
java面试题:哪种依赖注入方式你建议使用,构造器注入,还是Setter方法 注入?