React系列之框架特点和组件类型

news/2024/4/29 5:34:41/文章来源:https://blog.csdn.net/cherry__yu/article/details/137025764

文章目录

  • React
    • MVC MVP MVVM
    • 单/双向数据绑定
    • React特点
      • JSX
    • 组件和不同类型

React

MVC MVP MVVM

Web设计模式,通过分离模块来改进代码的组织方式。

MVC 是 Model View Controller 的缩写。

  • Model:模型层,数据相关的操作。
  • View:视图层,用户界面渲染逻辑。
  • Controller:控制器,数据模型和视图之间通信的桥梁。

在这里插入图片描述

MVC 模型把视图渲染和数据处理做了隔离,通过控制器接收视图操作,传递给数据模型,数据处理后由数据模型驱动视图渲染。

MVP 是 Model View Presenter 的缩写,可以说是 MVC 模式的改良。

  • Model、View依然负责数据和视图

如果 Model 只想做数据相关的操作,把通知 View 的逻辑挪到了 Control 里,这时 Control 摇身一变称为了 Presenter。因为解耦了 Model 和 View,也使得它们的职责划分更加清晰。

在这里插入图片描述

MVVM 是 Model View - ViewModel 的缩写,ViewModel 主要靠 DataBinding 把 View 和 Model 做了自动关联,框架替应用开发者实现数据变化后的视图更新。
MVVM与MVC最大的区别:实现了View和Model的自动同步,也就是当Model的属性改变时,我们不用再自己手动操作Dom元素,来改变View的显示,而是改变属性后该属性对应View层显示会自动改变。
在这里插入图片描述

React 并不是严格意义上 MVC MVVM 这种前端架构模式,它更像一种视图层的库。在传统的 MVC、MVP、MVVM 等架构模式中,通常会将应用程序的逻辑分成不同的部分,比如模型(Model)、视图(View)和控制器(Controller)、展示器(Presenter)或视图模型(ViewModel)等,每个部分都有不同的职责和作用。而在 React 中,它更倾向于将界面拆分成多个可重用的组件,每个组件负责管理自己的状态和 UI,而不是像传统的架构模式那样严格分离模型和视图。
但它仍然可以与这些模式结合使用。例如,可以将 React 组件作为视图层,结合其他库或框架来管理应用程序的模型和控制器逻辑。
Vue.js 更偏向于模型-视图-视图模型(MVVM),但并不是严格遵循,而是借鉴并结合自己的特点。

单/双向数据绑定

单向数据绑定:Model 的更新会触发 View 的更新,View 的更新不会触发 Model 的更新,它们的作用是单向的。
双向数据绑定:Model 的更新会触发 View 的更新,View 的更新也会触发 Model 的更新,它们的作用是相互的

在这里插入图片描述

React 是单向数据绑定,当用户访问 View 时,通过触发 Events 进行交互,而在相应 Event Handlers 中,会触发对应的 Actions,而 Actions 通过调用 setState 方法对 View 的 State 进行更新,State 更新后会触发 View 的重新渲染。可以看出,在 React 中,View 层是不能直接修改 State,必须通过相应的 Actions 来进行操作。

Vue 支持单向数据绑定和双向数据绑定

  • 单向数据绑定:使用v-bind属性绑定、v-on事件绑定或插值形式{{data}}。
  • 双向数据绑定:使用v-model指令,用户对View的更改会直接同步到Model。

双向绑定的优缺点:
优点:比较方便简单。
缺点:属于暗箱操作,无法很好的追踪数据变化。

React 和 Vue 都只是单向数据流,虽然 Vue 有双向数据绑定,但是 Vue 父子组件之间数据传递仍然遵循单向数据流。

React特点

React 是一个用于构建用户界面的 JS 库。React 起源于 Facebook 的内部项目,用来架设 Instagram 网站,并于 2013 年 5 月开源。

特点:

  • 遵循组件设计模式
  • 使用虚拟DOM来高效操作DOM
  • 实现了单向响应数据流
  • JSX 是 JavaScript 语法的扩展, 可以直接在 JS 中写 XML 语法。

