Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >react思维

react思维

作者头像
一粒小麦
发布于 2019-11-22 15:32:00
发布于 2019-11-22 15:32:00
1.5K00
代码可运行
举报
文章被收录于专栏:一Li小麦一Li小麦
运行总次数:0
代码可运行

接下来的系列文章将回到自己熟悉的mvvm框架——react。

作为《深入浅出react和redux》的读书笔记,文章将重点关注自身未去深入理解的问题。

一个计数器

先用官方脚手架create-react-app创建项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create-react-app aaacd aaanpm start

写一个点击计数器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react';
export default class ClickCounter extends Component {    constructor(props){        super(props);        this.state={            count:0        }    }
    handleClick=()=>{        this.setState((preState)=>{            return {                counter:preState.count++            }        })    }
    render() {        return (            <div>                <div>{this.state.count}</div>                <button onClick={this.handleClick}>点我</button>            </div>        )    }}

相信这个很快就能写出来。

接下来做少许分析:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from 'react'

Component作为所有组件的基类,提供了很多组件共有的功能,下面这行代码,使用ES6语法来创建一个ClickCounter的组件类,ClickCounter的父类就是Component:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default class ClickCounter extends Component {  // ...}

如果去掉导入语句中的React,会发生什么?

代码会立马报错:大致意思是说,所有使用jsx的地方必须引用React。

jsx的onClick vs html行内事件处理onclick

这里补白一个问题:

为什么行内样式,行内事件处理被人诟病,在react中却成为了一种常用的写法?

首先jsx属于js而非html,,JSX的onClick事件处理方式和HTML的onclick有很大不同。

即使现在,在HTML中直接使用onclick很不专业,原因如下:·

•onclick添加的事件处理函数是在全局环境下执行的,这污染了全局环境,很容易产生意料不到的后果;•给很多DOM元素添加onclick事件,可能会影响网页的性能,毕竟,网页需要的事件处理函数越多,性能就会越低;•·对于使用onclick的DOM元素,如果要动态地从DOM树中删掉的话,需要把对应的事件处理器注销,假如忘了注销,就可能造成内存泄露,这样的bug很难被发现。

——而上面说的这些问题,在JSX中都不存在。

jsx事件特点:

•挂载的事件处理函数,作用域只作用在组件范围内。•onClick使用了事件委托(event delegation)的方式处理点击事件,无论有多少个onClick出现,其实最后都只在DOM树上添加了一个事件处理函数,挂在最顶层的DOM节点上。所有的点击事件都被这个事件处理函数捕获,然后根据具体组件分配给特定函数,使用事件委托的性能当然要比为每个onClick都挂载一个事件处理函数要高。

•因为React控制了组件的生命周期,在unmount的时候自然能够清除相关的所有事件处理函数,内存泄露也不再是一个问题。

拆解create- react-app

前端最喜欢的npm语句应该是npm start,看下官方脚手架的命令脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  "scripts": {    "start": "react-scripts start",    "build": "react-scripts build",    "test": "react-scripts test",    "eject": "react-scripts eject"  },

react-scripts是官方脚手架提供的一个npm包,我们尝试用npm run eject(弹射)语句把它封装的工程配置不可逆地暴露出来。

如果你用的是mac机,先执行以下git命令,否则会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git add .git commit -m""

执行后,项目多了若干文件夹,再看package,json:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  "scripts": {    "start": "node scripts/start.js",    "build": "node scripts/build.js",    "test": "node scripts/test.js"  },

而在config下面则暴露了webpack配置(webpack.config.js):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    {    test: /\.(js|mjs|jsx|ts|tsx)$/,    include: paths.appSrc,    loader: require.resolve('babel-loader'),    options: {      // ...    },  },

paths.appSrc指向的就是src目录,这段代码表示,所有js|mjs|jsx|ts|tsx后缀的文件,全部由babel-loader处理。

react的工作方式

这个年代,说'"以jquery作为开发语言的前端是没前途的",恐怕没有人会反对。

如果用jquery实现一个计数器,可能是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$('#btn').click(function(){  var count = parseInt($('#show').text())  $('#show').text(count+1)})

在jQuery的解决方案中,首先根据CSS规则找到id为btn的按钮,挂上一个匿名事件处理函数,在事件处理函数中,选中那个需要被修改的DOM元素,读取其中的文本值,加以修改,然后修改这个DOM元素——选中一些DOM元素,然后对这些元素做一些操作,这是一种最容易理解的开发模式。

假设你用jquery维护一个含有表单的模态框,你得给你的对象做好重置表单,打开,关闭,获取表单参数的事件,最后维护的精力是相当恶心的。

与jQuery不同,用React开发应用是另一种体验,用React开发的ClickCounter组件并没有像jQuery那样做“选中一些DOM元素然后做一些事情”的动作。

React的工作方式是,开发者只需要着重“我想要显示什么”,而不用操心怎样去做。这种思维方式,对于一个简单的例子也要编写不少代码,但是对于一个大型的项目,这种方式编写的代码会更容易管理,因为整个React应用要做的就是渲染,开发者关注的是渲染成成什么样子,而不用关心如何实现增量渲染。

把React的理念归结为一个公式,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UI=render(data)

用户看到的界面(UI),应该是一个函数(在这里叫render)的执行结果,只接受数据(data)作为参数。这个函数是一个纯函数,所谓纯函数,指的是没有任何副作用,输出完全依赖于输入的函数,两次函数调用如果输入相同,得到的结果也绝对相同。

如此一来,最终的用户界面,在render函数确定的情况下完全取决于输入数据。

对于开发者来说,重要的是区分开哪些属于data,哪些属于render,想要更新用户界面,要做的就是更新data,用户界面自然会做出响应,所以React实践的也是“响应式编程”(ReactiveProgramming)的思想,这也就是React为什么叫做React的原因。

虚拟dom(VirutalDOM)

浏览器为了渲染HTML格式的网页,会先将HTML文本解析以构建DOM树,然后根据DOM树渲染出用户看到的界面,当要改变界面内容的时候,就去改变DOM树上的节点。

Web前端开发关于性能优化有一个原则:尽量减少DOM操作。虽然DOM操作也只是一些简单的JavaScript语句,但是DOM操作会引起浏览器对网页进行重新布局,重新绘制,这就是一个比JavaScript语句执行慢很多的过程。

如果用jquery的开发一个表格,性能测试时我们拿出1000条数据,请求加载,1秒后早已经从后端拿到数据。但页面可能半分钟都没有响应,陷入假死状态。面对这样的性能,以jquery作为开发语言

在react的实现方式中,VirutalDOM不会触及浏览器的部分,只是存在于JavaScript空间的树形结构,每次自上而下渲染React组件时,会对比这一次产生的VirtualDOM和上一次渲染的VirtualDOM,对比就会发现差别,然后修改真正的DOM树时就只需要触及差别中的部分就行。以计数器为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.querySelector('#show').innerText='1'
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
1、深入浅出React(一)
npm start启动开发环境,npm run build创建生产环境优化代码,npm test用于测试单元,npm run eject把潜藏在react-scripts中的一序列技术栈“弹射”到 应用的顶端,此命令不可逆且会改变和增加一些文件。
keyWords
2018/09/19
1.8K0
React.js基础知识总结一
React是FaceBook(脸书)公司研发的一款JS框架(MVC) React是一款框架:具备自己开发的独立思想(MVC:Model View Controller) -> 划分组件开发 -> 基于路由的SPA单页面开发 -> 基于ES6来编写代码(最后部署上线的时候,我们需要把ES6编译成ES5 =>基于Babel来完成编译) -> 可能用到Less/Sass等,我们也需要使用对应的插件把他们进行预编译 -> 最后为了优化性能(减少HTTP请求次数),我们需要把JS或者CSS进行合并压缩 -> webpack来完成以上页面组件合并、JS/CSS编译加合并等工作
用户6379025
2022/12/26
2.1K0
React.js基础知识总结一
React环境搭建
React是当下前端生态圈流行的框架之一,与Vue和Angular并称前端三架马车。今天,我们就一起来学习下React,今天的主要内容有。
江涛学编程
2020/07/24
1.7K0
手写一个react,看透react运行机制
react的源码,的确是比vue的难度要深一些,本文也是针对初中级,本意让博友们了解整个react的执行过程。
goClient1992
2022/09/26
2.2K0
初识React
React简介 React首次被提出是在2014年的f8大会(f8是由facebook组织的一个年度的技术峰会,目标听众是从事web周边产品和服务的开发者和企业)上,当期的主题叫做 Rethinking Web App Development at Facebook,所以可以这样定义React:颠覆式前端UI开发框架。 我们都知道基于html的前端界面开发正变得越来越复杂,传统的开发方式在解决将来自于服务器或者用户输入的交互数据,动态反应到复杂界面上的时候,代码量变得越来越大,越来越难以维护,常常力不从心。
小胖
2018/06/27
7490
一篇包含了react所有基本点的文章
去年,我写了一本关于学习React.js的小书,原来是大约100页。 今年我要挑战自己,把它归纳为一篇文章。
frontoldman
2019/09/02
3.6K0
所有这些基础的React.js概念都在这里了
这篇文章不会涵盖什么是React或者为什么你应该学习它。相反,这是对已经熟悉JavaScript并熟悉DOM API基础知识的人们对React.js的基础知识的实践介绍。
疯狂的技术宅
2019/03/27
2.2K0
所有这些基础的React.js概念都在这里了
react 学习(一) 实现简版虚拟 dom 和挂载
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试的也都能答出来。但对于 react 只是有一定的了解,没有真实的学习过实现,虽然之前也看过一些文章,但是只停留在表面,因为别人这么写了,也就下意识的认为是这样。本次正好配合工作的契机,我们从零开始学习一下,使用的话呢就简单一过,相信大家也都用过或者看完官网也都了解了。如果您是大佬,欢迎批评指正;如果您是初级选手,希望能够一起学习。
测不准
2022/04/05
6070
渐进式React源码解析--State源码
文章中涉及到的知识都是渐进式的讲解开发,当然如果对之间内容不感兴趣(已经了解),也可以直接切入本文内容,每一个章节都和之前不会有很强的耦合。
19组清风
2021/11/15
8230
渐进式React源码解析--State源码
组件设计基础(2)
早期的react设计了许多的生命周期钩子。它们严格定义了组件的生命周期,一般说,生命周期可能会经历如下三个过程:
一粒小麦
2019/12/04
6610
React 手写笔记
webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle
wscats
2022/03/24
5.1K0
【React】初识React&JSX
React 是一个用于构建用户界面(UI,对咱们前端来说,简单理解为:HTML 页面)的 JavaScript 库
且陶陶
2023/04/12
2.4K0
【React】初识React&JSX
React基础(4)-理清React的工作方式
前言 在接触React之前,我们也许习惯了DOM编程,那它相比于原生JS,JQ编程方式,究竟有什么区别?React的工作方式是什么样子的?所谓的虚拟DOM又指的是什么?以及React的工作方式的优点有
itclanCoder
2019/09/17
2.3K0
React基础(4)-理清React的工作方式
番外篇:入门React
原生js代码乱七八糟的时候,那就来体验一下React。 Tip:内容有点乱,秘籍在最后
用户3467126
2019/07/03
1.6K0
番外篇:入门React
React组件基础
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5zo7zriO-1668351209724)(images/组件.png)]
用户10169043
2022/11/18
3.4K0
React组件基础
一文入门react全家桶
1)遇到 <开头的代码, 以标签的语法解析: html同名标签转换为html同名元素, 其它标签需要特别解析
yuanshuai
2022/10/05
3.8K0
一文入门react全家桶
redux架构基础
本文书接 从flux到redux , 是《深入浅出react和redux》为主的比较阅读笔记。
一粒小麦
2020/01/02
1.4K0
【React 实战教程】从0到1 构建 github star管理工具
在日常使用github中,除了利用git进行项目版本控制之外,最多的用处就是游览各式的项目,在看到一些有趣或者有用的项目之后,我们通常就会顺手star,目的是日后再看。但是当我们star了许多项目之后,回过头想找一个的项目就会发现,很难在短时间内找到它,官方也并没有提供很好的管理我们的star项目的功能,因此在市面上也出现了一些对star进行管理的工具,比如说 astralapp,Star Order等等,其实github的接口api都是开放的,我们完全可以自己构建一个属于自己的项目管理工具。公司的前端技术栈是React,而笔者之前使用的是Vue,因此正好想利用github的open api 自己构建个react的github star管理项目来加深react的使用。而大体功能我们就模仿astralapp。
用户2356368
2024/01/28
3010
【React 实战教程】从0到1 构建 github star管理工具
采用React+Ant Design组件化开发前端界面(一)
注意:在webpack.config.dev.js添加的配置部分,也需要在webpack.config.prod.js中做相同的配置。否则可能导致项目发布上线后,报错无法执行。
做全栈攻城狮
2018/12/18
8930
React实用手册
React是一个开源(为数据提供渲染视图)的js库,它采用VirtualDOM、单向数据流的思想,主要用于数据大量变化,视图更新频繁的网页中,它具有以下特点:
越陌度阡
2020/11/26
1.2K0
相关推荐
1、深入浅出React(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档