React 学习笔记4 Diffing/脚手架 - 详解

news/2025/9/22 13:24:05/文章来源:https://www.cnblogs.com/yxysuanfa/p/19104997

目录

Diffing算法

key

脚手架

create-react-app

安装

项目结构

hello world Demo


Diffing算法

当页面上显示的内容更新时/初始化时,React会将需要更新/初始化的内容形成虚拟DOM,并和之前的虚拟DOM(如果有)进行比较,把需要更新的内容推到页面上,而不是整个DOM全部都更新。

key

key是虚拟DOM的一个标识,在对比更新时,key可以用于判断新旧虚拟DOM中前后节点是否是同一个。如果在旧虚拟DOM中找到了与新虚拟DOM中一样的key,则可以确定这两个节点是同一个,如果虚拟DOM中的内容没变,则直接复用,如果虚拟DOM中的内容改变了,则生成新的DOM并进行替换。如果旧虚拟DOM中没有和新虚拟DOM一样的key,会将这个DOM生成并渲染到页面。

如果将index索引值作为Key,在组数数据更新时,可能会产生效率问题。如果数据添加到组数最末尾,不会破坏前面的数据顺序,那么并不会影响效率,但是,如果数据插入了数组最前方或者数据中间某个位置,这会导致数组中元素的index和之前并不一致,diffing算法在进行比较时,会拿着两个其实并不一致的DOM对比,并认为数据发生了改变,会生成新的真实DOM并进行渲染,会重新渲染数据,而不是复用,产生效率问题。而且,如果标签内部含有输入类DOM(input输入框、radio单选器、checkbox、select等),当使用Index作为索引值时,动态插入数据时,如果数据并不是插入最末尾,输入框中的数据也会由于前后Index相同的DOM元素其实并不是同一个,导致Input数据发生错乱。

如果不存在对数据的逆序加入、删除等操作,使用index作为key并不会产生问题的,但是,一旦数据的顺序发生改变,使用index作为Key就会产生问题。

脚手架

create-react-app

create-react-app是React提供的一个脚手架,脚手架可以用于快速创建基于某个库的模板项目。包含了基础的需要的配置,并且可以下载好所需的相关依赖。使用脚手架,可以实现模块化、组件化、工程化。

安装

1.全局安装 npm install -g create-react-app

