40行代码内实现一个React.js

reactjs 源码 代码示例 立即下载

 

2017-03-20 胡子大哈 前端开发

来自:前端大哈 - 知乎专栏

作者:胡子大哈

链接:https://zhuanlan.zhihu.com/p/25398176(点击尾部阅读原文前往)

 

目录

1 前言

2 一切从点赞说起

3 实现可复用性

3.1 结构复用

3.2 生成 DOM 元素并且添加事件

4 为什么不暴力一点?

4.1 状态改变 -> 构建新的 DOM 元素

4.2 重新插入新的 DOM 元素

5 抽象出 Component 类

6 总结

1、前言

本文会教你如何在 40 行代码内,不依赖任何第三方的库,用纯 JavaScript 实现一个 React.js 。

 

本文的目的是:揭开对初学者看起来很很难理解的 React.js 的组件化形式的外衣。如果你刚开始学习 React.js 并且感觉很迷茫,那么看完这篇文章以后就能够解除一些疑惑。

 

另外注意,本文所实现的代码只用于说明教学展示,并不适用于生产环境。代码托管这个 仓库。心急如焚的同学可以先去看代码,但本文会从最基础的内容开始解释。

 

2、一切从点赞说起

接下来所有的代码都会从一个基本的点赞功能开始演化,你会逐渐看到,文章代码慢慢地越来越像React.js 的组件代码。而在这个过程里面,大家需要只需要跟着文章的思路,就可以在代码的演化当中体会到组件化形式。

 

假设现在我们需要实现一个点赞、取消点赞的功能。

 

如果你对前端稍微有一点了解,你就顺手拈来:

 

HTML:

  <body>
    <div class='wrapper'>
      <button class='like-btn'>
        <span class='like-text'>点赞</span>
        <span>?</span>
      </button>
    </div>
  </body>

为了现实当中的实际情况,所以这里特意把这个 button 的 HTML 结构搞得稍微复杂一些。有了这个 HTML 结构,现在就给它加入一些 JavaScript 的行为:

JavaScript:

  const button = document.querySelector('.like-btn')
  const buttonText = button.querySelector('.like-text')
  let isLiked = false
  button.addEventListener('click', function () {
    isLiked = !isLiked
    if (isLiked) {
      buttonText.innerHTML = '取消'
    } else {
      buttonText.innerHTML = '点赞'
    }
  }, false)

功能和实现都很简单,按钮已经可以提供点赞和取消点赞的功能。这时候你的同事跑过来了,说他很喜欢你的按钮,他也想用你写的这个点赞功能。你就会发现这种实现方式很致命:你的同事要把整个 button 和里面的结构复制过去,还有整段 JavaScript 代码也要复制过去。这样的实现方式没有任何可复用性。

3 实现可复用性

所以现在我们来想办法解决这个问题,让这个点赞功能具有较好的可复用的效果,那么你的同事们就可以轻松自在地使用这个点赞功能。

3.1 结构复用

现在我们来重新编写这个点赞功能。这次我们先写一个类,这个类有 render 方法,这个方法里面直接返回一个表示 HTML 结构的字符串:

  class LikeButton {
    render () {
      return `
        <button class='like-btn'>
          <span class='like-text'>赞</span>
          <span>?</span>
        </button>
      `
    }
  }

然后可以用这个类来构建不同的点赞功能的实例,然后把它们插到页面中。

  1.   const wrapper = document.querySelector('.wrapper')
      const likeButton1 = new LikeButton()
      wrapper.innerHTML = likeButton1.render()
    
      const likeButton2 = new LikeButton()
      wrapper.innerHTML += likeButton2.render()

这里非常暴力地使用了 innerHTML ,把两个按钮粗鲁地插入了 wrapper 当中。虽然你可能会对这种实现方式非常不满意,但我们还是勉强了实现了结构的复用。我们后面再来优化它。

3.2 生成 DOM 元素并且添加事件

