Django面试题
1. 什么是wsgi?
WSGI 是 “Web Server Gateway Interface” 的缩写,它是一种用于 Python Web 应用程序和 Web 服务器之间通信的标准接口
。它定义了一组规则和约定,使 Web 服务器能够与任何符合 WSGI 规范的 Python Web 应用程序进行交互。
###\ WSGI 的作用
WSGI 的作用是将 Web 服务器与 Python Web 应用程序解耦,使它们能够独立开发和部署。这使得 Web 服务器可以支持多种不同的 Python Web 框架,而无需修改其代码。
###\ WSGI 的工作原理
WSGI 的工作原理如下:
- Web 服务器接收到一个 HTTP 请求。
- Web 服务器将请求传递给 WSGI 应用程序。
- WSGI 应用程序处理请求并生成一个 HTTP 响应。
- Web 服务器将响应返回给客户端。
2. asgi和wsgi的异同
WSGI和ASGI,都是基于Python设计的网关接口
(Gateway Interface,GI)
WSGI是基于http协议模式开发的,不支持websocket
ASGI不仅支持当前的web开发中的一些新的协议标准,同时ASGI支持原有模式和Websocket
的扩展,即ASGI是WSGI的扩展。
网关接口(Gateway Interface,GI)
网关接口是一个定义了 Web 服务器
和 Web 应用程序
之间通信方式
的规范。只有Web应用程序都实现了网关接口规范后,双方的通信才能顺利完成。常见的网关接口协议:CGI、FASTAPI、WSGI、ASGI。
web服务器 && web应用程序
Web 服务器
Web 服务器 是一个软件程序,它运行在计算机上,用于处理来自客户端(例如浏览器)的 HTTP 请求,并向客户端发送响应。
Web 服务器的主要功能包括:
- 接收来自客户端的 HTTP 请求
- 处理 HTTP 请求并解析 URL
- 查找请求的资源(例如 HTML 文件、图像文件)
- 将资源的内容发送给客户端
- 处理 HTTP 头和状态码
- 处理 Cookie 和会话
Web 应用程序
Web 应用程序 是一个运行在 Web 服务器上的软件程序,它用于处理来自客户端的 HTTP 请求并生成动态内容。Web 应用程序通常使用编程语言(例如 Python、PHP、Java)编写,并使用数据库来存储数据。
Web 应用程序的主要功能包括:
- 处理来自客户端的 HTTP 请求
- 生成动态内容(例如 HTML 页面、JSON 数据)
- 访问数据库
- 处理用户输入
- 处理会话
Web 服务器和 Web 应用程序的区别
特征 | Web 服务器 | Web 应用程序 |
---|---|---|
功能 | 处理 HTTP 请求并发送静态内容 | 处理 HTTP 请求并生成动态内容 |
编程语言 | C、C++ | Python、PHP、Java |
数据库 | 通常不使用 | 通常使用 |
可扩展性 | 更高 | 更低 |
示例 | Apache、Nginx、IIS | Django、Flask、WordPress |
3. django请求的生命周期?
- 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端
- 服务端的wsgiref模块接收用户请求并将请求进行初次封装
- 将请求交给Django的中间件
- 通过中间件之后将请求交给url,根据浏览器发送的不同url去匹配不同的视图函数
- 视图函数根据业务逻辑调用数据库获取相应的数据,然或根据模板渲染页面
- 视图函数将响应的页面依次通过中间件
- 到达wsgi,封装数据后反馈给客户端
4. 中间件
中间件的定义
中间件是一个用来处理Django的请求和响应
的框架级别的钩子
。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
中间件的五个方法
process_request(self,request)
:请求进来时,权限认证process_view(self, request, view_func, view_args, view_kwargs)
:路由匹配之后,能够得到视图函数process_template_response(self,request,response)
:模板渲染时执行process_exception(self, request, exception)
:异常时执行process_response(self, request, response)
:请求有响应时执行
以上方法的返回值可以是None或一个HttpResponse对象。如果是None,则继续按照Django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
Django中间件
中间件执行流程
请求到达中间件之后,先按照正序
执行每个注册中间件的process_reques方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpResponse对象,不再执行后面的process_request方法,而是执行当前对应中间件的process_response方法,将HttpResponse对象返回给浏览器。也就是说:如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。
process_request方法都执行完后,匹配路由,找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数,按正序
执行。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。
process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序
。总结所有的执行流程如下:
注意:这里的正序指的是按照MIDDLEWARE中的注册顺序从前到后顺序执行的(在settings.py里面设置中 从下到上的顺序)。
5. 什么是CSRF,Django如何解决?
CSRF概念
CSRF(cross-site request forgery),简称跨站请求伪造。,攻击者可以利用用户的登录状态,在用户不知情的情况下,以用户的身份向网站发送恶意请求。
- 受害者登录a.com,并保留了登录凭证(Cookie)。
- 攻击者引诱受害者访问了b.com。
- b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。
- a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
- a.com以受害者的名义执行了act=xx。
- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。
Django中的CSRF实现机制
django通过django.middleware.csrf.CsrfViewMiddleware
这个中间层来完成。
Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下:
1、在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值
2、当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性
3、当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御
(每一次提交表单都会生成一个新的csrftoken,所以就算恶意获得一次token,再执行另一次表单提交时,也会校验失败)
6. Django如何实现websocket
Django使用Channels实现WebSocket的方法
官方文档
Django 的核心组件
对象关系映射(ORM)
:它将面向对象编程语言(如 Python)中的对象与关系型数据库(如 MySQL)中的表进行映射。ORM 允许使用面向对象的方式来操作数据库,而无需编写复杂的 SQL 语句。
2. URL分发器
:定义 URL 模式和视图之间的映射的 Python 模块。它允许将 URL 映射到特定的视图函数,以便处理不同的请求
3. 视图
:视图是用来处理 HTTP 请求和生成响应的函数。
4. 模板
:用于将模板文件转换成 文件,并在浏览器上显示
5. 中间件
:中间件是用来拦截和修改 HTTP 请求和响应的类。它们可以用于各种目的,例如身份验证、授权、缓存和日志记录。
6. 管理站点
:管理站点是一个基于 Web 的界面,允许管理模型数据。它提供了一个用户友好的界面来创建、读取、更新和删除模型实例。
7. 表单序列化及验证系统 (Form):用于 表单和数据库存储的数据之间的转换
7. FBV & CBV
FBV (Function-Based View) 函数式视图 是 Django 中的一种视图类型,它使用 Python 函数来处理 HTTP 请求和生成响应。FBV 通常用于编写简单的视图,例如登录视图或注销视图。
CBV (Class-Based View) 类式视图 是 Django 中另一种视图类型,它使用 Python 类来处理 HTTP 请求和生成响应。CBV 通常用于编写更复杂的视图,例如列表视图或详细视图。
FBV 和 CBV 的主要区别在于:
- 代码组织: FBV 的代码通常分散在多个函数中,而 CBV 的代码通常组织在一个类中。
- 可重用性: CBV 通常比 FBV 更可重用,因为可以将 CBV 继承到其他 CBV 中,并重用其代码。
- 可测试性: CBV 通常比 FBV 更可测试,因为可以使用单元测试框架来测试 CBV 的方法。
8. 如何给CBV的程序添加装饰器?
在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator
将其转换为适用于类视图方法的装饰器。
在URL上添加
# urls.py
urlpatterns = [path("login/",views.Mydecorator(views.MyView.as_view())),
]
在类上添加,name=“函数名称”
@method_decorator(Mydecorator,name="post")
@method_decorator(Mydecorator,name="get")
class MyView(View):def get(self,request):return HttpResponse("get请求")def post(self,request):return HttpResponse("post请求")
在函数上添加
class MyView(View):@method_decorator(Mydecorator)def get(self,request):return HttpResponse("get请求")def post(self,request):return HttpResponse("post请求")
9. 列举django orm 中所有的方法
Django QuerySet 方法表格
方法 | 描述 |
---|---|
all() | 查询所有结果 |
filter(**kwargs) | 它包含了与所给筛选条件相匹配的对象。获取不到返回None |
get(**kwargs) | 返回与所给筛选条件相匹配的对象,返回结果有且只有一个。获取不到会抱错#如果符合筛选条件的对象超过一个或者没有都会抛出错误 |
exclude(**kwargs) | 它包含了与所给筛选条件不匹配的对象 |
order_by(*field) | 对查询结果排序 |
reverse() | 对查询结果反向排序 |
count() | 返回数据库中匹配查询(QuerySet)的对象数量 |
first() | 返回第一条记录 |
last() | 返回最后一条记录 |
exists() | 如果QuerySet包含数据,就返回True,否则返回False |
values(*field) | 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系 model的实例化对象,而是一个可迭代的字典序列 |
values_list(*field) | 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 |
distinct() | 从返回结果中剔除重复纪录 |
bulk_create() | 批量创建数据 |
Django ORM 方法代码示例
1. all()
方法
from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=255)author = models.CharField(max_length=255)# 查询所有图书
books = Book.objects.all()# 打印所有图书的标题
for book in books:print(book.title)
2. filter()
方法
# 查询标题为 "Django" 的图书
books = Book.objects.filter(title="Django")# 打印所有图书的标题和作者
for book in books:print(f"{book.title} by {book.author}")
3. get()
方法
# 获取主键为 1 的图书
book = Book.objects.get(pk=1)# 打印图书的标题
print(book.title)
4. exclude()
方法
# 查询标题不为 "Django" 的图书
books = Book.objects.exclude(title="Django")# 打印所有图书的标题
for book in books:print(book.title)
5. order_by()
方法
# 按标题升序排序图书
books = Book.objects.order_by("title")# 打印所有图书的标题
for book in books:print(book.title)
6. reverse()
方法
# 按标题降序排序图书
books = Book.objects.order_by("title").reverse()# 打印所有图书的标题
for book in books:print(book.title)
7. count()
方法
# 统计所有图书的数量
count = Book.objects.count()# 打印图书数量
print(f"Total books: {count}")
8. first()
方法
# 获取第一个图书
book = Book.objects.first()# 打印图书的标题
print(book.title)
9. last()
方法
# 获取最后一个图书
book = Book.objects.last()# 打印图书的标题
print(book.title)
10. exists()
方法
# 检查标题为 "Django" 的图书是否存在
exists = Book.objects.filter(title="Django").exists()# 打印结果
print(f"Book with title 'Django' exists: {exists}")
11. values()
方法
# 获取所有图书的标题和作者
values = Book.objects.values("title", "author")# 打印所有图书的标题和作者
for value in values:print(f"{value['title']} by {value['author']}")
12. values_list()
方法
# 获取所有图书的标题和作者
values_list = Book.objects.values_list("title", "author")# 打印所有图书的标题和作者
for value in values_list:print(f"{value[0]} by {value[1]}")
13. distinct()
方法
# 剔除重复的作者
authors = Book.objects.values_list("author", flat=True).distinct()# 打印所有作者
for author in authors:print(author)
10. select_related和prefetch_related的区别?
select_related
select_related通过多表join关联查询
,一次性获得所有数据,通过降低数据库查询次数来提升性能,但关联表不能太多,因为join操作本来就比较消耗性能。
# 获取id=1的文章对象同时,获取其相关username信息
Article.objects.select_related('username').get(id=1)# 获取id=1的文章对象同时,获取其相关作者名字信息
Article.objects.select_related('username__username').get(id=1)# 获取id=1的文章对象同时,获取其相关tag和相关作者名字信息。下面方法等同。
# 方式一:
Article.objects.select_related('tag', 'username__username').get(id=1)
# 方式二:
Article.objects.select_related('tag').select_related('username__username').get(id=1)# 使用select_related()可返回所有相关主键信息。all()非必需。
Article.objects.all().select_related()# 获取Article信息同时获取username信息。filter方法和selected_related方法顺序不重要。
# 方式一:
Article.objects.filter(tag__gt=3).select_related('username')
# 方式二:
Article.objects.select_related('username').filter(tag__gt=3)
prefetch_related
prefetch_related不在数据库中进行连接,而是在python中连接
,不创建带join的SQL语句
articles = Article.objects.all().select_related('category').prefecth_related('tags')# 文章列表及每篇文章的tags对象名字信息
Article.objects.all().prefetch_related('tags__name')# 获取id=13的文章对象同时,获取其相关tags信息
Article.objects.prefetch_related('tags').get(id=13)# 获取文章列表及每篇文章相关的名字以P开头的tags对象信息
Article.objects.all().prefetch_related(Prefetch('tags', queryset=Tag.objects.filter(name__startswith="P"))
)# 文章列表及每篇文章的名字以P开头的tags对象信息, 放在article_p_tag列表
Article.objects.all().prefetch_related(Prefetch('tags', queryset=Tag.objects.filter(name__startswith="P")),
to_attr='article_p_tag'
)
- 对与单对单或单对多外键ForeignKey字段,使用select_related方法
- 对于多对多字段和反向外键关系,使用prefetch_related方法
- 两种方法均支持双下划线指定需要查询的关联对象的字段名
select_related和prefetch_related的用法与区别
select_related和prefetch_related的使用
相关文章:

Django面试题
1. 什么是wsgi? WSGI 是 “Web Server Gateway Interface” 的缩写,它是一种用于 Python Web 应用程序和 Web 服务器之间通信的标准接口。它定义了一组规则和约定,使 Web 服务器能够与任何符合 WSGI 规范的 Python Web 应用程序进行交互。 #…...

Perl语言入门学习
文心一言 Perl语言入门学习可以遵循以下步骤和要点: 1. 了解Perl语言 Perl是一种功能丰富的计算机程序语言,运行在超过100种计算机平台上。Perl最初是为文本处理而开发的,但现在用于各种任务,包括系统管理、Web开发、网络编程、…...

Autoformer
A u t o f o r m e r Autoformer Autoformer 摘要 我们设计了 A u t o f o r m e r Autoformer Autoformer作为一种新型分解架构,带有自相关机制。我们打破了序列分解的预处理惯例,并将其革新为深度模型的基本内部模块。这种设计使 A u t o f o r m…...

uniapp录音播放功能
ui效果如上。 播放就开始倒计时,并且改变播放icon,另外录音则停止上一次录音。 播放按钮(三角形)是播放功能,两竖是暂停播放功能。 const innerAudioContext wx.createInnerAudioContext();export default{data(){ret…...

✊构建浏览器工作原理知识体系(网络协议篇)
🌻 前言 书接上回~ 系列文章目录: # ✊构建浏览器工作原理知识体系(开篇)# ✊构建浏览器工作原理知识体系(浏览器内核篇)# ✊构建浏览器工作原理知识体系(网络协议篇)✊构建浏览器工作原理知识体系(网页加载超详细全过程篇)为什么你觉得偶尔看浏览器的工作原理,…...

【AI大模型】Transformers大模型库(八):大模型微调之LoraConfig
目录 一、引言 二、LoraConfig配置参数 2.1 概述 2.2 LoraConfig参数说明 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。 🤗 Transformers …...

8-1RT-Thread消息队列
8-1RT-Thread消息队列 消息队列又称队列,是一种常用于线程间通信的数据结构。 消息队列控制块里有两个链表,空闲列表用来挂接空的小几块,另一个链表是用来挂接存有消息的消息框。其中消息链表头指向消息队列当中的第一个消息框,而…...

解除网站IP抓取限制的方法有哪些?
在爬取网站数据时,经常会遇到IP被限制,导致返回的数据无法显示或者直接空白的情况。这时候就需要采取一些方法来解除网站对IP的爬取限制。IP代理是帮助用户绕过网站限制,保持稳定连接,实现数据顺畅爬取的重要解决方案。 1、IP代理…...
“手撕”二叉树的OJ习题
故事的开头,我们先来三道不是oj的开胃菜,练练手感,后面9道都是OJ题。 目录 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题 第十一题 第一题 二叉树前序非递归遍历实现 。 首先我们需要一个栈来存放二…...
Linux Mint 21.3简介
Linux Mint 21.3是一个更新版本,其中包含了许多新特性和改进。以下是一些主要更新内容: 1. Cinnamon 6.0桌面环境:Linux Mint 21.3采用了最新的Cinnamon 6.0桌面环境,带来了新的功能和改进,例如支持Wayland会话&#…...
C++11 面试题整理
C面试题 1 菱形继承 2 多态 多态实现原理: 静态多态 动态多态 静态多态: 依赖函数重载,编译期确定。 函数重载:允许在同一作用于内声明多个功能类似的同名函数,函数列表不同。注意:不能仅通过返回值类型…...
【智能制造-2】焊缝跟踪
焊缝跟踪? 焊缝跟踪:指在焊接位置前方安装光学传感器进行数据采集,然后传输到焊接机器人,进行自适应的各种模糊控制算法校正焊接机器人或专机的轨迹,实现自适应控制,达到实时的焊缝跟踪。 焊缝跟踪的方法…...

优思学院|用ChatGPT快速完成数据分析图表【柏累托图法】
数据分析是很多行业的人不可少的一部分,尤其是质量工程师更是日常的工作。然而,随着科技的进步,人工智能(AI)将逐渐承担起数据计算的工作,这意味着未来的质量工程师需要具备的不仅仅是计算能力,…...
[晕事]今天做了件晕事37 extern “C“ 被认为了是外部函数
最近看到一个函数声明是 extern “C" void _dump(); 这里的声明是要告诉编译器,这个_dump是C语言的符号,没有经过mangle过的。但是这个关键字可能让人混淆是外部函数。因为这个关键字可以声明外部函数。这也算是一词多用的一个普遍问题。关键的关键…...

问题:关于醋酸钠的结构,下列说法错误的是() #媒体#媒体
问题:关于醋酸钠的结构,下列说法错误的是() A.有极性键 B.有非极性键 C.是极性分子 D.是离子晶体 参考答案如图所示...
网络安全(补充)
同步包风暴(SYN Flood)攻击者假造源网址发送多个同步数据包(SYN Packet)给服务器,服务器因无法收到确认数据包(ACK Packet),使TCP/IP协议三次握手无法顺利完成,因而无法建…...
Redis集群(3)
集群扩容 节点配置和启动 我们要加入两个节点,主节点端口为6903,从节点端口为6933。配置与6900节点类似,不再赘述。启动这两个节点: ./redis-server ../conf/cluster_m_6903.conf ./redis-server ../conf/cluster_s_6933.conf加…...

防止Selenium被检测 Google Chrome 125
背景 最近在使用selenium自动播放学习课程,相信大家也有一些类似的使用场景。 能自动化的事情,绝不自己干。 为防止被检测是机器人做题,刷视频,需要做一些小调整。 先来看作为服务方维护者,是如何检测是Selenium打…...

LeetCode 算法:螺旋矩阵c++
原题链接🔗:螺旋矩阵 难度:中等⭐️⭐️ 题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…...

【全开源】医护上门系统小程序APP公众号h5源码
医护上门系统:健康守护,就在您身边 🚪引言:开启全新的医护模式 在快节奏的现代生活中,健康问题往往成为我们关注的焦点。而“医护上门系统”正是为了满足这一需求,将专业的医疗服务送到您的家中。这一创新…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...