React进阶 - 12(浅谈 state、props与render函数的关系)

本章内容

目录

    • 一、state 与 render 函数的关系
    • 二、props 与 render函数的关系

上一节我们讲了如何使用 PropTypesDefaultProps来进行属性的类型校验及设置属性默认值。本节内容我们来了解一下 statepropsrender函数的关系。

一、state 与 render 函数的关系

  • 我们知道,React是一个有”数据“驱动视图的框架,即:数据发生变化,页面视图就会自动的跟着发生变化。那这背后的原理是怎么样的呢?
  • 这背后其实是这样运作的:当组件的 state或者 props发生变化时,render函数就会重新执行。而界面又是由 render函数渲染出来的,所有数据发生变化,界面自然而然的自动跟着变化。
  • 下面我们来打开 TodoList.js来演示一遍(不断地更改输入框的值,观察 render函数的执行情况)
import React, { Component, Fragment } from "react";
import TodoItem from "./TodoItem";class TodoList extends Component{constructor(props) {super(props)this.deleteData = this.deleteData.bind(this)this.addListData = this.addListData.bind(this)this.changeInputValue = this.changeInputValue.bind(this)this.state = {inputValue: '', list: []} // 1、一旦 state 中的数据发生变化(可以通过操作输入框的数据来使其数据发生变化)}render() {  // 2、render 函数会重新执行(重新使用新的数据进行渲染)console.log('render') // 3、这里使用 console 来巧妙观察render函数是否在数据变化时执行return (<Fragment><div><label>请输入要进行的事项:</label><input value={this.state.inputValue} onChange={this.changeInputValue} /><button onClick={this.addListData}> 提交 </button></div><ul> {this.getTodoItem()} </ul></Fragment>)}getTodoItem() {return this.state.list.map((item, index) => {return <TodoItem key={index} content={item} index={index} deleteFn={this.deleteData}></TodoItem>})}deleteData(index) {this.setState((prevState) => {const list = [...prevState.list]list.splice(index, 1)return {list}})}addListData() {this.setState((prevState) => ({list: [...prevState.list, prevState.inputValue],inputValue: ''}))}changeInputValue(e) {const value = e.target.valuethis.setState(() => ({inputValue: value})) }
}export default TodoList
  • 运行代码,你会发现,当输入框输入数据在变化时,控制台就相应的输出 render函数中打印的信息”render“
    请添加图片描述

二、props 与 render函数的关系

  • 打开 TodoItem.js,我们来演示下 props变化,界面跟着变化的情形
import React, { Component } from 'react'
import PropTypes from 'prop-types' class TodoItem extends Component {constructor(props) {super(props)this.handleClick = this.handleClick.bind(this)}render () {console.log('TodoItem 的 render 函数执行了') // 1、当属性数据发生变化,会重新执行 render 函数,打印此信息/*2、通过属性从父组件传来的数据。2.1 子组件的 content 是从父组件接收的,在父组件 TodoList 里,content的值是列表循环的每一项。当输入框输入数据并点击提交,列表的数据会发生变化,子组件收到的属性数据也会发生变化,子组件的 render 函数会根据新值进行渲染2.2 当父组件的 render 函数运行时,其子组件的 render 函数也会被运行一次。因为子组件也是被父组件的render函数渲染出来的,所以父组件的render执行,子组件的render也会执行*/const { content, title } = this.propsreturn (<div onClick={this.handleClick}>{/* 展示在界面的内容 content2 */}{title}---{content}</div>)}handleClick() {const { deleteFn, index } = this.propsdeleteFn(index)}
}TodoItem.propTypes = {title: PropTypes.string.isRequired,content: PropTypes.string,index: PropTypes.number,deleteFn: PropTypes.func
}TodoItem.defaultProps = {title: '我是子组件'
}export default TodoItem

请添加图片描述

  • 本章的 statepropsrender函数的关系介绍到这里。可能小伙伴们存在一些疑惑,可以等介绍完”虚拟DOM“的知识后回过来看,那时可能会对 React的”数据驱动“思想有更深的了解

到此,本章内容结束!

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

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

相关文章

C++中的const常量-->‘only read,can‘t change‘

2024年1月22日 ///昨天外面下雨地没干&#xff0c;骑车摔得好结实&#xff0c;,, 2024年1月23日 内容整理自The Cherno:C系列 这个关键字确实有点难&#xff0c;看了好几遍原视频整理出来的知识框架&#xff0c;还需要加以练习 -----------------------------------------…

【AI视野·今日Robot 机器人论文速览 第七十五期】Thu, 11 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Thu, 11 Jan 2024 Totally 16 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Analytical Model and Experimental Testing of the SoftFoot: an Adaptive Robot Foot for Walking over Obstacles and Irre…

spawn_group_template | spawn_group | linked_respawn

字段介绍 spawn_group | spawn_group_template 用来记录与脚本事件或boss战斗有关的 creatures | gameobjects 的刷新数据linked_respawn 用来将 creatures | gameobjects 和 boss 联系起来&#xff0c;这样如果你杀死boss&#xff0c; creatures | gameobjects 在副本重置之前…

「我在淘天做技术」智能对话新纪元:百万日活对话机器人的 LLM 落地实践

作者&#xff1a;智能小蜜团队 一、前言 阿里小蜜家族&#xff08;阿里小蜜、店小蜜、万象&#xff09;&#xff0c;从 2015 年发展至今&#xff0c;已经成为了覆盖淘天 P-C&#xff08;平台-消费者&#xff09;、B-C&#xff08;商家-消费者&#xff09;、P-B&#xff08;平台…

【明道云】【企业数字化】如何将明道云的数据直连SmartBi使用

【背景】 明道云优势在于上传和企业内部流程的系统化&#xff0c;换句话说&#xff0c;是产生数据的部分。 SmartBi优势在于生成报表和即席查询等&#xff0c;是使用沉淀数据的部分。 如果能将这两部分的数据打通&#xff0c;可以大大扩展企业数字化框架的覆盖范围。让这两套平…

【Linux】Linux进程信号(下)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

独步IT界,开放API接口文档新标杆!

目录 1、简介 1.1 什么是API接口 1.2 为什么开放API接口 1.3 API接口的优势和应用领域 1.4 API接口的基本原则和设计准则 2、接口认证 2.1 认证方式和流程 2.2 API密钥的生成和管理 2.3 认证错误处理 3、接口调用 3.1 请求方法和URL规范 3.2 请求参数和格式 3.3 响…

遍历子网所有ip地址,寻找空闲ip

在cmd窗口下输入如下代码&#xff1a; for /l %i in (1,1,255) do ping -n 1 -w 60 10.183.27.%i | find "Reply" >> d:\pingall27.log 得到如下结果 上图中&#xff0c;有reply的代表该IP已经被占用。但是观察红框中 22-->25之间缺少23 24 则说明23/24 是…

ChatGPT到底好不好用?相比于搜索引擎的优势

在数字化时代&#xff0c;获取信息的方式正经历着翻天覆地的变化。搜索引擎曾经是我们获取信息的首选工具&#xff0c;但现在&#xff0c;随着人工智能技术的飞速发展&#xff0c;ChatGPT等智能聊天机器人正在逐渐改变我们搜索和处理信息的方式。那么&#xff0c;ChatGPT到底好…

宿舍安全用电监模块

学校宿舍安全用电监测模块是针对 0.4kV 以下的 TT、TN 系统设计的智能电力装置&#xff0c;具有单、三相交流电测量、四象限电能计量、谐波分析、开关量输入、继电器输出功能&#xff0c;以及 RS485 通讯或 GPRS 无线通讯功能&#xff0c;通过对配电回路的剩余电流、导线温度等…

理想架构的Doherty功率放大器理论与仿真

Doherty理论—理想架构的Doherty功率放大器理论与仿真 参考&#xff1a; 三路Doherty设计 01 射频基础知识–基础概念 ADS仿真工程文件链接&#xff1a;理想架构的Doherty功率放大器理论与仿真 目录 Doherty理论---理想架构的Doherty功率放大器理论与仿真0、Doherty架构的作用…

神经网络算法与逻辑回归:优势与差异

神经网络算法和逻辑回归都是预测模型中的重要工具&#xff0c;但它们在处理复杂和非线性问题时表现出不同的性能。本文将深入探讨神经网络算法相对于逻辑回归的优势&#xff0c;以及它们在不同场景下的适用性。 一、引言 神经网络算法和逻辑回归都是预测模型中的重要工具&…

Python - argparse模块

python中的argparse模块&#xff0c;用于命令后参数解析&#xff0c;方便测试&#xff0c;是python中自带的模块。 可以自动生成帮助文档&#xff0c;和使用手册。而且当用户在执行程序的时候&#xff0c;输入无效的参数时&#xff0c;会给出对应的错误信息。 使用方法&#…

贪吃蛇(C)

游戏背景&#xff1a;贪吃蛇是久负盛名的游戏&#xff0c;它也和俄罗斯⽅块&#xff0c;扫雷等游戏位列经典游戏的⾏列。 总&#xff1a; 游戏设计大纲&#xff1a; 使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇。 实现的基本功能&#xff1a; 1、贪吃蛇地图绘制…

自己构建webpack+vue3+ts

先看看我的目录结构&#xff08;我全局使用TS&#xff09;&#xff1a; 一、安装配置webpack打包 安装esno npm install esnoesno 是基于 esbuild 的 TS/ESNext node 运行时,有了它&#xff0c;就可以直接通过esno *.ts的方式启动脚本&#xff0c;package.json中添加 type:…

echarts绘制饼图,部分数据隐藏指示线和文本,hover时隐藏指示线和文本的类别也不显示tooltip提示

option {tooltip: {trigger: item,formatter: (p) > {if (p.name) {return ${p.name}&#xff1a;${p.value}个;}},backgroundColor: #ffffff,textStyle: { color: #666666 } // 提示标签字体颜色},legend: {top: 5%,left: center},series: [{name: Access From,type: pie,…

【机组】指令控制模块实验的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f33a;一、 实验目…

重叠柱状图做法,全程动图演示

最终效果&#xff1a; 具体步骤&#xff1a; 其他图形画法&#xff1a; 点线对比图做法&#xff0c;全程动图演示 气泡图做法&#xff0c;全程动图演示 重叠柱状图做法&#xff0c;全程动图演示 瀑布图做法&#xff0c;全程动图演示 对称图做法&#xff0c;全程动图演示

[Tomcat] [最全] 目录和文件详解

打开tomcat的解压之后的目录可以看到如下的目录结构&#xff1a; Bin bin目录主要是用来存放tomcat的命令&#xff0c;主要有两大类&#xff0c;一类是以.sh结尾的&#xff08;linux命令&#xff09;&#xff0c;另一类是以.bat结尾的&#xff08;windows命令&#xff09;。 …

npm或者pnpm或者yarn安装依赖报错ENOTFOUND解决办法

如果报错说安装依赖报错&#xff0c;大概率是因为npm源没有设置对&#xff0c;比如我这里安装protobufjs的时候报错&#xff1a;ENOTFOUND npm ERR! code ENOTFOUND npm ERR! syscall getaddrinfo npm ERR! errno ENOTFOUND npm ERR! network request to https://registry.cnpm…