你一定会发现,现在的按钮是死的,你点击它它根本不会有什么反应。因为根本没有往上面添加事件。但是问题来了,LikeButton 类里面是虽然说有一个 button,但是这玩意根本就是在字符串里面的。你怎么能往一个字符串里面添加事件呢?DOM 事件的 API 只有 DOM 结构才能用。

我们需要 DOM 结构,准确地来说:我们需要这个点赞功能的 HTML 字符串代表的 DOM 结构。假设我们现在有一个函数 createDOMFromString ,你往这个函数传入 HTML 字符串,但是它会把相应的 DOM 元素返回给你。这个问题就可以额解决了。

// ::String => ::Document
const createDOMFromString = (domString) => {
  // TODO 
}

先不用管这个函数应该怎么实现,先知道它是干嘛的。拿来用就好,这时候用它来改写一下 LikeButton 类:

  class LikeButton {
    render () {
      this.el = createDOMFromString(`
        <button class='like-btn'>
          <span class='like-text'>点赞</span>
          <span>?</span>
        </button>
      `)
      this.el.addEventListener('click', () => console.log('click'), false)
      return this.el
    }
  }

现在 render() 返回的不是一个 html 字符串了,而是一个由这个 html 字符串所生成的 DOM。在返回 DOM 元素之前会先给这个 DOM 元素上添加事件再返回。

因为现在 render 返回的是 DOM 元素,所以不能用 innerHTML 暴力地插入 wrapper。而是要用 DOM API 插进去。

  const wrapper = document.querySelector('.wrapper')

  const likeButton1 = new LikeButton()
  wrapper.appendChild(likeButton1.render())

  const likeButton2 = new LikeButton()
  wrapper.appendChild(likeButton2.render())

现在你点击这两个按钮,每个按钮都会在控制台打印 click,说明事件绑定成功了。但是按钮上的文本还是没有发生改变,只要稍微改动一下 LikeButton 的代码就可以完成完整的功能:

  class LikeButton {
    constructor () {
      this.state = { isLiked: false }
    }

    changeLikeText () {
      const likeText = this.el.querySelector('.like-text')
      this.state.isLiked = !this.state.isLiked
      if (this.state.isLiked) {
        likeText.innerHTML = '取消'
      } else {
        likeText.innerHTML = '点赞'
      }
    }

    render () {
      this.el = createDOMFromString(`
        <button class='like-btn'>
          <span class='like-text'>点赞</span>
          <span>?</span>
        </button>
      `)
      this.el.addEventListener('click', this.changeLikeText.bind(this), false)
      return this.el
    }
  }

这里的代码稍微长了一些,但是还是很好理解。只不过是在给 LikeButton 类添加了构造函数,这个构造函数会给每一个 LikeButton 的实例添加一个对象 state,state 里面保存了每个按钮自己是否点赞的状态。还改写了原来的事件绑定函数:原来只打印 click,现在点击的按钮的时候会调用 changeLikeText 方法,这个方法会根据 this.state 的状态改变点赞按钮的文本。

如果你现在还能跟得上文章的思路,那么你留意下,现在的代码已经和 React.js 的组件代码有点类似了。但其实我们根本没有讲 React.js 的任何内容,我们一心一意只想怎么做好“组件化”。

现在这个组件的可复用性已经很不错了,你的同事们只要实例化一下然后插入到 DOM 里面去就好了。

4 为什么不暴力一点?

仔细留意一下 changeLikeText 函数,这个函数包含了 DOM 操作,现在看起来比较简单,那是因为现在只有 isLiked 一个状态。但想一下,因为你的数据状态改变了你就需要去更新页面的内容,所以如果你的组件包含了很多状态,那么你的组件基本全部都是 DOM 操作。一个组件包含很多状态的情况非常常见,所以这里还有优化的空间:如何尽量减少这种手动 DOM 操作?

4.1 状态改变 -> 构建新的 DOM 元素

