【React】类组件和函数组件

news2024/10/6 18:23:30

构建组件的方式

  1. 函数式组件(function)
  2. createElement(不建议使用)
  3. 类组件形式创建(不建议使用)

对于 React 的理解

React, 用于构建用户界面的JavaScript库,本身只提供了Ul层面的解决方案。(遵循组件设计模式、声明式编程范式和函数式编程概念,以使前端应用程序更高效。)

使用虚拟D0M来有效地操作DOM,遵循从高阶组件到低阶组件的单向数据流。帮助我们将界面成了各个独立的小块,每一个块就是组件,这些组件之间可以组合、嵌套,构成整体页面,且易于理解和增加可维护性。

比如类组件,jsx 会被 babel 编译为合法的 js 语句。被传入的数据可以通过 this.props 在 render() 中访问。

class HelloMessage extends React.Component {
    render() {
        return <div>Hello {this.props.name}</div>;
    }
}
ReactDOM.render(
    <HelloMessage name="Taylor" />,
    document.getElementById("hello-example")
);

react 还有一些特性,jsx 语法、单向数据流(react 本身来说 props 只能通过父组件向子组件传输,不能反过来修改,便于对数据的控制)、虚拟 DOM(diff、patch,高效操作 DOM)、声明式编程、Component(一切皆为组件)

声明式编程:关注要做什么,而不是怎么做,我们可以根据逻辑的计算声明要显示的组件。

比如命令式编程,一步一步描述过程进行操作:


const map = new Map.map(document.getElementById("map"), {
    zoom: 4,
    center: { lat, lng },
});

const marker = new Map.marker({
    position: { lat, lng },
    title: "Hello Marker",
});

marker.setMap(map);

然后 react 的声明式编程只需要,声明出页面结构,然后渲染页面:

<Map zoom={4} center={(lat, lng)}>
    <Marker position={(lat, lng)} title={"Hello Marker"} />
</Map>

state 和 props

state 用于维护自身组件的数据状态,setState 用于修改这个数据状态,进行更新组件,重新调用组件的 render 方法;props 用来接收外部(单向数据流流,所以一般是父组件)传过来的数据(在子组件内为不可变的)。

class Button extends React.Component {
    constructor() {
        super();
        this.state = {
            count: 0,
        };
    }
    updateCount() {
        this.setState((prevState, props) => {
            return { count: prevState.count + 1 };
        });
    }
    render() {
        return (
            <button onClick={() => this.updateCount()}>
                Clicked {this.state.count} times
            </button>
        );
    }
}

setState 还可以接受第二个参数,它是一个函数,会在setState调用完成并且组件重新渲染之后被调用,可以用来监听渲染是否完成:

this.setState(
    {
        name: "JS ",
    },
    () => console.log("setState finished")
);

super() 和 super(props) 的区别

super 代表父类的构造函数,子类没有自己的 this,只能继承父类的 this 作为自己的 this,所以 super 的调用必须在constructor 的第一行 。调用 this ,一般需要传入 props 作为参数,如果不手动传入,react 内部也会自动传入 props 。所有无论有没有 constructor ,render 中都是可以调用 this.props 的。

使用 super(name) 相当于调用 father.prototype.constructor.call(this.name)

但是也不建议使用super()代替super(props)。因为在 React会在类组件构造函数生成实例后再给 this.props赋值,所以在不传递 props在 super的情况下,调用 this.props 为undefined,如下情况:

class Button extends React.Component {
    constructor(props) {
        super(); // props
        console.log(props); // {}
        console.log(this.props); // undefined
        // ...
    }
}

而传入props的则都能正常访问,确保了this.props在构造函数执行完毕之前已被赋值,更符合罗辑,如下:

class Button extends React.Component {
    constructor(props) {
        super(props); // props
        console.log(props); // {}
        console.log(this.props); // {}
        // ...
    }
}

对于类组件和函数组件的理解

  1. 写法不同
  2. 状态管理(setState 、 useState)
  3. 生命周期(函数组件不存在生命周期,它是使用 useEffect 替代生命周期发挥作用)
  4. 调用方法(函数直接调用,类实例化后再调用render方法)
  5. 获取渲染的值

