首页 > 其他分享 >React - 02 React的工程化/组件化开发

React - 02 React的工程化/组件化开发

时间:2023-06-08 22:37:45浏览次数:34  
标签:02 react 渲染 DOM 视图 React 工程化 数据

我们可以基于webpack自己去搭建一套工程化打包的架子,但是这样非常的麻烦/复杂;React官方,为我们提供了一个脚手架:create-react-app!!

  • 脚手架:基于它创建项目,默认就把webpack的打包规则已经处理好了,把一些项目需要的基本文件也都创建好了!!

1.create-react-app基础运用

安装脚手架

$ npm i create-react-app -g 「mac前面要设置sudo」

检查安装情况

$ create-react-app --version

基于脚手架创建React工程化的项目

$ create-react-app 项目名称

+ 项目名称要遵循npm包命名规范:使用“数字、小写字母、_”命名

项目目录

|- node_modules

|- src:所以后续编写的代码,几乎都放在SRC下「打包的时候,一般只对这个目录下的代码进行处理」

|- index.js

|- public:放页面模板

|- index.html

|- package.json

|- ...

一个React项目中,默认会安装: react:React框架的核心 react-dom:React视图渲染的核心「基于React构建WebApp(HTML页面)」 ---> react-native:构建和渲染App的 react-scripts:脚手架为了让项目目录看起来干净一些,把webpack打包的规则及相关的插件/LOADER等都隐藏到了node_modules目录下,react-scripts就是脚手架中自己对打包命令的一种封装,基于它打包,会调用node_modules中的webpack等进行处理!!

React是Web前端框架 1.目前市面上比较主流的前端框架

  • React
  • Vue
  • Angular「NG」
  • ... 主流的思想:不在直接去操作DOM,而是改为“数据驱动思想” 操作DOM思想:
  • 操作DOM比较消耗性能「主要原因就是:可能会导致DOM重排(回流)/重绘」
  • 操作起来也相对来讲麻烦一些
  • ... 数据驱动思想:
  • 我们不会在直接操作DOM
  • 我们去操作数据「当我们修改了数据,框架会按照相关的数据,让页面重新渲染」
  • 框架底层实现视图的渲染,也是基于操作DOM完成的
  • 构建了一套 虚拟DOM->真实DOM 的渲染体系
  • 有效避免了DOM的重排/重绘
  • 开发效率更高、最后的性能也相对较好


2.MVC与MVVM

React框架采用的是MVC体系;Vue框架采用的是MVVM体系;

MVC:model数据层 + view视图层 + controller控制层

@1 我们需要按照专业的语法去构建视图(页面):React中是基于jsx语法来构建视图的

@2 构建数据层:但凡在视图中,需要“动态”处理的(需要变化的,不论是样式还是内容),我们都要有对应的数据模型

@3 控制层:当我们在视图中(或者根据业务需求)进行某些操作的时候,都是去修改相关的数据,然后React框架会按照最新的数据,重新渲染视图,以此让用户看到最新的效果! 数据驱动视图的渲染!! 视图中的表单内容改变,想要修改数据,需要开发者自己去写代码实现!! “单向驱动”

MVVM:model数据层 + view视图层 + viewModel数据/视图监听层

@1 数据驱动视图的渲染:监听数据的更新,让视图重新渲染

@2 视图驱动数据的更改:监听页面中表单元素内容改变,自动去修改相关的数据 “双向驱动”

3.jsx构建视图的基础知识

JSX构建视图的基础知识 JSX:javascript and xml(html) 把JS和HTML标签混合在了一起「并不是我们之前玩的字符串拼接」

@1 vscode如何支持JSX语法「格式化、快捷提示...」

  • 创建的js文件,我们把后缀名设置为jsx即可,这样js文件中就可以支持JSX语法了
  • webpack打包的规则中,也是会对.jsx这种文件,按照JS的方式进行处理的