这里要提出的一种解决方案:一旦状态发生改变,就重新调用 render 方法,构建一个新的 DOM 元素。这样做的好处是什么呢?好处就是你可以在 render 方法里面使用最新的 this.state 来构造不同 HTML 结构的字符串,并且通过这个字符串构造不同的 DOM 元素。页面就更新了!听起来有点绕,看看代码怎么写:

  class LikeButton {
    constructor () {
      this.state = { isLiked: false }
    }

    setState (state) {
      this.state = state
      this.el = this.render()
    }

    changeLikeText () {
      this.setState({
        isLiked: !this.state.isLiked
      })
    }

    render () {
      this.el = createDOMFromString(`
        <button class='like-btn'>
          <span class='like-text'>${this.state.isLiked ? '取消' : '点赞'}</span>
          <span>?</span>
        </button>
      `)
      this.el.addEventListener('click', this.changeLikeText.bind(this), false)
      return this.el
    }
  }

其实只是改了几个小地方:

  1. render 函数里面的 HTML 字符串会根据 this.state 不同而不同(这里是用了 ES6 的字符串特性,做这种事情很方便)。
  2. 新增一个 setState 函数,这个函数接受一个对象作为参数;它会设置实例的 state,然后重新调用一下 render 方法。
  3. 当用户点击按钮的时候, changeLikeText 会构建新的 state 对象,这个新的 state ,传入 setState 函数当中。

这样的结果就是,用户每次点击,changeLikeText 都会调用改变组件状态然后调用 setState;setState 会调用 render 方法重新构建新的 DOM 元素;render 方法会根据 state 的不同构建不同的 DOM 元素。

也就是说,你只要调用 setState,组件就会重新渲染。我们顺利地消除了没必要的 DOM 操作。

4.2 重新插入新的 DOM 元素

上面的改进不会有什么效果,因为你仔细看一下就会发现,其实重新渲染的 DOM 元素并没有插入到页面当中。所以这个组件之外,你需要知道这个组件发生了改变,并且把新的 DOM 元素更新到页面当中。

重新修改一下 setState 方法:

...
    setState (state) {
      const oldEl = this.el
      this.state = state
      this.el = this.render()
      if (this.onStateChange) this.onStateChange(oldEl, this.el)
    }
...

使用这个组件的时候:

const likeButton = new LikeButton()
wrapper.appendChild(likeButton.render()) // 第一次插入 DOM 元素
component.onStateChange = (oldEl, newEl) => {
  wrapper.insertBefore(newEl, oldEl) // 插入新的元素
  wrapper.removeChild(oldEl) // 删除旧的元素
}

这里每次 setState 都会调用 onStateChange 方法,而这个方法是实例化以后时候被设置的,所以你可以自定义 onStateChange 的行为。这里做的事是,每当 setState 的时候,就会把插入新的 DOM 元素,然后删除旧的元素,页面就更新了。这里已经做到了进一步的优化了:现在不需要再手动更新页面了。

非一般的暴力。不过没有关系,这种暴力行为可以被 Virtual-DOM 的 diff 策略规避掉,但这不是本文章所讨论的范围。

这个版本的点赞功能很不错,我可以继续往上面加功能,而且还不需要手动操作DOM。但是有一个不好的地方,如果我要重新另外做一个新组件,譬如说评论组件,那么里面的这些 setState 方法要重新写一遍,其实这些东西都可以抽出来。

5 抽象出 Component 类

为了让代码更灵活,可以写更多的组件,我把这种模式抽象出来,放到一个 Component 类当中:

  class Component {
    constructor (props = {}) {
      this.props = props
    }

    setState (state) {
      const oldEl = this.el
      this.state = state
      this.el = this.renderDOM()
      if (this.onStateChange) this.onStateChange(oldEl, this.el)
    }

    renderDOM () {
      this.el = createDOMFromString(this.render())
      if (this.onClick) {
        this.el.addEventListener('click', this.onClick.bind(this), false)
      }
      return this.el
    }
  }