props 是只读的,但是 this 是可变的(可以在 render 和生命周期读取最新值),所以如果组件在请求运行时更新,类组件 this.props 可以获取最新的值,而 函数组件 props 仍是旧值(函数组件本身不存在 this)。

// function
function ProfilePage(props) {
    const showMessage = () => {
        alert('Followed ' + props.user);
    }
    const handleClick = () => {
        setTimeout(showMessage, 3000);
    }
    return (
        <button onClick={handleClick}>Follow</button>
    )
}
// class
class ProfilePage extends React.Component {
    showMessage() {
        alert('Followed ' + this.props.user);
    }
    handleClick() {
        setTimeout(this.showMessage.bind(this), 3000);
    }
    render() {
        return <button onClick={this.handleClick.bind(this)}>Follow</button>
    }
}

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

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

相关文章

站岗放哨树形dp

前言&#xff1a;好久没有写树上dp了&#xff0c;这儿题目还是挺有意思的 题目地址 #include<bits/stdc.h> #include<iostream> using namespace std;//#define int long long int n; const int N (int)1e510; int e[N],ne[N],h[N],idx 0; int dp[2][N];void add…

【笔记】神领物流Day1.1.20权限管家

传智权限管家是一个通用的权限管理中台服务&#xff0c;在神领物流项目中&#xff0c;我们使用权限系统管理企业内部员工&#xff0c;比如&#xff1a;快递员、司机、管理员等。 在权限管家中可以管理用户&#xff0c;管理后台系统的菜单&#xff0c;以及角色的管理。 权限管家…

【百度文心智能体】想开发爆款智能体?来看看 万圣节之夜探秘者 智能体开发流程大揭秘

目录 前言 一. 创作灵感 二. 智能体中Prompt如何设计 2.1 头像 && 聊天背景 2.2 智能体简介 && 角色定位与目标 2.3 思考路径 && 个性化 2.4 开场白 && 自动追问 2.5 插件选择 三. 总结 前言 从2022年11月底ChatGPT …

JavaEE: 数据链路层的奇妙世界

文章目录 数据链路层以太网源地址和目的地址 类型数据认识 MTU 数据链路层 以太网 以太网的帧格式如下所示: 源地址和目的地址 源地址和目的地址是指网卡的硬件地址(也叫MAC地址). mac 地址和 IP 地址的区别: mac 地址使用6个字节表示,IP 地址4个字节表示. 一般一个网卡,在…

论文选题没思路?用这7个GPT提示词10分钟确定论文选题

选题是论文写作的第一步&#xff0c;也是至关重要的一步。毕业论文选题都是让大学生头疼的大事。没有灵感、方向不清、信息太多&#xff0c;常常让人无从下手。现在有了ChatGPT这样的AI写作辅助工具&#xff0c;它可以帮你快速生成丰富的选题思路&#xff0c;轻松解决选题难题。…

Anaconda创建环境

目录 前言 第一步&#xff1a;更改环境创建位置 第二步&#xff1a;安装环境 前言 在我们创建多个项目的时候&#xff0c;有时会安装的库版本冲突&#xff0c;所以最好是一个项目一个环境 第一步&#xff1a;更改环境创建位置 新安装Anaconda后&#xff0c;在创建环境时环…

洛谷每日一题(P1205 [USACO1.2] 方块转换 Transformations)矩阵变换

原题目链接&#xff1a; P1205 [USACO1.2] 方块转换 Transformations - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 原题目截图&#xff1a; 思路分析&#xff1a; 这题目还是比较简单&#xff0c;模拟一下旋转变化的过程&#xff0c;然后注意变换的规律就行了。 读取输入…

电脑提示msvcp140.dll丢失如何解决,马上教你6种解决方法

在使用电脑时&#xff0c;我们可能会遇到提示缺少msvcp140.dll的错误信息。这个提示意味着我们的电脑中缺少MSVCP140.dll这个文件&#xff0c;它是某些程序运行所必需的。如果我们遇到这个问题&#xff0c;应该如何解决呢&#xff1f;本文将详细解析如何解决msvcp140.dll丢失的…

C. Tree Pruning【Codeforces Round 975 (Div. 1)】