@2 在HTML中嵌入“JS表达式”,需要基于“{} 胡子语法”

  • JS表达式:执行有结果的 变量/值({text}) 数学运算({x+y}) 判断(三元表达式、逻辑或与) 循环:借助于数组的迭代方法如map、filter等有返回值的

@3 在ReactDOM.createRoot()的时候,不能直接把HTML/BODY做为根容器,需要指定一个额外的盒子「例如:#root」

@4 每一个构建的视图,只能有一个“根节点”

  • 出现多个根节点则报错 Adjacent JSX elements must be wrapped in an enclosing tag.
  • React给我们提供了一个特殊的节点(标签):React.Fragment 空文档标记标签 <> 既保证了可以只有一个根节点,又不新增一个HTML层级结构!!

@5 {}胡子语法中嵌入不同的值,所呈现出来的特点

  • number/string:值是啥,就渲染出来啥
  • boolean/null/undefined/Symbol/BigInt:渲染的内容是空
  • 除数组对象外,其余对象(普通对象、日期对象、正则对象、函数对象、Number对象、String对象)一般都不支持在{}中进行渲染,但是也有特殊情况:
  • JSX虚拟DOM对象
  • 给元素设置style行内样式,要求必须写成一个对象格式
  • 数组对象:把数组的每一项都分别拿出来渲染「并不是变为字符串渲染,中间没有逗号」
  • 函数对象:不支持在{}中渲染,但是可以作为函数组件,用方式渲染!!
  • ...

@6 给元素设置样式

  • 行内样式:需要基于对象的格式处理,直接写样式字符串会报错 + 设置样式类名:需要把class替换为className
import React from 'react'; //React语法核心
import ReactDOM from 'react-dom/client'; //构建HTML(WebApp)的核心
//获取页面中#root的容器,作为“根”容器
const root = ReactDOM.createRoot(document.getElementById('root'));
//基于render方法渲染我们编写的视图,把渲染后的内容,全部插入到#root中进行渲染
root.render(
....
);

React - 02 React的工程化/组件化开发_react

React - 02 React的工程化/组件化开发_JSX_02

React - 02 React的工程化/组件化开发_react_03

React - 02 React的工程化/组件化开发_react_04

React - 02 React的工程化/组件化开发_react_05

React - 02 React的工程化/组件化开发_react_06

修改初始化后的项目配置

React - 02 React的工程化/组件化开发_react_07

package.json中这样修改,需要先安装依赖cross-env,npm i -S cross-env

React - 02 React的工程化/组件化开发_react_08

React - 02 React的工程化/组件化开发_JSX_09

如果要做浏览器兼容处理,这样做

React - 02 React的工程化/组件化开发_react_10

处理跨域

React - 02 React的工程化/组件化开发_JSX_11

从上图方框里按图索骥查找paths.proxySetup, 发现它引用的是src/setupProxy.js,于是在src下新建setupProxy.js

React - 02 React的工程化/组件化开发_react_12

于是在src下新建setupProxy.js,跨域代理需要安装这个中间件npm i -S http-proxy-middleware

React - 02 React的工程化/组件化开发_react_13

测试跨域

React - 02 React的工程化/组件化开发_JSX_14

成功拿到数据

React - 02 React的工程化/组件化开发_react_15

network中的请求地址http://127.0.0.1:8080/jian/subscriptions/recommended_collections最终被代理成了https://www.jianshu.com/asimov/subscriptions/recommended_collections

React - 02 React的工程化/组件化开发_JSX_16

React - 02 React的工程化/组件化开发_react_17

React - 02 React的工程化/组件化开发_react_18

React - 02 React的工程化/组件化开发_JSX_19

感受一下

React - 02 React的工程化/组件化开发_JSX_20

标签:02,react,渲染,DOM,视图,React,工程化,数据
From: https://blog.51cto.com/u_12207234/6443771