还有一个额外的 mount 的方法,其实就是把组件的 DOM 元素插入页面,并且在 setState 的时候更新页面:

  const mount = (wrapper, component) => {
    wrapper.appendChild(component.renderDOM())
    component.onStateChange = (oldEl, newEl) => {
      wrapper.insertBefore(newEl, oldEl)
      wrapper.removeChild(oldEl)
    }
  }

这样的话我们重新写点赞组件就会变成:

  class LikeButton extends Component {
    constructor (props) {
      super(props)
      this.state = { isLiked: false }
    }

    onClick () {
      this.setState({
        isLiked: !this.state.isLiked
      })
    }

    render () {
      return `
        <button class='like-btn'>
          <span class='like-text'>${this.props.word || ''} ${this.state.isLiked ? '取消' : '点赞'}</span>
          <span>?</span>
        </button>
      `
    }
  }

  mount(wrapper, new LikeButton({ word: 'hello' }))

有没有发现你写的代码已经和 React.js 的组件写法很相似了?而且还是可以正常运作的代码,而且我们从头到尾都是用纯的 JavaScript,没有依赖任何第三方库。(注意这里加入了上面没有提到过点 props,可以给组件传入配置属性,跟 React.js 一样)。

只要有了上面那个 Component 类和 mount 方法加起来不足40行代码就可以做到组件化。如果我们需要写另外一个组件,只需要像上面那样,简单地继承一下 Component 类就好了:

  class RedBlueButton extends Component {
    constructor (props) {
      super(props)
      this.state = {
        color: 'red'
      }
    }

    onClick () {
      this.setState({
        color: 'blue'
      })
    }

    render () {
      return `
        <div style='color: ${this.state.color};'>${this.state.color}</div>
      `
    }
  }

简单好用,完整的代码可以在这里找到: React.js in 40

噢,忘了,还有一个神秘的 createDOMFromString,其实它更简单:

  const createDOMFromString = (domString) => {
    const div = document.createElement('div')
    div.innerHTML = domString
    return div
  }

6 总结

你到底能从文章中获取到什么?

好吧,我承认我标题党了,这个 40 行不到的代码其实是一个残废而且智障版的 React.js,没有 JSX ,没有组件嵌套等等。它只是 React.js 组件化表现形式的一种实现而已。

React 的 setState 、props 等等都只不过是一种形式,而很多初学者会被它这种形式作迷惑。本篇文章其实就是揭露了这种组件化形式的实现原理。如果你正在学习或者学习 React.js 过程很迷茫,那么看完这篇文章以后就能够解除一些疑惑。

本文并没有涉及到 Virtual DOM 的任何内容,有需要的同学可以参考一下这篇博客 ,介绍的很详尽。有兴趣的同学可以把两者结合起来,把 Virtual DOM 替代本文暴力处理的 mount 中的实现,真正实现一个 React.js。

 

 

手把手带你用85行代码实现一个React.js(详细讲解)

https://www.qdskill.com/frames/react/8534.html

2、欧洲期权的赫斯顿模型 本文详细介绍了赫斯顿随机波动率模型在欧洲期权定价中的应用。模型通过引入随机方差过程,克服了布莱克-斯科尔斯模型中波动率恒定的局限性,更贴近市场实际。文章阐述了模型的动态结构、风险中性转换、期权定价公式及其半封闭解的计算方法,并提供了基于VBA的数值实现方案。通过梯形法则与高斯积分等数值方法对比,分析了不同积分策略的精度与效率。同时验证了当波动率为零时,赫斯顿模型退化为布莱克-斯科尔斯模型的一致性。最后讨论了模型的优势、挑战及实际应用建议,强调了数值积分稳定性和参数估计的重要性。 阅读详情

相关推荐

Fanuc机器人的坐标变换矩阵的研究2

一、Funuc用户坐标系的介绍 二、用户坐标系与世界坐标系的坐标转换 三、 以用户坐标系1为基础旋转变换后的用户坐标系 四、关于点的WPR的含义 4.1:点在用户坐标系和世界坐标系下的坐标关系 4.2 通过转换矩阵返回去推导WPR

qq_34047402的博客 1522

react特点与Vue对比

