ReactJS :我就是想把代码和HTML混在一起!

ReactJS_1:从基础到进阶的全面学习 本文还有配套的精品资源,点击获取 简介:ReactJS是由Facebook开发的开源JavaScript库,以其组件化开发和虚拟DOM特性为核心,用于构建高效的用户界面。本资料包提供了从基础知识到高级应用的完整学习路径,包括但不限于组件的props和state管理、React Router路由配置、React Hooks的使用、环境配置、测试工具应用、性能优化技巧,以及与其... 阅读详情

当我走进这个著名的咖啡馆,这里已经有很多人了,我环顾四周,看到远处的JSP同学和ASP同学正聊得火热,他俩,还有今天没看见的Velocity同学每次都会占据最里边的座位,似乎故意要逃避大家。

从他们的表情看,我就能猜出来这两个家伙又在抱怨人心不古,世风日下,没有程序员使用他们了。

旁边是jQuery和ExtJS, 他俩在低声交谈,时不时朝JSP和ASP方向看两眼, 我估计jQuery又在宣传他那DOM操作大法了。

幸好,还有一个靠窗的空桌,有两个座位, 我走过去坐下,要了一杯咖啡,拿起一本杂志,边喝边看。 

代码中混杂HTML

这时候又进来一个年轻人,看到我这一桌还有空位,不客气地坐下, 掏出一张纸,爬在桌子上刷刷刷地写代码。

我偷偷看了一眼,不由得大吃一惊: 怎么能在代码中写HTML呢?

function Welcome(props) {    
    return <h1>Hello, {props.name}</h1>;
}

(友情提示:可左右滑动)

这时候服务员正好走过来送咖啡, 也注意到了这段代码, 大叫道:“我赛,这都什么年代了,还在代码里写HTML !”

这一下便炸了锅,ASP, JSP, jQuery, ExtJS等纷纷围过来看个究竟。

在代码中写HTML,我记得这是上个世纪90年代的事情,那时候连ASP,JSP都没有,只好用C语言写CGI代码,HTML就混杂在C代码中,类似这样:

void main(){
    char content[MAXLINE];
    sprintf(content,"<html>");
    sprintf(content,"<head>");
    sprintf(content,"<title>Homepage</title>");
    sprintf(content,"</head>"); 
    ......其他内容略...... 
    printf("Content-length : %d \r\n",(int)strlen(content));
    printf("Content-type:text/html \r\n\r\n");
    printf("%s",content);
    fflush(stdout);
    exit(0);
}

(友情提示:可左右滑动)

这种模式给修改界面和业务逻辑带来了巨大的麻烦,等到ASP, JSP这样的“模板”语言出现以后,变成了在HTML中写代码: 

UI设计师先把HTML页面整体设计好,交给程序员再用<%..%>在其中填入动态的部分, 这种方式可以让设计师和程序员更好地合作。

&lt;%@ Language="VBScript" %&gt;
&lt;html&gt;
&lt;head&gt;&lt;title&gt;我的主页&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;% For i=3 to 5 %&gt;
&lt;font size=&lt;%=i%&gt; &gt;
    你好,欢迎来到我的主页。
&lt;/font&gt; &lt;br /&gt;
&lt;% Next %&gt;
&lt;/body&gt;
&lt;/html&gt;
}

现在又有人想在代码中写HTML,简直是疯了!

模板 vs 组件

看到这么多人围过来, 小伙子涨红了脸:“我这不是HTML,我这个是JSX,是JavaScript的一个语法扩展,你们仔细看看,其实和ASP的模板也很像的。”

<h1>Hello, {props.name}</h1>

“那你为什么不直接用模板,为什么要把HTML放到JavaScript当中?这是我们早就抛弃的反模式!”  ASP问道。

“对啊,为什么不用模板? ”  周围的人也随声附和。

“因为我觉得模板难于复用!” 小伙子突然大声说道。

说起复用,这一点我的体会太深了,在开发中,我通常把描述界面结构的HTML,描述展示的CSS, 和操作DOM的JavaScript放在不同的文件当中,在运行时把他们结合起来, 但是这种分离只是技术层面分开管理而已,在逻辑上并没有实现高耦合的组件,也就无法复用。

640?wx_fmt=png

“我想了一个新的办法,” 小伙子继续说道,“组件化,我们可以创建一个个的组件,然后让这些组件组合起来形成一个完整的Web界面。 就像我刚写的组件Welcome,可以复用的,可以用在Web页面的任何地方。”

