当前位置: 首页 > news >正文

React 与 Vue 对比指南 - 上

在这里插入图片描述

React 与 Vue 对比指南 - 上

本文将展示如何在 ReactVue 中实现常见功能,从基础渲染到高级状态管理

Hello

分别使用 reactvue 写一个 Hello World!

react

export default () => {return <div>Hello World!</div>;
}

vue

<template><div>Hello World!</div>
</template>

属性绑定

react

通过 {} 绑定属性

export default () => {const url = "https://liuyuyang.net"return <a href={url}>跳转</a>;
}

vue

通过 : 绑定属性

<script setup lang="ts">
const url = "https://liuyuyang.net"
</script><template><!-- <a href="https://liuyuyang.net"></a> --><a :href="url">跳转</a>
</template>

表达式

react

react 的表达式是单括号

export default () => {const value = "Hello World!"const getValue = () => "Hello"const getImage = () => "https://liuyuyang.net"return (<><div>{value}</div><div>{true ? 'yes' : 'no'}</div><div>{getValue()}</div><img src={getImage() + '/1.jpg'} /><div style={{ background: true ? 'red' : 'blue' }}>{value}</div></>)
}

vue

vue 的表达式是双括号

<script setup lang="ts">
const value = "Hello World!"
const getValue = () => "Hello"
const getImage = () => "https://liuyuyang.net"
</script><template><div>{{ value }}</div><div>{{ true ? 'yes' : 'no' }}</div><div>{{ getValue() }}</div><img :src="getImage() + '/1.jpg'" /><div :style="{ background: true ? 'red' : 'blue' }">{{ value }}</div>
</template>

动态类名

react

react 定义类名的方式为 className

export default () => {return <div className={`${true ? 'aaa' : 'bbb'}`}>Hello World!</div>
}

vue

vue 定义类名的方式为 class

<script setup lang="ts">
</script><template><div :class="`${true ? 'aaa' : 'bbb'}`">Hello World!</div><div :class="{ aaa: true }">Hello World!</div><div :class="{ 'aaa-bbb': true }">Hello World!</div>
</template>

条件渲染

react

react 大多数语法都比较偏向原生

export default () => {const active = 1return (<>{active === 1? <div>aaa</div>: active === 2? <div>bbb</div>: <div>ccc</div>}</>)
}

vue

vue 可以使用 v-ifv-show 进行条件渲染

<script setup lang="ts">
const active = 1
</script><template><div v-if="active === 1">aaa</div><div v-else-if="active === 2">bbb</div><div v-else="true">ccc</div>
</template>

渲染数据

react

react 虽然有点语法写起来没有 vue 简单,但他的有点在于更加灵活、自由,非常受益于大型复杂的项目

export default () => {const list = ['aaa', 'bbb', 'bbb']return (<ul>{list.map((item, index) => {return <li key={index}>{item}</li>})}</ul>)
}

vue

vue 使用 v-for 进行数据渲染

<script setup lang="ts">
const list = ['aaa', 'bbb', 'bbb']
</script><template><ul><li v-for="(item, index) in list" :key="index">{{ item }}</li></ul>
</template>

事件处理

react

reactonClick 需要的是一个函数

export default () => {const func = () => alert("Hello World!")// return <button onClick={() => alert("Hello World!")}>点击弹框</button>;return <button onClick={func}>点击弹框</button>;
}

react 事件传参方式

export default () => {const func = (msg: string) => {alert(msg)}return <button onClick={() => func('Hello World!')}>点击弹框</button>;
}

vue

vue@click 需要的是实例上已有的函数,比如在当前文件以及全局定义或内置的函数。因为 alert 不在实例上,因此不能直接 @click="alert('Hello World!')",但我们可以在当前文件定义一个函数,在函数里面使用 alert,然后调用这个函数

<script setup lang="ts">
const func = () => {alert('Hello World!')
}
</script><template><!-- <button v-on:click="func">点击弹框</button> --><button @click="func">点击弹框</button>
</template>

vue 事件传参方式

<script setup lang="ts">
const func = (msg: string) => {alert(msg)
}
</script><template><button @click="func('Hello World!')">点击弹框</button>
</template>

状态处理

react

react 通过 useState 进行状态管理

import { useState } from "react";export default () => {const [count, setCount] = useState(0)return (<><button onClick={() => setCount(count + 1)}>+1</button><div>{count}</div></>);
}

vue

vue 通过 refreactive 进行状态管理

<script setup lang="ts">
import { ref } from 'vue';
const count = ref(0)// count.value = 100 在脚本中需要加.value,在模板中则不需要
</script><template><button @click="count++">+1</button><button @click="() => count++">+1</button><div>{{ count }}</div>
</template>