React是由Facebook研发的、用于解决UI复杂度的开源JavaScript库,目前由React联合社区维护。它不是框架,只是为了解决UI复杂度而诞生的一个库。

wejdsjja的博客 729

Cadence IC618与Spectre231安装:环境变量与License配置详解

在Linux系统中部署Virtuoso等EDA工具时,环境变量与License管理是决定工具能否顺利启动的核心环节。环境变量决定了系统如何找到工具二进制文件以及工具如何定位自身资源,而License则通过FlexLM授权机制控制工具的使用权限。理解PATH、CDS_ROOT、CDS_LIC_FILE等关键变量的作用,掌握lmgrd服务与lmstat验证方法,能显著减少安装后启动失败的概率。无论是学生初装Cadence IC618与Spectre231,还是实验室工作站需要搭建可用的模拟设计环境,理顺环境变量

weixin_29192365的博客 368

【夯实基础】react16-学习笔记

Facebook起草的JS扩展语法本质是一个JS对象,会被babel编译,最终会被转换为React.createElement每个JSX表达式,有且仅有一个根节点每个JSX元素必须结束(XML规范)

aXin_li的博客 1487

Python爬虫实战:绕过B站-352风控的完整解决方案

网络爬虫技术是数据采集和自动化测试的重要工具,其核心原理是通过模拟HTTP请求获取网页数据。在实践过程中,开发者常会遇到网站反爬机制,这涉及请求指纹识别、IP行为分析等安全技术。这些风控措施的价值在于保护网站数据安全和服务器资源,广泛应用于电商、社交、内容平台等场景。针对B站等平台的-352风控错误,需要综合运用请求头伪装、会话管理、参数签名破解等技术方案。本文重点探讨如何通过构建完整的浏览器级请求头、管理Cookie会话、以及使用Playwright等浏览器自动化工具,有效解决Python爬虫在B站数据采

weixin_33912638的博客 391

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

React基础笔记(一)

React基础笔记欢迎大佬来看萌新写的笔记什么是React?React的特点react特点和优势:如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎大佬来看萌新写的笔记 什么是React? React是一个声明式,高效且灵活的用于构建用户界面的JavaScript 库。

guchiccc的博客 755

视觉媒体通信作业记录(六)端到端的视频传输系统

将采集、编码、传输、显示各模块连接起来,形成一个端到端的视频通信系统,开发一个特色模块,将其加入系统;

weixin_45774698的博客 1967

react-Hybrid App实现点赞评论功能--朋友圈功能

1、需求: 一个动态发布软件,可进行点赞评论,取消赞,删除评论。 2、实现思路: 首先需要进行实时点赞评论等操作。不可能去实时刷新页面进行渲染进行操作。所以我们需要将这些数据存储到我们本地的一个新数组当中。 当首次渲染的时候,我们设定一个本地数组来存接口渲染出来的数据。当我们进行操作的时候,再将需要操作的数据push到我们自己的数组当中。所以总结来说:点赞取消 评论 删除评论,也就是对数组的增删操作。 对于所需要操作的模块来说,一定需要将其抽取为单独组件。只有这样,才好对数据进行管理处理。 3、

WebView 1245

基于OpenClaw的自动化文件管理与文档分类系统设计与实现

本文介绍了一种基于OpenClaw的自动化文件管理与文档分类系统。系统采用三层架构设计,包含数据层、逻辑层和应用层,核心组件涵盖文件扫描、处理、分类、移动等功能。技术选型上使用Python/FastAPI作为后端,结合PostgreSQL/Elasticsearch/MinIO存储方案,并整合scikit-learn/PyTorch等AI技术实现智能分类。系统实现了文件递归扫描、增量扫描、元数据提取等功能,通过文件哈希和修改时间检测变化。该方案能有效提升文件管理效率,实现文档的自动化分类与智能管理。

一键难忘的博客 753

10、X射线聚焦与光学元件技术解析

