首页 web前端 js教程 我尝试从 React.js 切换到 Vue.js

我尝试从 React.js 切换到 Vue.js

Nov 05, 2024 am 02:03 AM

介绍

几年前,像许多其他人一样,我对 React.js 前端库的钩子和功能组件的到来感到“兴奋”。他们提供了一种全新的开发方式,编写的代码比使用 Components 类少得多。我真的被迷住了,并且迷上了很长一段时间。

今天我不得不选择 Vue.js 框架来满足一个全新的客户端项目的需求。在这个项目结束时,我对自己说,这是为您作为这个框架的新用户提供反馈的机会!

那么,这种技能的提升是否符合 Vue.js 的恶名?
如今,使用 Vue 开发前端比使用 React 更好吗?

这就是我们将要看到的!

项目启动

锅炉板

谁说开始一个项目,就说寻找一个好的样板来节省我们数小时,甚至数天的辛苦配置!
不需要看得太远,npm create vue@latest 命令很大程度上满足了我的需求:

✔ Project name: … myproject-vue
✔ Add TypeScript? … No / Yes
✔ Add JSX Support? … No / Yes
✔ Add Vue Router for Single Page Application development? … No / Yes
✔ Add Pinia for state management? … No / Yes
✔ Add Vitest for Unit Testing? … No / Yes
✔ Add an End-to-End Testing Solution? › Playwright
✔ Add ESLint for code quality? … No / Yes
✔ Add Prettier for code formatting? … No / Yes
? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

已经支持 Typescript 语言,提供路由系统和商店,甚至还有单元和端到端测试的空间!

默认情况下,Vite 捆绑程序已安装。这不是让我不高兴吗!?事实上,构建速度很快,而且大多数时候,热模块替换 (HMR) 效果很好。

一点 npm run dev 来启动本地开发服务器,然后!它已经在浏览器中运行了!

J

用于生产?只需输入 npm run build 命令,检查输入后,项目将作为静态文件导出到 dist 目录中(在已激活 Typescript 的情况下):

vite v5.2.11 building for production...
✓ 48 modules transformed.
dist/index.html                      0.43 kB │ gzip:  0.28 kB
dist/assets/AboutView-C6Dx7pxG.css   0.09 kB │ gzip:  0.10 kB
dist/assets/index-D6pr4OYR.css       4.21 kB │ gzip:  1.30 kB
dist/assets/AboutView-CEwcYZ3g.js    0.22 kB │ gzip:  0.20 kB
dist/assets/index-CfPjtpcd.js       89.23 kB │ gzip: 35.29 kB
✓ built in 591ms
登录后复制
登录后复制
登录后复制
登录后复制

项目架构

.
├── README.md
├── e2e/
├── index.html
├── package.json
├── public/
├── src/
│   ├── App.vue
│   ├── assets/
│   ├── components/
│   │   ├── HelloWorld.vue
│   │   ├── TheWelcome.vue
│   │   ├── WelcomeItem.vue
│   │   ├── __tests__/
│   │   └── icons/
│   ├── main.ts
│   ├── router/
│   │   └── index.ts
│   ├── stores/
│   │   └── counter.ts
│   └── views/
│       ├── AboutView.vue
│       └── HomeView.vue
├── tsconfig.json
└── vite.config.ts
登录后复制
登录后复制

在项目的建筑方面,我们特别发现:

  • index.html 文件,带有标签
    ;我们的整个 Vue 应用程序都嫁接在其上;
  • main.ts,依次创建App组件、router和store:
✔ Project name: … myproject-vue
✔ Add TypeScript? … No / Yes
✔ Add JSX Support? … No / Yes
✔ Add Vue Router for Single Page Application development? … No / Yes
✔ Add Pinia for state management? … No / Yes
✔ Add Vitest for Unit Testing? … No / Yes
✔ Add an End-to-End Testing Solution? › Playwright
✔ Add ESLint for code quality? … No / Yes
✔ Add Prettier for code formatting? … No / Yes
? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
  • 纯.ts文件,用于管理路由和存储;
  • 一些配置和测试文件;
  • ...当然还有 *.vue 文件,分为 组件(对应于通用和可重用元素)和 视图(对应于高级元素)页)