相关文章

  • 02-mysql高级-约束(主键,外键,非空,唯一,默认)、设计(一对多,多对多)、多表查询(内连接
    文章目录mysql高级1,约束1.1概念1.2分类1.3非空约束1.4唯一约束1.5主键约束1.6默认约束1.7约束练习1.8外键约束1.8.1概述1.8.2语法1.8.3练习2,数据库设计2.1数据库设计简介2.2表关系(一对多)2.3表关系(多对多)2.4表关系(一对一)2.5数据库设计案例**LX:**3,多表查询3.......
  • Vue开发实战(02)-MVVM模式
    1JQ实现待办任务列表<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>TodoListJquery</title><scriptsrc='jquery.js'></script></head><......
  • 02-MyBatis-CRUD-配置文件、参数封装、mybatisX插件、动态sql, 简单的用注解开发
    文章目录MybatisCRUD练习1,配置文件实现CRUD1.1环境准备Debug01:别名mybatisx报错1.2查询所有数据1.2.1编写接口方法1.2.2编写SQL语句1.2.3编写测试方法1.2.4起别名解决上述问题1.2.5使用resultMap解决上述问题1.2.6小结1.3查询详情1.3.1编写接口方法1.3.2编写SQL语句......
  • 02-前端-javaScript
    文章目录JavaScript1,JavaScript简介2,JavaScript引入方式2.1内部脚本2.2外部脚本3,JavaScript基础语法3.1书写语法3.2输出语句3.3变量3.3.1全局变量var3.3.2局部变量let3.3.3常量const3.4数据类型3.5运算符3.5.1\==和===区别▲3.5.2类型转换3.6流程控制语句3.6.1if......
  • javaWeb核心02-Request&Response -(乱码处理、字符流、字节流、虚拟目录、请求转发、重
    文章目录Request&Response1,Request和Response的概述2,Request对象2.1Request继承体系2.2Request获取请求数据2.2.1获取请求行数据2.2.2获取请求头数据2.2.3获取请求体数据2.2.4获取请求参数的通用方式基于上述理论,request对象为我们提供了如下方法:★代码演示2.3IDEA快速创......
  • visualstudio2022 ef6生成代码报错
    StartNotepadinadministratormode,andopenthefile(substitutingCommunityforProfessionalorEnterprisedependingonyourversion):C:\ProgramFiles\MicrosoftVisualStudio\2022\Community\Common7\IDE\Extensions\Microsoft\EntityFrameworkTo......
  • SONiC 202305 Release内容
    SONiC社区采用Github平台进行项目管理,Github平台不仅仅提供代码的托管服务,还能提供IsuueTracking,Releasemanagement等RequirementEngineering的功能。在GithubSONiC页面上选择Projects/SONiC202305Release以后,可以看到表格的形式显示的该Release计划的77个Issue的内容。到......
  • P8376 [APIO2022] 排列
    一种比较容易写的构造方案考虑直接二进制拆分,发现在原排列的基础上,在开头填上更大的数,方案数+1,在末尾上填上更大的数,方案数*2,直接按照填数从小到大顺序填入,长度为logk+popcount(k),期望得分91分1#include<bits/stdc++.h>23usingnamespacestd;45vector<int......
  • 2023年4月阅读笔记1
    为什么巴比伦塔会失败巴比伦塔的制造是一个神话故事,但是其中的道理却对今天人们的协作有着重要的启示。软件系统的开发完全通过计算机执行,为什么还是很少有远程协作的企业,这是因为远程协作很容易导致交流的缺失。大型的软件项目开发需要团队中的每个人能及时了解到整个团队在做些......
  • 2023年4月阅读笔记2
    未雨绸缪我们在实现功能时往往有很多思路,但是哪种思路能行得通并且最适合情况就需要我们进行试验性开发。试验性开发确实会造成精力的消耗,或许大量的测试方案最终还会被舍弃,但是我们必须这样做。实际上如果不进行方案的实验,正式的开发反而可能遭遇返工和混乱的拆补,会严重分散重新......