“组件? 这小子有点想法。” ASP说道,“我表哥Visual Basic 就有很多组件,奥,好像大家叫他控件,在开发一个应用的时候,只需要把控件拖拽到表单界面上,设置属性,编写对事件的处理代码就可以了,非常简单快速。”

“你怎么没给我说过?” JSP表示不满, 他和ASP在90年代打得你死我活,现在抛弃了门户之见,成了好基友。

小伙子向ASP投去感激的目光,找到支持支持者了。

没想到ASP马上泼了一盆冷水:“不过控件是在桌面应用使用的,在Web开发中我们不这么干,它和桌面应用差别太大,实现不了。”

小伙子马上反驳:“怎么实现不了,一个组件不就是一个可以复用的单元吗? 在Web页面上, 这个组件要像桌面应用那样,负责自己的展示和行为,有属性可以设置,有方法可以调用,对外可以响应事件(Event), 对内可以维护组件状态。”

我说道:“你说说你那个Welcome组件具体怎么复用?”

小伙子说: “很简单,在JSX中,那个Welcome组件就像普通的HTML标签一样,直接就可以使用了!”

function App(props){
  return(
    &lt;div&gt;     
      &lt;Welcome name="码农翻身" /&gt;
      &lt;Welcome name="张大胖" /&gt;      
    &lt;/div&gt;
  );
}

确实是不错,这些自定义的标签(组件),可以一层层地组合起来,构建成一个大的页面。

有状态的组件

还是jQuery经验老道,他眯着眼看了半天,开始发难:“你号称是组件,但组件都是有内部状态的,而你这代码就是一个函数而已,一个输入,一个输出,根本不是组件!”

小伙子说:“你说得没错,那个组件是个无状态的组件,只有输入和输出,我给你看个有状态的组件。”

  class Counter extends React.Component{
    constructor(props){
      super(props);
      this.state = {count : 0};
    }
    handleClick(){
      this.setState({count: this.state.count + 1});
    }
    render(){
      return (
        &lt;div&gt;
          &lt;button onClick={(e) =&gt; this.handleClick(e)}&gt;Click!&lt;/button&gt;
          &lt;h3&gt;
            Click Count : {this.state.count}
          &lt;/h3&gt;
        &lt;/div&gt;
      );
    }
  }

(友情提示:可左右滑动)

这个组件一下子就复杂多了,似乎是一个继承了Component的类,有构造器,有函数,还有个返回HTML的render方法。

小伙子说:“看到没有,这是一个用来计数的小组件, 数值被保存起来了,就是那个 this.state.count ,初始值为0, 每次点击就会调用this.setState函数,把count 加一。”

小伙子说着在浏览器中给我们展示了一下效果,果然,每次点击,Count数都会变化。

640?wx_fmt=png

我们看了以后都有一个感觉,这确实是一个组件,你看它内部有展示的逻辑,有状态,有操作,自己的活儿自己干。

“state ? 你不是有props吗? 还用state ? ” ExtJS 看到jQuery沉默了,马上为朋友两肋插刀。

小伙子说道:“是这样的,我用props 来保存从上层组件(父组件)传递过来的数据,用state来保存本组件的内部数据。”

jQuery道:“父组件可以用props给子组件传递数据,那子组件如果想把数据告诉父组件,该怎么处理?”

小伙子向jQuery投去佩服的目光, 回答道:“这个问题我想过了,父组件可以用props传递一个'钩子'函数给子组件,在必要的时候,子组件就调用这个函数,把数据告知父组件。”

UI = render(data)

jQuery不甘心,想了一会儿,又抛出一个重磅炸弹:“怪哉怪哉,从你这个Counter组件中,怎么看不到对DOM的操作? 如果没有DOM操作,你怎么实现点击了Click! 按钮以后,下面的数目发生变化的? ”

jQuery是操作DOM的高手,什么链式调用了,选择器了被他玩得贼溜,现在看到Counter组件中连一行DOM操作的代码都没有,颠覆了自己的人生观,肯定要弄个究竟。

“我估计大家都用JavaScript操作过DOM,说实话,很简单,很直观,可是当项目变得复杂以后, 当页面上的事件处理多了以后, JavaScript的代码会和DOM紧密地纠缠在一起,就不好维护了。”  小伙子说道。