简而言之,文件架构相当简单,并且与 React 相对相似,即使在样板文件中检查了很多选项。
到目前为止,React 还没有什么真正新鲜的东西。这时就会出现显着差异!

Vue 文件的架构

这是受官方网站启发的代码片段。它只是在单击时更改文本的颜色,并在适用的情况下显示短语“上面的文本是绿色的”,但它代表了 *.vue 文件的典型架构:

vite v5.2.11 building for production...
✓ 48 modules transformed.
dist/index.html                      0.43 kB │ gzip:  0.28 kB
dist/assets/AboutView-C6Dx7pxG.css   0.09 kB │ gzip:  0.10 kB
dist/assets/index-D6pr4OYR.css       4.21 kB │ gzip:  1.30 kB
dist/assets/AboutView-CEwcYZ3g.js    0.22 kB │ gzip:  0.20 kB
dist/assets/index-CfPjtpcd.js       89.23 kB │ gzip: 35.29 kB
✓ built in 591ms
登录后复制
登录后复制
登录后复制
登录后复制

注意事件与@click的绑定,条件显示与v-if,以及CSS中与v-bind()的绑定。

代码分为 3 个截然不同的部分:

  • 脚本:控制代码;
  • 模板:HTML结构;
  • style:CSS 样式表。

这三个部分永远不会混合?.
这有几个优点,这是我在客户项目的经验中亲身体验到的:

  • HTML 结构清晰、固定,并且具有非常声明式风格 - 一切都在那里,甚至是有条件显示的标签;
  • 逻辑部分与显示部分分离良好;
  • 可以就地编写纯CSS,直接链接到组件,无需安装第三方库;
  • 尽管样式分离,您仍然可以在 CSS 中插入变量。

使用

小缺点:先验没有自动 CSS 填充。因此,你应该瞄准像 vue-emotion 这样的书店。

从我的角度来看,我发现这种“all-in-JS”库有点破坏了 Vue 提供的架构,而且显然,浏览器特定的 CSS 属性在当今时代已经很少见了。 因此,de Vue 通常是自给自足的。

简而言之,我发现这种一体式架构非常令人愉快,但各个部分却清晰分开。这可以让您保持干净的代码,而且更加简洁。事实上,“业务逻辑/显示/样式”这三个部分的同时存在通常会鼓励您将代码重新划分为更小的模块,从而划分为更小的文件。

现在,如果我们仔细看看 Vue.js API 本身会怎样?

Vue.js API

在这里,我不会向您提供我遇到的 Vue.js API 的所有元素的详尽列表,而是只提供一些我发现相当代表 Vue 逻辑的非常具体的元素。

(重新)计算的值

让我们从 React 世界中众所周知的操作开始:在数据更新后智能地重新计算 HTML 渲染(或变量)。
有一个非常直观的compute()函数,它受益于记忆系统(一种“缓存”),以避免每次重新计算输出值:

J

✔ Project name: … myproject-vue
✔ Add TypeScript? … No / Yes
✔ Add JSX Support? … No / Yes
✔ Add Vue Router for Single Page Application development? … No / Yes
✔ Add Pinia for state management? … No / Yes
✔ Add Vitest for Unit Testing? … No / Yes
✔ Add an End-to-End Testing Solution? › Playwright
✔ Add ESLint for code quality? … No / Yes
✔ Add Prettier for code formatting? … No / Yes
? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

这里仅当 PushBtn 的值发生变化时才计算 magicNumber。而且它是可验证的:消息“再次计算!”仅当单击不同的按钮时才显示在控制台中。
因此,与 React 不同,无需在该函数中显式指定要监视的变量。

同样,我们还发现了 watch 和 watchEffect ,它们分别允许你对组件的全部或部分属性的变化做出反应,就像 React 中的 useEffect 一样:

vite v5.2.11 building for production...
✓ 48 modules transformed.
dist/index.html                      0.43 kB │ gzip:  0.28 kB
dist/assets/AboutView-C6Dx7pxG.css   0.09 kB │ gzip:  0.10 kB
dist/assets/index-D6pr4OYR.css       4.21 kB │ gzip:  1.30 kB
dist/assets/AboutView-CEwcYZ3g.js    0.22 kB │ gzip:  0.20 kB
dist/assets/index-CfPjtpcd.js       89.23 kB │ gzip: 35.29 kB
✓ built in 591ms
登录后复制
登录后复制
登录后复制
登录后复制