JSX

JSX即Javascript XML,它是对JS的语法扩展,可以直接在JS中写XML语法,JSX会将类似XML的语法转化为原生的JS。要在JSX中执行JS,需要写在{}中。
在这里插入图片描述
为了使浏览器能够读取 JSX,需要用像 Babel 这样的 JSX 转换器将 JSX 文件转换为 JavaScript 对象,然后再将其传给浏览器。
JSX 结构最终会被翻译为 React.createElement 的结构。

组件和不同类型

React 中一切都是组件,我们通常将应用程序的整个逻辑分解为小的单个部分,每个单独的部分称为组件。
组件类型:

按状态分为无状态组件和有状态组件:
无状态组件也被称为"纯函数组件",就是不维护自己的state,只负责接收props渲染DOM。
对于这种无状态的组件,使用函数式的方式声明,会使得代码的可读性更好,并能大大减少代码量。
注:函数组件没有生命周期。(React Hooks 提供了一种在无需编写 class 的情况下使用 state 和其他 React 特性的方式。Hooks 使得在函数组件中引入和复用 state、生命周期方法等)

const Todo = (props) => ( <div onClick={props.onClick}>{props.text}</div> 
)

有状态组件就是组件内部包含状态 state。有状态组件通常会带有生命周期lifecycle,用以在不同的时刻触发状态的更新。