表单处理

react

表单处理这一点个人感觉 react 要比 vue 麻烦些

import { useState } from "react";export default () => {const [value, setValue] = useState("")return (<><input type="text" value={value} onChange={e => setValue(e.target.value)} /><div>{value}</div></>);
}

vue

双向数据绑定,vue 的一大特性,这个语法糖非常好用

<script setup lang="ts">
import { ref } from 'vue'
const value = ref("")
</script><template><input type="text" v-model="value"><div>{{ value }}</div>
</template>

数据侦听

react

react 通过 useEffect 监听数据的变化

import { useEffect, useState } from "react"export default () => {const [count, setCount] = useState(0)useEffect(() => {console.log(count)}, [count])return <button onClick={() => setCount(count + 1)}>+1</button>
}

vue

vue 通过 watch 监听数据的变化

<script setup lang="ts">
import { ref, watch } from 'vue';
const count = ref(0)// watch(() => count.value, (newValue, oldValue) => { 
watch(count, (value) => { console.log(value);
})
</script><template><button @click="count++">+1</button>
</template>

计算属性

react

react 通过 useMemo 实现计算属性

import { useMemo, useState } from "react"export default () => {const [count, setCount] = useState(0)const newCount = useMemo(() => count * 2, [count])return (<><h1>{count} {newCount}</h1><button onClick={() => setCount(count + 1)}>+1</button></>)
}

vue

vue 通过 computed 实现计算属性

<script setup lang="ts">
import { ref, computed } from 'vue';
const count = ref(0)
const newCount = computed(() => count.value * 2)
</script><template><h1>{{ count }} {{ newCount }}</h1><button @click="count++">+1</button>
</template>

下期内容

下一期内容为:组件、路由、全局状态管理、以及两种框架完成相同的 Demo

相关文章:

React 与 Vue 对比指南 - 上

React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能&#xff0c;从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…...

开源协议深度解析:理解MIT、GPL、Apache等常见许可证

目录 前言1. MIT协议&#xff1a;自由而宽松的开源许可1.1 MIT协议的主要特点1.2 MIT协议的适用场景 2. GPL协议&#xff1a;自由软件的捍卫者2.1 GPL协议的核心理念2.2 GPL协议的适用场景 3. Apache License 2.0&#xff1a;开源与专利保护的平衡3.1 Apache License 2.0的主要…...

通用评估系统(五)- 前端部分总体说明

通用评估系统&#xff08;五&#xff09;- 前端部分总体说明 相关链接 Gitee地址通用评估系统&#xff08;一&#xff09;- 介绍通用评估系统&#xff08;二&#xff09;- 原型设计通用评估系统&#xff08;三&#xff09;- 前端部分通用评估系统&#xff08;四&#xff09;-…...

STM32GPIO

目录 GPIO基本结构GPIO位结构输入部分输出部分 输出模式GPIO模式浮空/上拉/下拉模拟输入开漏和推挽复用开漏/复用推挽 GPIO基本结构 GPIO是挂载在APB2总线上的外设。GPIO结构中的寄存器分为输入寄存器和输出寄存器&#xff0c;APB2总线通过输出寄存器向引脚发送数据&#xff0c…...

MyBatis拦截器终极指南:从原理到企业级实战

在本篇文章中&#xff0c;我们将深入了解如何编写一个 MyBatis 拦截器&#xff0c;并通过一个示例来展示如何在执行数据库操作&#xff08;如插入或更新&#xff09;时&#xff0c;自动填充某些字段&#xff08;例如 createdBy 和 updatedBy&#xff09;信息。本文将详细讲解拦…...

SpringBoot启动失败之application.yml缩进没写好

修改前&#xff1a; spring前面空格了 报错输出&#xff1a;Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the follow…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter17-事件

十七、事件 事件 JavaScript 与 HTML 的交互是通过事件实现的&#xff0c;事件代表文档或浏览器窗口中某个有意义的时刻。可以使用仅在事件发生时执行的监听器&#xff08;也叫处理程序&#xff09;订阅事件。在传统软件工程领域&#xff0c;这个模型叫“观察者模式”&#xff…...

鸿蒙开发:V2版本装饰器之@Monitor装饰器

前言 本文代码案例基于Api13。 随着官方的迭代&#xff0c;在新的Api中&#xff0c;对于新的应用开发&#xff0c;官方已经建议直接使用V2所属的装饰器进行开发了&#xff0c;所以&#xff0c;能上手V2的尽量上手V2吧&#xff0c;毕竟&#xff0c;V2是V1的增强版本&#xff0c;…...

51单片机-外部中断