J

只需点击数字修改按钮即可增加“手表”计数器。
然后,watch() 允许我们在每次某些变量发生变化时触发回调。

该功能的优势在于深入变量修改分析:Vue 甚至可以检测到子对象深处的变化!

双向同步

从父组件声明属性并将其传递给子组件是一个相当重复的操作。也可以在子级和父级之间同步此值,例如在表单的输入中。

此外,不要像这样同时管理属性和基于事件的更新回调:

✔ Project name: … myproject-vue
✔ Add TypeScript? … No / Yes
✔ Add JSX Support? … No / Yes
✔ Add Vue Router for Single Page Application development? … No / Yes
✔ Add Pinia for state management? … No / Yes
✔ Add Vitest for Unit Testing? … No / Yes
✔ Add an End-to-End Testing Solution? › Playwright
✔ Add ESLint for code quality? … No / Yes
✔ Add Prettier for code formatting? … No / Yes
? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

…可以使用 DefineModel 宏来代替,这样可以简化编写:

vite v5.2.11 building for production...
✓ 48 modules transformed.
dist/index.html                      0.43 kB │ gzip:  0.28 kB
dist/assets/AboutView-C6Dx7pxG.css   0.09 kB │ gzip:  0.10 kB
dist/assets/index-D6pr4OYR.css       4.21 kB │ gzip:  1.30 kB
dist/assets/AboutView-CEwcYZ3g.js    0.22 kB │ gzip:  0.20 kB
dist/assets/index-CfPjtpcd.js       89.23 kB │ gzip: 35.29 kB
✓ built in 591ms
登录后复制
登录后复制
登录后复制
登录后复制

短多了! ?再说了,模型只有一个,我连命名都可以省去!

和家长:

.
├── README.md
├── e2e/
├── index.html
├── package.json
├── public/
├── src/
│   ├── App.vue
│   ├── assets/
│   ├── components/
│   │   ├── HelloWorld.vue
│   │   ├── TheWelcome.vue
│   │   ├── WelcomeItem.vue
│   │   ├── __tests__/
│   │   └── icons/
│   ├── main.ts
│   ├── router/
│   │   └── index.ts
│   ├── stores/
│   │   └── counter.ts
│   └── views/
│       ├── AboutView.vue
│       └── HomeView.vue
├── tsconfig.json
└── vite.config.ts
登录后复制
登录后复制

J

for 循环

看到 v-model 后继续 v-for 让我意识到 Vue.js 开始通过隐式代码引入很多“魔法”:

import './assets/main.css';

import { createApp } from 'vue';
import { createPinia } from 'pinia';

import App from './App.vue';
import router from './router';

const app = createApp(App); // composant racine

app.use(createPinia()); // store
app.use(router); // routage des pages front

app.mount('#app');
登录后复制

结果:

J