(如果提示网络错误,可以先设置npm config set registry http://registry.npmjs.org/

2.创建项目 create-react-app 项目名

3.进入项目名文件夹,启动项目 npm start

项目结构

public 静态资源文件,存放页面、公共图片、样式等

------index.html 应用主页面,组件都渲染到这个页面上,整个项目下只有一个html文件

------mainfest.json 应用加壳配置

------robots.txt 爬虫规则,当前网站被爬取时,规定哪些数据可以被爬取,哪些不行

src 

------App.css APP组件样式

------App.js 生成App组件,组件首字母大写

------App.test.js APP组件测试文件

------index.css 通用样式,也可以放入public下,并在html中引入

------index.js 入口文件

------reportWebVitals.js 记录页面性能,内部使用web-vitals库,使用时需要自己编写配置,并不是完全配好的

------setupTests.js 用于组件测试,也是需要自己配置,使用了库jest-dom

public-index.html

src-index.js

hello world Demo

在react中,.js和.jsx文件import时可以省略扩展名

import './App.css';
import React from 'react'
class App extends React.Component{
render(){
return (
hello world
)
}
}
export default App;

在实际编写项目时,一般在src下创建components文件,把组件放入components文件中,每个组件一般也都是一个文件夹,里面放置组件的js和组件的其他资源文件等,最后在App组件中引入使用。

src/components/Hello/hello.css

h2{
background-color: aquamarine;
}

src/components/Hello/index.jsx

import {Component } from 'react'
import './hello.css'
export default class Hello extends Component{
render(){
return (
Hello
)
}
}

src/components/World/world.css

.world{
background-color:blueviolet;
}

src/components/World/index.jsx

import {Component } from 'react'
import './world.css'
export default class Hello extends Component{
render(){
return (
World
)
}
}

src/App.js

import './App.css';
import React from 'react'
import Hello  from './components/Hello'
import World from './components/World'
class App extends React.Component{
render(){
return (
)
}
}
export default App;

如果组件文件以js结尾,有时候,js结尾的文件并不是全是组件,一般为了区分组件和一般js文件,可以让组件的js文件名首字母大写,或者让组件文件以.jsx为扩展名。

样式模块化

对于两个组件,如果他们各有自己的css文件,且css文件中存在冲突的命名,则后引入的样式会覆盖先引入的文件,为了避免这种情况,首先,要给css的名字之前先加上module,然后,在引入样式时,给引入的样式命名,然后给组件中标签配置样式时,配置命名.样式,就可以避免冲突。

hello.module.css

.h2Demo{
background-color: aquamarine;
}

hello/index.jsx

import {Component } from 'react'
import hello from './hello.module.css'
export default class Hello extends Component{
render(){
return (
Hello
)
}
}

world.module.css

.h2Demo{
background-color:blueviolet;
}

world/index.jsx

import {Component } from 'react'
import world from './world.module.css'
export default class Hello extends Component{
render(){
return (
World
)
}
}

对一个jsx文件,里面的内容框架是固定的,可以通过一些代码片段快速生成框架,不需要自己完全手敲。要实现这种效果,需要先安装插件:

然后再敲rcc,就能生成react类式组件的框架,

import React, { Component } from 'react'
export default class index extends Component {
render() {
return (
index
)
}
}

敲rfc能生成函数式组件的框架。

import React from 'react'
export default function index() {
return (
index
)
}

在插件的details部分,可以查看其他的代码片段:

组件化流程

1. 拆分组件:把界面拆分成一个个组件

2. 实现静态组件

使用组件实现静态页面的效果

3. 实现动态组件

3.1能够动态显示初始化数据

3.2能够交互

父组件给子组件传值

通过props传递。

父组件App.js

import './App.css';
import React from 'react'
import World from './components/World'
class App extends React.Component{
state = {
dataList:[
{id:'001',name:'a',flag:true},
{id:'002',name:'b',flag:true},
]
}
render(){
return (
)
}
}
export default App;

子组件World/index.jsx

import {Component } from 'react'
import world from './world.module.css'
export default class Hello extends Component{
render(){
console.log(this.props.dataList)
return (
1
)
}
}

子组件给父组件传值

通过函数,父组件先通过props给子组件传递一个函数,子组件调用函数时,以参数的形式给父组件传递数据。

父组件App.js

import './App.css';
import React from 'react'
import Hello  from './components/Hello'
import World from './components/World'
class App extends React.Component{
state = {
dataList:[
{id:'001',name:'a',flag:true},
{id:'002',name:'b',flag:true},
]
}
setList = (dataObj)=>{
let newList = [dataObj,...this.state.dataList]
console.log(newList)
this.setState({dataList:newList})
}
render(){
return (
)
}
}
export default App;

子组件Hello/index.jsx

import {Component } from 'react'
export default class Hello extends Component{
setData = ()=>{
this.props.setList(
{id:'003',name:'c',flag:false}
)
}
render(){
return (
)
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025.9.21+7 [未完]

2025.9.21 Week 笔记2025.9.22

VisualStudio-Python-工具指南-全-

VisualStudio Python 工具指南(全)原文:zh.annas-archive.org/md5/396df14cf233d147d6dfcb4a589a8b75 译者:飞龙 协议:CC BY-NC-SA 4.0前言 和许多其他开发者一样,Python 开发者总是需要找到方法来管理不同工具之…

深入解析:Spring Boot注解

深入解析:Spring Boot注解2025-09-22 13:14 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

Gevent和Subprocess问题

Gevent和Subprocess问题Gevent和Subprocess问题 1、复现 在main文件中调用gevent、并做了monkey pathch, 然后再调用subprocess.Popen(),出现一直卡住的问题Python 标准库里的很多 IO(网络 socket、ssl、time.sleep…

WPF ListBox loaded 76.6M items with imagesource

Install-Package Microsoft.Extensions.DependencyInjection; Install-Package CommunityToolkit.mvvm; public async Task InitDataAsync() {watch.Start();string imgDir = @"../../../Images";if (!Direc…

Ansible自动化运维实战 - 详解

Ansible自动化运维实战 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

建筑行业能源管理破局:MyEMS 打造商业楼宇 “能耗可视化 + 智能调控” 方案

在建筑行业的可持续发展浪潮中,商业楼宇正面临着巨大的能源管理压力。高昂的运营成本、日趋严格的碳排政策以及业主与租户对舒适环境日益增长的需求,共同构成了行业必须面对的挑战。传统的能源管理方式往往依赖于人工…

【数据结构】双向链表 - 指南

【数据结构】双向链表 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

告别“能源糊涂账”:MyEMS如何帮企业把能耗数据“算明白、用到位”

对于许多企业而言,能源成本是运营中一笔不小的开支,但却常常是一笔“糊涂账”。电费账单只有一个总数,只知道“花了多少钱”,却不知道“钱花在了哪里”、“谁在用”、“什么时候用的”、“有没有浪费”。这种粗放式…

完整教程:ElasticSearch倒排索引原理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Windows 离线环境下使用 VS Code 连接容器 Python 环境完整指南(亲测可用)

前言 在离线服务器环境中进行 Python 开发时,如何利用 VS Code 的强大功能进行调试和开发是一个常见需求。本文将详细介绍如何在 Windows 离线环境下,通过 WSL 和 Docker 容器实现 VS Code 连接 Python 环境的完整方…

Macos 安装kali报错

执行某个安装步骤失败。您可以尝试从菜单中重新运行这个失败的项目, 或跳过它并选择其他项目。失败的步骤是:选择并安装软件 选择语言的时候选择英文就能安装了。不清楚是什么原因

负载排查和分析二

负载排查和分析二明白了,我来帮你做两件事:改进中断部分:完善硬中断、软中断触发机制和它们之间的关联关系,增加图示和说明。优化整个文档美观性:用清晰的表格、层次分明的标题、缩进流程图、代码块高亮,保证可读…

负载排查和分析三

负载排查和分析三明白了,你希望 Step1: 基础统计 能够做到真正的 闭环诊断,即不仅有指标解释,还要告诉用户:可能现象(系统表现或问题)分析工具/命令(如何收集更多数据或验证)分析方法(指标和现象的对应关系、…

完整教程:线程、进程、协程

完整教程:线程、进程、协程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

CF913G Power Substring

推歌:SPOTLIGHT HUNTER 麦晓雯联动出了,没抽到。我爸把我 75 研究卷霍霍露娜上了导致我没法免费保底。诋毁他。 洛谷传送 说回正题。设 \(a\) 有 \(n\) 位,所求的 \(a\) 在 \(2^k\) 中距离末位的位数为 \(m\),显然…

深入解析:老树发新芽:六西格玛培训为石油机械制造注入持久活力

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

YC大佬分享的 10 个 vibe coding技巧,看完收获巨大

1、当 AI 卡住的时候切换战场。 问题: 当你在使用 cursor claude code 这样的 AI 编程工具,在编程的时候,如果遇到 AI 无法实现某个功能或者无法修复某一个错误,并且反复尝试都失败(陷入逻辑死循环) 技巧: 这时…

ES集群部署-EFK架构实战 - 实践

ES集群部署-EFK架构实战 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

《BOE解忧实验室》第四季圆满收官 以科技重塑文化生活新范式

9月10日,由 BOE(京东方)自制的技术科普综艺节目《BOE解忧实验室》第四季迎来收官,全平台累计曝光量突破4.79亿,成为科技企业破圈营销行业示范标杆。作为中国科技企业首档技术科普综艺,本季节目以“中国地标+科技…