以外部中断0为例&#xff1a; 主程序中需要有以下代码&#xff1a; EA1; //打开总中断开关 EX01; //开外部中断0 IT00/1&#xff1b; 设置外部中断的触发方式 P3.2\P3.3为外部中断接口&#xff0c;通过控制P3.2口按键按下实现LED灯反转点亮 #include "reg52.h"typed…...

UE C++ UObject 功能的初步总结(结合官方文档)

一. Uboject的官方文档的个人理解 Objects in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community 目录在此 1.垃圾回收:上篇文章简单介绍过&#xff0c;UObject的创建和回收。本身是很复杂的功能&#xff0c;后续会接着单项深入分析。 2.引用更新 1. 反射:之前…...

DeepSeek和ChatGPT的全面对比

一、模型基础架构对比&#xff08;2023技术版本&#xff09; 维度DeepSeekChatGPT模型家族LLAMA架构改进GPT-4优化版本参数量级开放7B/35B/120B闭源175B位置编码RoPE NTK扩展ALiBiAttention机制FlashAttention-3FlashAttention-2激活函数SwiGLU ProGeGLU训练框架DeepSpeedMeg…...

Spring Boot Actuator 监控✨

Spring Boot Actuator 是 Spring Boot 提供的一个强大的监控和管理工具&#xff0c;它可以帮助你深入了解和监控你的应用程序的运行状态。通过 Actuator&#xff0c;你可以获取应用程序的健康状况、内存使用情况、线程信息、HTTP 请求跟踪等。&#x1f680; 核心知识点 &#…...

构建高效 Python Web 应用:框架与服务器的选择及实践

构建高效 Python Web 应用&#xff1a;框架与服务器的选择及实践 flyfish 从选择合适的 Web 框架&#xff08;如 Flask 和 FastAPI&#xff09;到部署时选用适当的 Web 服务器&#xff08;如 Waitress、Gunicorn、uWSGI 和 Uvicorn&#xff09;的全过程。它不仅介绍了各个框架…...

LED灯闪烁实验:Simulink应用层开发

文章目录 1 阶段目标2 开发过程2.1 模型搭建2.2 模型仿真2.3 数据字典配置2.4 代码生成3 总结1 阶段目标 本文是《LED灯闪烁实验》的第三部分,会通过图文结合的方式,手把手带读者操作Simulink工具进行LED灯闪烁的应用层开发。 本章的开发可分解为如下若干过程: 方波输出建…...

在做题中学习(89):螺旋矩阵

解法&#xff1a;模拟 思路&#xff1a;创建ret数组&#xff0c;用变量标记原矩阵的行数和列数&#xff0c;遍历一个元素就push_back进ret数组&#xff0c;每次遍历完一行或一列&#xff0c;相应行/列数--&#xff0c;进行顺时针螺旋遍历到为0即可。 细节&#xff1a;要有边界…...

使用EasyExcel和多线程实现高效数据导出

​ 使用EasyExcel和多线程实现高效数据导出 1. 概述 在企业级应用中&#xff0c;数据导出是一个常见的需求。为了提高导出效率&#xff0c;尤其是在处理大量数据时&#xff0c;我们可以结合使用EasyExcel库和多线程技术。本文将详细介绍如何通过EasyExcel和多线程技术实现高…...

rabbitmq五种模式的实现——springboot

rabbitmq五种模式的实现——springboot 基础知识和javase的实现形式可以看我之前的博客 代码地址&#xff1a;https://github.com/9lucifer/rabbitmq4j-learning 一、进行集成 &#xff08;一&#xff09;Spring Boot 集成 RabbitMQ 概述 Spring Boot 提供了对 RabbitMQ 的自…...

每日学习Java之一万个为什么

9.Class <?> class1 Myclass.class 为什么要有通配符&#xff1f;传给谁用的&#xff1f; 首先&#xff0c;这里的class特指某个对象在JVM中的元数据集合。 有普通、接口、数组、基本类型、 void 类型、局部类、匿名类、枚举、注解 1.类型安全&#xff1a;通配符允许…...

寒假学习总结

整个寒假都走在数据结构与算法的路上&#xff0c;深入学习了其中多个板块&#xff0c;刷了一些与之对应的题目&#xff0c;下面来一期总结&#xff08;c&#xff09; &#xff08;emmm&#xff0c;主播在寒假试着去学习了几大语言的语法基础&#xff08;丢丢&#xff09; 如Ja…...

Java Web开发实战与项目——用户认证与授权模块开发

Web应用中&#xff0c;用户认证与授权是至关重要的功能&#xff0c;确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架&#xff0c;支持多种认证与授权方式。在本章节中&#xff0c;我们将深入探讨三种常见的用户认证与授权方案&#xff1a;基于To…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...