简单手写实现元素的Ref

简介: 简单手写实现元素的Ref

简单手写实现元素的Ref


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

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

本文的目标是,手写实现元素的Ref

TL;DR

  • createRef 简单的返回{current:null}
  • 元素身上的ref,指向的就是{current:null},解析属性的时候,其current赋值为元素 DOM即可

准备工作

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

// import React from './source/react';
// import ReactDOM from './source/react-dom';
import React from 'react';
import ReactDOM from 'react-dom';
class Sum extends React.Component {
  constructor(props) {
    super(props);
    this.a = React.createRef();
    this.b = React.createRef();
    this.result = React.createRef();
  }
  handleAdd = () => {
    let a = this.a.current.value;
    let b = this.b.current.value;
    this.result.current.value = a + b;
  };
  render() {
    return (
      <>
        <input ref={this.a} />+<input ref={this.b} />
        <button onClick={this.handleAdd}>=</button>
        <input ref={this.result} />
      </>
    );
  }
}
const reactElement = <Sum />;
ReactDOM.render(reactElement, document.getElementById('root'));

输入框输入 1,2,点击=之后,看到 12:

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

分析 ref

  1. <input ref={this.a}>其实本质就是将this.a.current赋值为input的真实 DOM
  2. React.createRef()的返回值始终一致就是{current:null}

实现

1.增加 createRef 方法

丝毫无压力,直接在react.js里,加个方法,返回``即可

// react.js
const createRef = () => ({ current: null });
const React = {
  createElement,
  Component,
  createRef,
};

2.解析 ref 属性的时候,赋值当前元素 DOM

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

function updateProps(DOM, props) {
  // ...
  if (key === 'children') continue;
  if (key === 'ref') {
    // props是 {ref:{current:null},children:null}
    console.log('ref属性赋值', props, key, props[key]);
    props[key].current = DOM;
    continue;
  }
}

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

正常运行,✌️~~~

目录
相关文章
|
6月前
|
JavaScript Dubbo Java
还用 if(obj!=null) 做非空判断?带你快速上手 Optional 实战性理解
1.前言 2.认识Optional并使用 3.实战场景再现 4.Optional使用注意事项 5.jdk1.9对Optional优化
|
4月前
|
索引
07 # 手写 find 方法
07 # 手写 find 方法
20 0
|
4月前
|
索引
06 # 手写 map 方法
06 # 手写 map 方法
21 0
|
JavaScript 算法
|
前端开发
前端学习案例15-数组方法filter&undefined和null对比 原
前端学习案例15-数组方法filter&undefined和null对比 原
49 0
前端学习案例15-数组方法filter&undefined和null对比 原
|
前端开发
前端学习案例-ref的基本用法
前端学习案例-ref的基本用法
63 0
前端学习案例-ref的基本用法
|
前端开发 JavaScript
简单手写实现函数组件的Ref - forwardRef
简单手写实现函数组件的Ref - forwardRef
142 0
|
前端开发
简单手写实现类组件的Ref
简单手写实现类组件的Ref
73 0
|
存储 编译器 C语言
【C++要笑着学】list 核心框架接口的模拟实现 | 运算符重载实现list迭代器 | 妙用模板实现const迭代器(一)
我们在上一章说过,list 其实就是带哨兵位循环双向链表而已,这种链表虽然结构复杂,但是实现起来反而是最简单的,我们在数据结构专栏中有过详细的讲解。
158 0
【C++要笑着学】list 核心框架接口的模拟实现 | 运算符重载实现list迭代器 | 妙用模板实现const迭代器(一)
【C++要笑着学】list 核心框架接口的模拟实现 | 运算符重载实现list迭代器 | 妙用模板实现const迭代器(二)
我们在上一章说过,list 其实就是带哨兵位循环双向链表而已,这种链表虽然结构复杂,但是实现起来反而是最简单的,我们在数据结构专栏中有过详细的讲解。
61 0
【C++要笑着学】list 核心框架接口的模拟实现 | 运算符重载实现list迭代器 | 妙用模板实现const迭代器(二)