本文深入解析了X射线聚焦与光学元件技术,重点讨论了椭圆镜的聚焦原理及局限性,多层镜的设计优化及其突破性应用,以及X射线波导的基础理论和模式求解方法。文章还总结了这些技术的优势、局限及其在材料科学、生物学和医学等领域的广泛应用前景。通过理论推导与技术改进,这些光学元件为X射线成像技术的发展提供了重要支撑。

pz890123的博客 121

13个React代码片段汇总

英文 | https://medium.com/frontend-canteen/a-summary-of-react-by-10-code-snippets-15aca7c5a8c801、Create React App$ create-react-app YOUR_APP_NAMECreate React App 是一个用于创建 React 项目的 CLI。02、JSXconst eleme...

web前端开发 743

3.摄像头组件- CVP (ISP)

本文介绍 车载摄像头组件-ISP

2401_83458819的博客 1616

react实现汉堡_40 行代码内实现一个 React.js

转载请注明出处,保留原文链接和作者信息。目录1 前言2 一切从点赞说起3 实现可复用性3.1 结构复用3.2 生成 DOM 元素并且添加事件4 为什么不暴力一点?4.1 状态改变 -> 构建新的 DOM 元素4.2 重新插入新的 DOM 元素5 抽象出 Component 类6 总结1 前言本文会教你如何在 50 行代码内,不依赖任何第三方的库,用纯 JavaScript 实现一个 Reac...

weixin_29798439的博客 155

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

40 行代码内实现一个 React.js

作者:胡子大哈 原文链接:https://zhuanlan.zhihu.com/p/25398176 来源:知乎专栏:前端大哈 转载于:https://www.cnblogs.com/muqiao/p/9078009.html

annuchao0059的博客 168

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

react里做一个修改效果_40行代码内实现一个React.js

目录1 前言2 一切从点赞说起3 实现可复用性3.1 结构复用3.2 生成 DOM 元素并且添加事件4 为什么不暴力一点?4.1 状态改变 -> 构建新的 DOM 元素4.2 重新插入新的 DOM 元素5 抽象出 Component 类6 总结1、前言本文会教你如何在 40 行代码内,不依赖任何第三方的库,用纯 Java 实现一个 React.js 。本文的目的是:揭开对初学者看起来很很难理...

weixin_39948111的博客 139

前端实现原理_【第1611期】前端路由原理解析和实现

前言今日早读文章由腾讯@whinc投稿分享。正文从这开始~~在单页应用如此流行的今天,曾经令人惊叹的前端路由已经成为各大框架的基础标配,每个框架都提供了强大的路由功能,导致路由实现变的复杂。想要搞懂路由内部实现还是有些困难的,但是如果只想了解路由实现基本原理还是比较简单的。本文针对前端路由主流的实现方式 hash 和 history,提供了原生JS/React/Vue 共计六个版本供参考...

weixin_39657575的博客 95

ReactJS 101代码规范终极指南:Airbnb React/JSX风格指南的实际应用

ReactJS 101作为React开发者的入门指南,不仅教授React基础知识,还特别强调了代码规范的重要性。在React开发中,遵循统一的代码规范是提升团队协作效率和代码质量的关键。本文将深入探讨如何在ReactJS 101项目中实际应用Airbnb React/JSX风格指南,帮助开发者编写更专业、更易维护的React代码。 ## 📋 为什么需要React代码规范? 在团队协作开发中,

gitblog_00879的博客 1745

40道经典ReactJS 面试附答案

英文 | https://blog.stackademic.com/top-40-reactjs-interview-questions-and-answers-for-2024-70c94e5fcccaReactJS 已成为现代 Web 开发的基石,其基于组件的架构和高效的渲染使其成为构建动态用户界面的首选。无论你是希望提高技能的经验丰富的开发人员,还是准备即将到来的 ReactJS 面试的求职...

zz_jesse的博客 561

分享 40 道 ReactJS 面试问题及答案

