深入浅出:在 mini-react 中实现事件绑定系统

《深入浅出:在 mini-react 中实现事件绑定系统》

在前端开发领域,React 框架的高效性和灵活性使其成为众多开发者构建用户界面的首选。为了更好地理解 React 的核心原理,许多开发者尝试从零开始实现一个简化版的 React,即 "mini-react"。本文将带你深入了解如何在 mini-react 项目中实现事件绑定功能,让你对 React 的事件处理机制有更清晰的认识。

一、在组件中添加点击事件

事件绑定是构建交互式用户界面的关键。我们首先在 app.jsx 文件中的 Counter 组件上添加一个 click 事件。通过定义 handleClick 函数,当按钮被点击时,会在控制台输出 "click",这是最基础的事件监听设置。

tsx 复制代码
import React from './core/React.js';

function Counter({ num }) {
  function handleClick() {
    console.log("click")
  }
  return <div>
    count: {num} 
    <button onClick={handleClick}>点击</button>
  </div>
}

function App() {
  return <div>
    hi-mini-react
    <Counter num={10}></Counter> 
    {/* <Counter num={20}></Counter> */}
  </div>
}
export default App;

二、观察 Fiber 结构

为了更好地理解 mini-react 内部是如何处理 DOM 元素和事件的,我们在 initChildren 函数中添加了打印语句,用于观察 Fiber 树中 button 元素的结构。这有助于我们后续对事件绑定进行更精准的处理。

tsx 复制代码
function initChildren(fiber, children) {
    console.log('fiber -->', fiber)
    let prevChild = null
    children.forEach((child, index) => {
        const newFiber = {
            type: child.type,
            props: child.props,
            child: null,
            parent: fiber,
            sibling: null,
            dom: null
        }
        if (index === 0) {
            fiber.child = newFiber
        } else {
            prevChild.sibling = newFiber
        }
        prevChild = newFiber
    }) 
}

三、实现事件绑定逻辑

在 mini-react 中,我们通过识别 props 中以 "on" 开头的属性来判断这是一个事件。在 updateProps 函数中,我们将事件名转换为小写,并使用 addEventListener 方法将事件绑定到对应的 DOM 元素上。这一过程使得我们的 mini-react 能够支持多种事件类型,而不仅仅是 click 事件。

typescript 复制代码
function updateProps(dom, props) {
    Object.keys(props).forEach((key) => {
        if (key !== "children") {
            // onClick -> click
            if (key.startsWith("on")) {
                const eventType = key.slice(2).toLowerCase()
                dom.addEventListener(eventType, props[key])
            } else {
                dom[key] = props[key];
            }
        }
    });
}

通过以上步骤,我们成功地在 mini-react 项目中实现了事件绑定功能。这不仅增强了 mini-react 的实用性,也为我们深入理解 React 的事件处理机制提供了宝贵的经验。希望这篇文章能帮助你更好地掌握前端开发中的事件处理技巧,为你的项目开发提供有力支持。

相关推荐
雪芽蓝域zzs1 分钟前
(六)打包优化 + Nginx 部署完整配置 + 项目收尾
前端·vue.js
研☆香10 分钟前
聊一聊前端的常见字 关键字
开发语言·前端·javascript
东风破_28 分钟前
JWT 1:从一个登录请求开始,理解 React 项目里的 API 层与 Mock
前端·后端
东风破_33 分钟前
JWT 3:为什么 Token 要放进 Authorization?Axios 拦截器到底解决了什么?
前端·后端
东风破_34 分钟前
JWT 5:路由守卫是什么?把整个 JWT 登录鉴权流程串起来
前端·后端
东风破_35 分钟前
JWT 2:HTTP 是无状态的,为什么登录成功后还要给 Token?
前端·后端
东风破_42 分钟前
JWT 4:Zustand 到底解决了什么?为什么登录状态要放进 Store?
前端·后端
IT_陈寒1 小时前
Vite动态导入差点让我秃头,原来问题出在这
前端·人工智能·后端
白泽_hunter1 小时前
项目里最常见的 5 个 this 指向坑:从规则到实战彻底讲透
前端
宿6741 小时前
vue3-pinia
前端·vue.js