640?wx_fmt=png

大家都纷纷点头。

“所以呢, 所以我就想办法把他屏蔽了,在我这里,不用操作DOM,只要你调用setState方法,我发现数据发生了变化,我就会渲染整个页面。所以对程序员来讲,在概念上非常简单,只需要setState,剩下的操作都交给我。 用个公式来表达就是 UI = render(data) 。  ”

“嘶.....”    听到这个“渲染整个页面”,大家伙都倒吸了一口凉气。如果一个页面有很多数据,现在只改变了一个小小的count的数值 ,难道还要把其他的也全部渲染一遍?

看到大家疑惑的表情,小伙子笑了笑,解释道:“全部渲染是从概念上来说的,在实现层面,还是局部更新。为了实现这一点,我特意实现了一个虚拟的DOM。”

640?wx_fmt=png

“每次数据发生了变化,我会比较两个虚拟DOM的区别,找到那些数据真正发生改变的地方,然后操作真正的DOM, 这样以来,其实真正的更新还是局部的。”

640?wx_fmt=png

看到了虚拟DOM, 大家都明白这小伙子绝对不是一般人了!。

但是看到那混杂着代码和HTML的,试图改变Web开发方式的“组件”,都觉得不可思议,难以接受,摇着头,慢慢地散开了。

ASP一边走一边给JSP说:“这玩意儿,太颠覆了,根本不会有人用。”

JSP同意:“是啊,我们还是玩模板去吧。”

人走得差不多了,我问小伙子:“你叫什么名字? ”

“ReactJS。”

“有没有兴趣到我们公司工作? ” 我递上了我的名片,上面印着我们公司的Logo : Facebook。

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身文章精华》


640?wx_fmt=png

计算机图书每满100减50

限时24小时 

只为你一天的倾心

帅气有才的IT精英们

此刻为你们定制的专属福利

IT图书大狂欢浪潮,正式开启……….

扫描下面图片二维码,专属福利等你来购gogo~

640?wx_fmt=jpeg

ReactJS基础挑战:TypeScript的应用 本文还有配套的精品资源,点击获取 简介:本项目是一个名为"gostack-desafio-fundamentos-reactjs"的挑战性学习项目,涵盖了ReactJS基础知识、TypeScript编程语言在React开发中的应用,以及React组件的创建和状态管理。学习者将通过实战掌握从基本组件编写到复杂应用开发的全过程,同时利用TypeScript的类型系统来提升代码质... 阅读详情

相关推荐

运行stable-diffusion出现的问题

解决:即用 https://github.com/CompVis/taming-transformers/blob/master/taming/modules/vqvae/quantize.py 新文件,替换错误提示文件中的全部内容即可。5.新建文件夹 CompVis/stable-diffusion-safety-checker/将下载的四个文件放入 解决!后面还会遇到'openai/clip-vit-large-patch14离线下载的问题,同样步骤解决。解决:下载后离线,步骤如下。

weixin_52121118的博客 2348

react 如何直接嵌套html代码

在vue中,我们常常在标签上使用v-html来,将现成的html代码嵌入到被绑定的标签中,react如何操作呢? 类似于vue,react也有特殊的标签属性,用来代替v-html dangerouslySetInnerHTML属性,该属性被赋值,只接受对象。 import React from 'react'; export default class dangderouslySet exten...

秋来九月八 1万+

从打印攻击到视频重放:手把手用OULU-NPU训练你的第一个活体检测模型

本文详细介绍了如何使用OULU-NPU数据集训练活体检测模型,以应对打印攻击和视频重放等安全威胁。通过PyTorch框架,从环境准备、数据加载、预处理到模型架构设计,手把手教你构建一个高效的双流网络,结合CNN和LSTM技术,提升模型在多种攻击场景下的检测准确率。

weixin_29092031的博客 386

react与html结合使用

主要介绍react在html重点 使用

weixin_50723565的博客 4525

【图像去噪】论文精读:Restormer: Efficient Transformer for High-Resolution Image Restoration

论文题目:Restormer: Efficient Transformer for High-Resolution Image Restoration —— Restormer:用于高分辨率图像恢复的高效变压器高效Transformer模型用于图像恢复!由于卷积神经网络 (CNN) 在从大规模数据中学习可泛化的图像先验方面表现良好,因此这些模型已广泛应用于图像恢复和相关任务。最近,另一类神经架构 Transformer 在自然语言和高级视觉任务中显示出显着的性能提升。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1526