C. Tree Pruning (永远不知道为什么TLE直到把初始化的memset换成for循环 题意很简单&#xff0c;就是找到一个深度&#xff0c;使得删除最少的节点且所有的叶子节点都为这个深度。 从小到大遍历可能的深度i&#xff0c;容易知道所有 深度大于i的节点 和所有 子树最大深度小于i…

vue出现Component name “Politic“ should always be multi-word错误

效果 原因 组件名不能为单个单词&#xff0c;怕和html标签混淆 解决方法 1.选择多个单词区分 2.修改package.json里的rules规则&#xff0c;忽略文件命名校验

详细解释:前向传播、反向传播等

详细解释:前向传播、反向传播等 在机器学习和深度学习中,**前向传播(Forward Propagation)和反向传播(Backward Propagation)**是训练神经网络的两个核心过程。理解这两个概念对于掌握神经网络的工作原理、优化方法以及模型微调技术(如LoRA、P-tuning等)至关重要。以下…

YOLO11改进|注意力机制篇|引入ELA注意力机制

目录 一、【ELA】注意力机制1.1【ELA】注意力介绍1.2【ELA】核心代码 二、添加【ELA】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【ELA】注意力机制 1.1【ELA】注意力介绍 这篇论文的作者通过分析Coordinate Attention(C…

Python中的数据可视化:从入门到进阶

数据可视化是数据分析和科学计算中的重要环节&#xff0c;它通过图形化的方式呈现数据&#xff0c;使复杂的统计信息变得直观易懂。Python提供了多种强大的库来支持数据可视化&#xff0c;如Matplotlib、Seaborn、Plotly等。本文将从基础到进阶&#xff0c;详细介绍如何使用这些…

如何构建LSTM神经网络模型

一、了解LSTM 1. 核心思想 首先&#xff0c;LSTM 是 RNN&#xff08;循环神经网络&#xff09;的变体。它通过引入细胞状态 C(t) 贯穿于整个网络模型&#xff0c;达到长久记忆的效果&#xff0c;进而解决了 RNN 的长期依赖问题。 2. 思维导图 每个LSTM层次都有三个重要的门结构…

贝尔曼公式

为什么return 非常重要 在选择哪个策略更好的时候&#xff0c;此时需要使用到return&#xff0c;比如下面三个策略的返回值。 策略1: 策略2&#xff1a;策略3&#xff1a;涉及到两个policys path How to calculate return 定义 上图定义了不同的起点下的return value 递推…

优化销售漏斗建立高效潜在客户生成策略的技巧

如何建立有效的潜在客户生成策略&#xff1f;建立有效潜在客户生成策略需要准确定义目标受众&#xff0c;利用内容营销、SEO、社交媒体、邮件营销和定向广告吸引客户&#xff0c;参加行业会议并跟踪分析数据。借助Zoho CRM系统&#xff0c;企业能够更加高效地管理客户信息&…

Windows上 minGW64 编译 libssh2库

下载libssh2库:https://libssh2.org/download/libssh2-1.11.0.zip 继续下载OpenSSL库: https://codeload.github.com/openssl/openssl/zip/refs/heads/OpenSSL_1_0_2-stable

算法讲解—最小生成树(Kruskal 算法)

算法讲解—最小生成树&#xff08;Kruskal 算法&#xff09; 简介 根据度娘的解释我们可以知道&#xff0c;最小生成树(Minimum Spanning Tree, MST)就是&#xff1a;一个有 n n n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n n n 个结点…

【Diffusion分割】CTS:基于一致性的医学图像分割模型

CTS: A Consistency-Based Medical Image Segmentation Model 摘要&#xff1a; 在医学图像分割任务中&#xff0c;扩散模型已显示出巨大的潜力。然而&#xff0c;主流的扩散模型存在采样次数多、预测结果慢等缺点。最近&#xff0c;作为独立生成网络的一致性模型解决了这一问…

【Python】数据可视化之聚类图

目录 clustermap 主要参数 参考实现 clustermap sns.clustermap是Seaborn库中用于创建聚类热图的函数&#xff0c;该函数能够将数据集中的样本按照相似性进行聚类&#xff0c;并将聚类结果以矩阵的形式展示出来。 sns.clustermap主要用于绘制聚类热图&#xff0c;该热图通…