英文 | https://blog.stackademic.com/top-40-reactjs-interview-questions-and-answers-for-2024-70c94e5fcccaReactJS 已成为现代 Web 开发的基石,其基于组件的架构和高效的渲染使其成为构建动态用户界面的首选。无论你是希望提高技能的经验丰富的开发人员,还是准备即将到来的 ReactJS 面试的求职...

前端达人 564

40道ReactJS 面试问题及答案

点击上方前端Q,关注公众号回复加群,加入前端Q技术交流群英文 | https://blog.stackademic.com/top-40-reactjs-interview-questions-and-answers-for-2024-70c94e5fcccaReactJS 已成为现代 Web 开发的基石,其基于组件的架构和高效的渲染使其成为构建动态用户界面的首选。无论你是希望提高技能的经验丰富...

LuckyWinty的博客 329

ReactJS 40分钟入门教程

ReactJS 40分钟入门教程 1. 项目的目录结构及介绍 reactjs-in-40/ ├── README.md ├── package.json ├── public/ │ ├── index.html │ └── ... ├── src/ │ ├── index.js │ ├── App.js │ ├── components/ │ │ ├── Compone...

gitblog_00375的博客 436

reactjs--实现switch按钮组件(并监听状态)

1、首先引入相关js src="js/react.js"> src="js/react-dom.js"> src="js/browser.min.js"> src="js/jquery.min.js"> 2、实现switch按钮的css .switch{ display:none; } label{ position:relative; display: bl

web前端开发 6847

ReactJS 101进阶教程:ImmutableJS如何优化React应用性能的3个秘诀

在React应用开发中,性能优化是一个永恒的话题。对于初学者和中级开发者来说,理解如何有效提升React应用的渲染效率至关重要。今天我们将深入探讨**ImmutableJS**这个强大的工具,它如何通过不可变数据的概念来优化**React应用性能**。在ReactJS 101的学习过程中,掌握ImmutableJS的使用技巧能够让你的应用运行更加流畅,避免不必要的重新渲染。 ## 🚀 为什么R

gitblog_00513的博客 1107

2022 年 前40道 ReactJS 面试问题和答案

当一个对象的状态改变时,虚拟 DOM 只改变真实 DOM 中的那个对象,而不是更新所有的对象。虚拟 DOM 会比较其先前的状态并仅更新真实 DOM 中状态已更改的那些组件,而不是像传统的 Web 应用程序那样更新所有组件。当一个对象的状态改变时,虚拟 DOM 只改变真实 DOM 中的那个对象,而不是更新所有的对象。这些组件有自己的逻辑和控件,它们可以通过应用程序重用,这反过来又大大减少了应用程序的开发时间。它是一种在客户端应用程序中处理复杂数据的方法,并管理数据在 React 应用程序中的流动方式。

Meta.Qing的博客 1699

React代码高亮终极指南:react-code-blocks 40+主题、90+语言支持,免费开箱即用

**react-code-blocks** 是一款免费的 React 代码块与代码片段组件库,为 React 应用提供开箱即用的代码高亮渲染:内置 40 余款语法着色主题、支持 90+ 语言标识符(含常用别名),并提供行号、复制按钮、行高亮等实用功能。无论你做的是技术博客、在线文档还是学习平台,它都能让代码展示瞬间专业起来。 [![react-code-blocks React代码高亮组件官方横

gitblog_00033的博客 358

Suncalc:用285行JavaScript代码实现专业级太阳月亮位置计算

你是否曾需要精确计算日出日落时间,却苦于找不到轻量级的解决方案?或者想要为你的摄影应用添加黄金时段提醒功能,但复杂的天文计算让你望而却步?Suncalc正是为解决这些问题而生——一个仅285行代码的JavaScript库,却能提供专业级的太阳月亮位置计算能力。 ## 为什么开发者需要Suncalc? ### 🌟 解决真实开发痛点 在构建与时间、位置相关的应用时,开发者常常面临这些挑战:

gitblog_00053的博客 1070
上一篇: vue-cli-master 学习
下一篇: 小米扫地机器人 改装加简单拖地功能
天意pt
博客等级 码龄14年 10粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值