class Hello extends React.Component{constructor(props){super(props);this.state = { tips: "Hello World!"}}componentDidMount() {console.log("ComponentDidMount", this);}render() {return (<div>{this.state.tips}</div>);}

应用场景:无状态组件更加简单,适用于展示性组件(比如图片等不需要存数据的),而有状态组件更适合处理复杂逻辑、数据管理和需要内部状态的情况。

按受控可以分为受控组件和非受控组件,主要场景是在表单中:
受控组件:表单元素的值(例如输入框、复选框、下拉框等)由 React 组件的 state 来管理,通过事件处理函数来更新 state,并将 state 的值绑定到表单元素的 value 属性。

import React, { useState } from 'react';function ControlledComponent() {const [inputValue, setInputValue] = useState('');const handleChange = (event) => {setInputValue(event.target.value);};return (<inputtype="text"value={inputValue}onChange={handleChange}/>);
}

非受控组件:在非受控组件中,表单元素的值不受 React state 的控制,而是由 DOM 元素自身来管理。通常是通过 ref 来获取表单元素的引用,然后直接在原生 DOM 元素上操作。

function UncontrolledCompenent() {const inputRef = useRef();const handleClick = () => {alert(`Input value: ${inputRef.current.value}`);}return (<div><input type="text" ref={inpuutRef} /><button onClick={handleClick}>Get Input Value</button></div>)
}

应用场景:受控组件适用于需要对表单元素进行更细粒度控制、数据验证和处理的场景。非受控组件适用于一些简单的场景,或者需要直接操作 DOM 的情况。可能会减少一些状态管理的复杂性,但也失去了 React 组件对数据流的控制。

Container Components 容器组件和 Components 展示组件/UI组件:

容器组件主要负责数据逻辑和状态管理。包含业务逻辑,例如处理用户输入、发起网络请求等。通常是 class 组件,因为它们需要使用 state 和生命周期方法。

展示组件仅负责 UI 渲染,不处理数据逻辑。接收容器组件传递的数据和回调函数,并将其渲染为用户界面。可以是函数组件或纯函数组件。

通过将容器组件和展示组件分开,我们可以实现代码的分层和逻辑的解耦,使得代码更加清晰和易于维护。

todo

高阶组件(HOC):

高阶组件是将组件作为参数并生成另一个组件的函数。可以提高代码的复用性和灵活性。
高阶组件是装饰器模式在 React 中的实现。
应用例子:

对每个页面做权限控制,若是符合权限则正常渲染页面,不符合则渲染No Role Page. 希望在一个地方统一做权限控制处理export const withAuth = (WrappedComponent) => {const WithAuth = (props) => {const { role } = props;const currentRole = async () => {return await gotRole();};const [isAdmin, setIsAdmin] = useState(false);useEffect(() => {if (role === currentRole) {setIsAdmin(true);}}, [role]);return isAdmin ? <WrappedComponent {...props} /> : <div>No Role</div>;};return WithAuth;
};

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

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

相关文章

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…

Mac添加和关闭开机应用

文章目录 mac添加和关闭开机应用添加开机应用删除/查看 mac添加和关闭开机应用 添加开机应用 删除/查看 打开&#xff1a;系统设置–》通用–》登录项–》查看登录时打开列表 选中打开项目&#xff0c;点击“-”符号

Vue指令之v-bind

v-bind用于动态设置html的标签属性&#xff0c;如src、url、title等&#xff0c;因为插值表达式{{}}没有办法用在标签属性上&#xff0c;需要用到其他工具。 比如前端要根据后端传来的参数&#xff0c;动态的显示图片&#xff0c;就需要把图片的src属性绑定到Vue实例的一个变量…

ensp中pc机访问不同网络的服务器

拓扑图如下&#xff0c;资源已上传 说明&#xff1a;pc通过2个路由访问server服务器 三条线路分别是192.168.1.0网段&#xff0c;192.168.2.0网段和192.168.3.0网段&#xff0c;在未配置的情况下&#xff0c;pc设备是访问不到server的 具体操作流程 第一&#xff1b;pc设备…

星光/宝骏/缤果/长安 车机CarPlay手机操作破解教程V2.0版本(无需笔记本、无需笔记本、无需笔记本)

之前写了个1.0版本&#xff0c;由于太局限&#xff0c;需要用到笔记本才能操作&#xff0c;很多车友反馈不方便。特此出个手机版教程&#xff0c;简单easy&#xff0c;妈妈再也不用担心我搞不定啦 一、准备工作 先卸载车机上的autokit 或者 智能互联 app&#xff0c;这步很关…

RPA使用Native Messaging协议实现浏览器自动化

RPA 即机器人流程自动化&#xff0c;是一种利用软件机器人或人工智能来自动化业务流程中规则性、重复性任务的技术。RPA 技术可以模拟和执行人类在计算机上的交互操作&#xff0c;从而实现自动化处理数据、处理交易、触发通知等任务。帮助企业或个人实现业务流程的自动化和优化…

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞分析 CVE-2023-46604

Apache ActiveMQ 是美国阿帕奇&#xff08;Apache&#xff09;软件基金会所研发的一套开源的消息中间件&#xff0c;它支持Java消息服务、集群、Spring Framework等。 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActiveMQ 5.18.2版本及以前&#xff0…

多源统一视频融合可视指挥调度平台VMS/smarteye系统概述

系统功能 1. 集成了视频监控典型的常用功能&#xff0c;包括录像&#xff08;本地录像、云端录像&#xff08;录像计划、下载计划-无线导出&#xff09;、远程检索回放&#xff09;、实时预览&#xff08;PTZ云台操控、轮播、多屏操控等&#xff09;、地图-轨迹回放、语音对讲…

Node爬虫:原理简介

在数字化时代&#xff0c;网络爬虫作为一种自动化收集和分析网络数据的技术&#xff0c;得到了广泛的应用。Node.js&#xff0c;以其异步I/O模型和事件驱动的特性&#xff0c;成为实现高效爬虫的理想选择。然而&#xff0c;爬虫在收集数据时&#xff0c;往往面临着诸如反爬虫机…

葵花卫星影像应用场景及数据获取

一、卫星参数 葵花卫星是由中国航天科技集团公司研制的一颗光学遥感卫星&#xff0c;代号CAS-03。该卫星于2016年11月9日成功发射&#xff0c;位于地球同步轨道&#xff0c;轨道高度约为35786公里&#xff0c;倾角为0。卫星设计寿命为5年&#xff0c;搭载了高分辨率光学相机和多…

API安全-WAAP全站防护

在当今数字时代&#xff0c;移动应用的数量呈爆炸性增长&#xff0c;涵盖金融、电子商务、社区、医疗、房地产、工业等各行各业。在给人类带来便利的同时&#xff0c;也给黑客带来了可乘之机&#xff0c;移动黑产也越来越强大&#xff0c;他们的重点是从传统的PC网站转移到移动…

Python中模块

基本概念 **模块 module&#xff1a;**一般情况下&#xff0c;是一个以.py为后缀的文件 ①Python内置的模块&#xff08;标准库&#xff09;&#xff1b; ②第三方模块&#xff1b; ③自定义模块。 包 package&#xff1a; 当一个文件夹下有 init .py时&#xff0c;意为该文…

【MySQL】数据库--表操作

目录 一、创建表 二、查看表 三、修改表 1. 添加字段--add 2.修改表名--rename to 3.修改列名--change 4.修改字段的数据类型--modify 5.删除字段&#xff08;列&#xff09;--drop 四、删除表 一、创建表 create [temporary]table[if not exists]table_name [([colu…

mac 系统如何生成秘钥

1.打开终端&#xff0c;输入 cd ~/.ssh 进入.ssh目录&#xff0c;输入 ls 检查是否已经存在SSH密钥。如果看到类似 id_rsa.pub 的文件&#xff0c;说明已经有一对公钥和私钥&#xff0c;不用新建&#xff0c;直接查看就可以&#xff0c;如果没有需要生成新的密钥。 2.在终端输…

安卓CountDownTimer的使用

目录 一、简介1.1 CountDownTimer简介1.2 常用API 二、CountDownTimer的用法2.1 主线程中使用2.2 工作线程中使用 三、使用注意3.1 空指针3.2 时间不是太准的问题3.3 内存泄漏问题 一、简介 CountDownTimer是Android中的一个类&#xff0c;用于实现倒计时功能。通过CountDownT…

基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)