正如人们所期望的,v-for 指令因此可以为可迭代的每个元素自动重复 HTML 模式的一部分(此处为

  • 标签)。

    在 React 方面,需要使用 JSX 自己构建每个元素,随着组件的增长,代码的可读性会降低:

    <script setup>
      import { ref } from 'vue';
    
      const color = ref('green');
    
      function toggleColor() {
        color.value = color.value === 'green' ? 'blue' : 'green';
      }
    </script>
    
    <template>
      <p class="main-text" @click="toggleColor">
        Cliquez sur ce texte pour changer de couleur.
      </p>
      <p v-if="color === 'green'">Le texte ci-dessus est vert.</p>
    </template>
    
    <style scoped>
      .main-text {
        color: v-bind(color);
      }
    </style>
    
    登录后复制

    就我个人而言,从代码整洁度方面我更喜欢Vue的结构,只要不需要调试即可。 ?
    顺便问一下,既然我们谈论的是调试,那么 Vue 生态系统工具呢?

    开发工具

    这里有 3 个在我的项目开发过程中引起我注意的工具。

    VSCode 扩展:Vue 官方

    我从显而易见的开始,但是,是的,VSCode Vue(和其他 IDE)有一个扩展,它添加了语法突出显示、自动完成、片段等。必备!

    但是,我注意到着色和自动完成方面存在一些不稳定,有时有点反复无常?,在这里我能够欣赏到 React 方面更大的稳定性。

    Vue.js 开发工具

    与 React Developer Tools 浏览器插件一样,还有 Vue.js devtools 插件,我必须承认,它已经提供得很好:

    J

    有 4 个选项卡:

    • 组件,我们可以在其中观察,还可以修改组件的状态;
    • Timeline,它允许你记录事件和组件渲染时间,它实际上对应于浏览器“性能”选项卡的一个版本,但专注于 Vue;
    • Pinia,它允许您直接观察和修改标准存储的状态?,我发现特别受欢迎的现成集成;
    • 路线,您可以在其中列出不同的道路及其活动 - 这是一个我发现在我的中等规模项目上有点花哨的选项卡(特别是因为该信息与“组件”的信息不是很冗余" 选项卡,但这对于复杂的路由非常有用。

    简而言之,对于调试,这里有您需要的一切,甚至更多!

    虚拟化

    几乎毫不奇怪(但仍然有优点!),还有一个用于 Vue 的 UI 库,它实现了 Google 的 Material Design,并且还提供了标准图标列表:Vuetify。

    ✔ Project name: … myproject-vue
    ✔ Add TypeScript? … No / Yes
    ✔ Add JSX Support? … No / Yes
    ✔ Add Vue Router for Single Page Application development? … No / Yes
    ✔ Add Pinia for state management? … No / Yes
    ✔ Add Vitest for Unit Testing? … No / Yes
    ✔ Add an End-to-End Testing Solution? › Playwright
    ✔ Add ESLint for code quality? … No / Yes
    ✔ Add Prettier for code formatting? … No / Yes
    ? Add Vue DevTools 7 extension for debugging? (experimental) › No / Yes
    
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    J

    这可以在项目启动或不需要太多图形定制的项目上节省大量时间。

    但一如既往,我建议密切关注这种高级库的渲染性能。库的配置容量往往是在其他地方付费的!

    结论

    对于从 React 迁移到 Vue 的体验我们能说些什么?

    首先,从代码的角度来看,与 React 相比,我想说 Vue 库是:

    • 更加结构化
    • 更具声明性 ;
    • 更简洁

    但是,由于其代码更多地用 JSX 编写,我发现 React 仍然比 Vue 更具互操作性、更具编程性和更明确,并且具有更好的 linter 稳定性。

    在开发环境和社区方面,Vue 已经具备了确保高效开发到生产的所有优势。

    那么 Vue 上的这种技能提升是否名副其实?我会说是的。我发现这个学习曲线很有效,如果有机会,我会继续与 Vue 一起发展。

    最后,现在用 Vue 开发前端比用 React 更好吗?
    从完全个人的角度来看,我认为不是。尽管 Vue 和 React 的应用场景略有不同,但我更喜欢依赖 React 可靠的类型系统和更灵活的代码。但也许 Vue 的下一个版本及其工具会改变我的想法?

    你呢,你的反馈是什么?

  • 以上是我尝试从 React.js 切换到 Vue.js的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

    前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

    神秘的JavaScript:它的作用以及为什么重要 神秘的JavaScript:它的作用以及为什么重要 Apr 09, 2025 am 12:07 AM

    JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

    谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

    Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

    JavaScript难以学习吗? JavaScript难以学习吗? Apr 03, 2025 am 12:20 AM

    学习JavaScript不难,但有挑战。1)理解基础概念如变量、数据类型、函数等。2)掌握异步编程,通过事件循环实现。3)使用DOM操作和Promise处理异步请求。4)避免常见错误,使用调试技巧。5)优化性能,遵循最佳实践。

    如何实现视差滚动和元素动画效果,像资生堂官网那样?
或者:
怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? 如何实现视差滚动和元素动画效果,像资生堂官网那样? 或者: 怎样才能像资生堂官网一样,实现页面滚动伴随的动画效果? Apr 04, 2025 pm 05:36 PM

    实现视差滚动和元素动画效果的探讨本文将探讨如何实现类似资生堂官网(https://www.shiseido.co.jp/sb/wonderland/)中�...

    JavaScript的演变:当前的趋势和未来前景 JavaScript的演变:当前的趋势和未来前景 Apr 10, 2025 am 09:33 AM

    JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

    如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

    如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

    console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

    深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

    See all articles