goahead(嵌入式Web服务器)之openssl 应用篇

1、环境配置 在me.h文件里修改以下宏定义 ME_COM_MBEDTLS 0 ME_COM_MATRIXSSL 0 ME_COM_NANOSSL 0 ME_COM_OPENSSL 1 2、添加 goahead-openssl.c goahead-openssl.c这个文件在有些goahead源码中是没有的,后面的章节中会提供openssl应用测例 3、依赖的库 goahead的openssl 应用需要依赖libssl.a与libcrypto.a(libssl.so与libcrypto.so)两个库,做好

weixin_40732273的博客 2089

react跟原生html优点,React主要特性及其优点和缺点 – ReactJS实战教程

这一章我们开始了解React主要的核心特性,这些概念有助于我们后面React项目的快速开发,并了解使用React开发的一些优点和缺点。React主要特性目前,ReactJS作为最好的JavaScript框架在web开发人员中迅速流行起来。它在前端生态系统中起着至关重要的作用。ReactJS的重要特性如下。JSX组件Component单向数据绑定虚拟DOM简单性能JSXJSX代表JavaScript...

weixin_42469706的博客 1374

Open3d Qt的环境配置

目前统一使用qt6配置,open3d中可视化功能目前使用vtk代替,语言为c++。

阁楼 920

玩转 React(三)- JavaScript代码里写HTML一样可以很优雅

这是《玩转 React》系列的第三篇,看到本篇的标题,了解过 React 的同学可能已经大致猜到我要讲什么了,本篇中要讲的内容对于刚接触 React 的同学来说,可能有些难以接受,但希望你能坚持学下去,这是 Facebook 的前端大神们为前端开发做出的革命性创新。 React 第一印象 废话不多说,先看一段代码: class Hello...

weixin_34356310的博客 832

服务器取证——服务器基础知识

服务器基础知识

记录并分享学习安全的知识点.. 2482

RT-DETR模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作

本文记录了RT-DETR模型的这一系列过程中可能发生的问题,以及大家非常关心的问题,这里统一做了一个记录和解答。

Limiiiing的博客 1768

使用JSX编写标记

JSX是JavaScript的语法扩展,它允许你在JavaScript文件中编写类似HTML的标记。虽然还有其他编写组件的方式,但大多数React开发者都喜欢JSX的简洁性,大多数代码库也使用它。你将学到:为什么React将标记和渲染逻辑混合在一起JSX与HTML的区别如何使用JSX显示信息JSX:将标记放入JavaScript中Web是由HTML、CSS和JavaScript构建的。多年来,We...

lefex的博客 412

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

入门指南:从零开始学习ReactJS

ReactJS是一个强大的JavaScript库,用于构建用户界面。它由Facebook开发,并于2013年首次发布。自那时以来,React已成为前端开发中最受欢迎的库之一,许多公司和开发者都在使用它来构建高性能、交互式的Web应用程序。本文将向您介绍ReactJS的基础知识,并通过实践示例来帮助您入门。我们将从React的核心概念开始,逐步深入,直到您能够构建简单的React应用为止。

努力是为了站在万人之中,成为别人的光 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ReactJS 101快速入门:如何在30分钟内搭建你的第一个React应用

ReactJS是一个由Facebook开发的用于构建用户界面的JavaScript库,它采用组件化思想,让开发者能够轻松构建交互式UI。本教程将带你快速上手React,在30分钟内完成第一个React应用的搭建,非常适合新手入门学习。 ## 准备工作:安装必要环境 在开始之前,确保你的电脑上已经安装了Node.js和npm。如果还没有安装,可以从Node.js官网下载并安装,npm会随Node

gitblog_00561的博客 1803

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

React学习教程,从入门到精通, ReactJS - 安装:初学者指南(3)

在我们开始安装之前,让我们快速了解一下ReactJS是什么。React是一个流行的JavaScript库,用于构建用户界面,尤其是单页应用程序。它主要是关于创建可重用的UI组件,这些组件管理自己的状态,使得构建复杂的界面变得更加容易。

qq_45746668的博客 2524

reactjs-vite-tailwindcss-boilerplate核心功能揭秘:为什么它是React项目的终极选择