基于Hive的天气情况大数据分析系统&#xff08;通过hive进行大数据分析将分析的数据通过sqoop导入到mysql&#xff0c;通过Django基于mysql的数据做可视化&#xff09; Hive介绍&#xff1a; Hive是建立在Hadoop之上的数据仓库基础架构&#xff0c;它提供了类似于SQL的语言&…

机器学习-生存分析:基于QHScrnomo模型的乳腺癌患者风险评估与个性化预测

一、引言 乳腺癌作为女性常见的恶性肿瘤之一&#xff0c;对女性健康构成威胁。随着医疗技术的不断进步&#xff0c;个性化医疗逐渐成为乳腺癌治疗的重要方向。通过深入研究乳腺癌患者的风险评估和个性化预测&#xff0c;可以帮助医生更准确地制定治疗方案&#xff0c;提高治疗效…

windows下QT如何集成OpenCV

说明 我在windows下使用QT Creator12创建的CMake项目&#xff0c;需要OpenCV的一些功能。由于安装的时候我选择的QT组件都是MInGW的&#xff0c;所以无法使用VS studio版本的dll库。 为什么vs的版本不能用 我安装QT选择的是MinGW版本&#xff0c;本地编译QT工程只能选择MinG…

零基础10 天入门 Web3之第1天

10 天入门 Web3 Web3 是互联网的下一代&#xff0c;它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术&#xff0c;该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划&#xff0c;可帮助大家入门 Web3&#xff1a; 想要一起探讨学习的…

C#全新一代医院手术麻醉系统围术期全流程源码

目录 一、麻醉学科的起源 二、麻醉前访视与评估记录单 患者基本信息 临床诊断 患者重要器官功能及疾病情况 病人体格情况分级 手术麻醉风险评估 拟施麻醉方法及辅助措施 其他需要说明的情况 访视麻醉医师签名 访视时间 与麻醉相关的检查结果 三、手术麻醉信息系统…