reactjs-vite-tailwindcss-boilerplate是一个集成了Vite、React 18、TypeScript、Vitest、Testing Library、TailwindCSS 3、Eslint和Prettier的强大项目模板,为React开发者提供了一站式的开发解决方案,帮助快速构建现代化的Web应用。 ## 🌟 核心技术栈解析 ### Vite:极速构建体验 作

gitblog_00620的博客 1997

react输出原生html,使用reactjs渲染原始HTML

那么这是用reactjs渲染原始html的唯一方法吗?// http://facebook.github.io/react/docs/tutorial.html// tutorial7.jsvar converter = new Showdown.converter();var Comment = React.createClass({render: function() {var rawMark...

weixin_30800151的博客 913

react 多个html,reactjs - React JS in HTML - Stack Overflow

I am totally new to React JS or any given server-side technology. And now, I want to learn how to develop in React JS.IntroductionI started with React JS tutorials on official website. Now, I am tryin...

weixin_42099814的博客 369

ReactJS入门(一)—— 初步认识React

它返回了一个p标签,其中的内容是 this.props.abc 和 this.props.name,这里的 this 指的是组件 Component1 本身,因此比如 this.props.name 获取到的便是组件 Component1 自身的属性 name 的值(abc 和 name 的值我们都在 Component2 中进行了定义)。2. React很擅长于处理组件化的页面,在页面上搭组件的形式有点像搭乐高一样,因此用上React的项目需求常规为界面组件化。isClick :!

精选资讯文章 6354

react渲染HTMl包括样式,使用reactjs渲染原始HTML

那么这是用reactjs渲染原始html的唯一方法吗?// http://facebook.github.io/react/docs/tutorial.html// tutorial7.jsvar converter = new Showdown.converter();var Comment = React.createClass({render: function() {var rawMark...

weixin_35665083的博客 533

ReactJs和React Native的联系和差异

1,React Js的目的 是为了使前端的V层更具组件化,能更好的复用,它能够使用简单的html标签创建更多的自定义组件标签,内部绑定事件,同时可以让你从操作dom中解脱出来,只需要操作数据就会改变相应的dom。2,React Native的目的 是希望我们能够使用前端的技术栈就可以创建出能够在不同平台运行的一个框架。可以创建出在移动端运行的app,但是性能可能比原声app差一点。3...

dengla6847的博客 742

如何学习ReactJS:

文章目录1、基本条件2、HTML,CSS,JavaScript3、Javascript的ES6功能4、NodeJS基础和代码编辑器导入:一旦在项目中使用NPM安装了Node模块,就必须使用'import'关键字来使用该模块。导出:在创建模块/组件时使用此关键字,而您只需要返回一部分,而不必返回所有方法和变量。5、学习ReactJS 1、基本条件 HTML,CSS和JavaScript的基本知识。...

X W F 486

react将html代码字符串转化为html_【第1960期】ReactJS 中的代码注入

前言业务中了解到的。今日早读文章由@Twosecurity分享。正文从这开始~~ReactJS 概述ReactJS是一款用于构建用户界面的JavaScript库。它能预加载Web前端,给用户带来更舒适的体验。React已经实现了绝大部分的客户端逻辑(比如说React能自动编码字符串),因此开发者大抵不用担心XSS攻击。因此,只要合理使用React,你的应用就不会有太大的安全隐患。然而这些...

weixin_39883670的博客 404

react方面的pdf_ReactJS中文API.pdf

ReactJS中文API1.顶层API1.1ReactReact是 React 库的入口。如果使用的是预编译包 ,则 React是全局的 ;如果使用 CommonJS 模块系统,则可以用 require() 函数引入React。1.1.1React.createClassReactClasscreateClass(objectspecification)创建一个组件类 ,并作出定义。组件实现了 r...

weixin_39571087的博客 1377

xberg 批处理提取 API 实战:基于 C FFI 的 extract_batch 字节批量抽取

本文围绕 xberg 仓库中的契约测试文档 [api_extract_batch_bytes.md](https://link.gitcode.com/i/4c565fbea58e431167772bf7cdf7886c) 展开,深入讲解 xberg 面向 C 语言暴露的批量提取接口 `xberg_extract_batch`:如何以一段 JSON 字符串一次性提交多个"字节输入"(bytes 输

gitblog_00793的博客 890
上一篇: Java 帝国之建造者模式
下一篇: 程序员必备的两项基本技能
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值