news 2026/3/11 2:53:10

浅谈 Vue React Flutter 框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
浅谈 Vue React Flutter 框架

文章目录

    • 前言
    • 框架概述对比
    • 创建项目
      • Vite + Vue,React 项目创建
      • Flutter 项目创建
    • 1. 计数器应用示例
      • Vue 3 (Composition API)
      • React (函数组件 + Hooks)
      • Flutter (Dart)
    • 2. 列表数据展示示例
      • Vue 列表渲染
      • React 列表渲染
      • Flutter 列表渲染
    • 核心差异分析
      • 1. 语法差异
      • 2. 数据绑定
      • 3. 样式处理
    • 对比总结

前言

最近学习了Vue.js、React、Flutter这三个框架,如果用一句话来总结,那么:

# Web 端Vue: 一切皆模板 React: 一切皆方法# 移动端Flutter: 一切皆对象

如果让我这个后端开发出身的人来选,Web 端我会选React,移动端我会选Flutter,我比较偏爱对象,方法,看到它们会感到很亲切。

框架概述对比

特性Vue.jsReactFlutter
类型JavaScript框架JavaScript库UI SDK(跨平台)
语言JavaScript/TypeScriptJavaScript/TSXDart
架构模式MVVM组件化(虚拟DOM)响应式(Widget树)
学习曲线平缓中等较陡(需学Dart)
渲染方式虚拟DOM虚拟DOMCanvas/Skia直接渲染
跨平台通过工具链通过React Native原生支持
性能优秀优秀接近原生
状态管理Vuex/PiniaRedux/MobX/ContextProvider/Bloc/Riverpod

创建项目

Vite + Vue,React 项目创建

创建一个 vite 项目,可以选择React,Vue框架,这样我们就能得到一个基础的项目结构来运行对比,例如 Vue 项目创建:

$pnpmcreate vite@latest │ ◇ Project name: │ vite-project │ ◆ Select a framework: │ ○ Vanilla │ ● Vue │ ○ React │ ○ Preact │ ○ Lit │ ○ Svelte │ ○ Solid │ ○ Qwik │ ○ Angular │ ○ Marko │ ○ Others ◆ Select a variant: │ ● TypeScript │ ○ JavaScript │ ○ Official Vue Starter ↗ │ ○ Nuxt ↗ │ ○ Vike ↗ ◆ Use rolldown-vite(Experimental)?: │ ○ Yes │ ● No ◆ Install withpnpmand start now? │ ○ Yes / ● No │ └ Done. Now run:cdvite-projectpnpminstallpnpmdev

Flutter 项目创建

创建一个 Flutter 项目,例如counter_app

flutter create counter_app

1. 计数器应用示例

Vue 3 (Composition API)

src/components/HelloWorld.vue

<!-- src/components/HelloWorld.vue --><scriptsetuplang="ts">import{ref}from"vue";defineProps<{msg:string}>();constcount=ref(0);</script><template><h1>{{ msg }}</h1><divclass="card"><buttontype="button"@click="count++">count is {{ count }}</button></div></template>

src/components/index.ts

importHelloWorldfrom"./HelloWorld.vue";export{HelloWorld};

src/App.vue

<!-- src/App.vue --><scriptsetuplang="ts">import{HelloWorld}from"./components";</script><template><HelloWorldmsg="Vite + Vue"/></template>

React (函数组件 + Hooks)

src/App.tsx

import{useState}from"react";importreactLogofrom"./assets/react.svg";importviteLogofrom"/vite.svg";import"./App.css";functionApp(props:{name:string}){const[count,setCount]=useState(0);return(<><h1>{props.name}</h1><div className="card"><button onClick={()=>setCount((count)=>count+1)}>countis{count}</button></div></>);}exportdefaultApp;

src/main.tsx,调用App组件<App name="Vite + React" />,其实,可以这样看待App(xxx),就像调用函数一样

import{StrictMode}from"react";import{createRoot}from"react-dom/client";import"./index.css";importAppfrom"./App.tsx";createRoot(document.getElementById("root")!).render(<StrictMode><App name="Vite + React"/></StrictMode>,);

运行对比:

Flutter (Dart)

lib/main.dart

import'package:flutter/material.dart';voidmain(){runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnMaterialApp(title:'Flutter Demo',theme:ThemeData(colorScheme:.fromSeed(seedColor:Colors.deepPurple)),home:constMyHomePage(title:'Flutter Demo Home Page'),);}}classMyHomePageextendsStatefulWidget{constMyHomePage({super.key,requiredthis.title});finalStringtitle;@overrideState<MyHomePage>createState()=>_MyHomePageState();}class_MyHomePageStateextendsState<MyHomePage>{int _counter=0;void_incrementCounter(){setState((){_counter++;});}@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(backgroundColor:Theme.of(context).colorScheme.inversePrimary,title:Text(widget.title),),body:Center(child:Column(mainAxisAlignment:.center,children:[constText('You have pushed the button this many times:'),Text('$_counter',style:Theme.of(context).textTheme.headlineMedium,),],),),floatingActionButton:FloatingActionButton(onPressed:_incrementCounter,tooltip:'Increment',child:constIcon(Icons.add),),);}}

Flutter 就像是在做 java 开发,全是对象,通过对象的组合来构建 UI,我想后端应该可以无缝切换到 Flutter 开发吧。

运行效果:

2. 列表数据展示示例

Vue 列表渲染

<template><div><ul><liv-for="item in items":key="item.id">{{ item.name }} - {{ item.price }}元</li></ul></div></template><scriptsetuplang="ts">constitems=[{id:1,name:"苹果",price:5},{id:2,name:"香蕉",price:3},{id:3,name:"橙子",price:4},];</script>

React 列表渲染

functionItemList(){constitems=[{id:1,name:"苹果",price:5},{id:2,name:"香蕉",price:3},{id:3,name:"橙子",price:4},];return(<ul>{items.map((item)=>(<li key={item.id}>{item.name}-{item.price}</li>))}</ul>);}

Flutter 列表渲染

ListView.builder(itemCount:items.length,itemBuilder:(context,index){finalitem=items[index];returnListTile(title:Text(item.name),subtitle:Text('${item.price}元'),);},);

核心差异分析

1. 语法差异

  • Vue: 模板语法,分离的HTML/CSS/JS
  • React: JSX,JavaScript中写HTML
  • Flutter: Widget树,完全用代码构建UI

2. 数据绑定

  • Vue: 双向绑定(v-model
<inputv-model="message"/>
  • React: 单向数据流
<input value={message}onChange={(e)=>setMessage(e.target.value)}/>
  • Flutter: 通过Controller
TextEditingController_controller=TextEditingController();TextField(controller:_controller);

3. 样式处理

<!-- Vue:Scoped CSS --><stylescoped>.button{background:blue;}</style>
// React:CSS-in-JSconststyles={button:{background:"blue",},};<button style={styles.button}>Click</button>;
// Flutter:完全代码化ElevatedButton(style:ElevatedButton.styleFrom(backgroundColor:Colors.blue,),child:Text('Click'),)

对比总结

用 Vue 或 React 开发 Web 端应用,用浏览器访问,用 Flutter 开发移动端应用,可以在不同系统手机上运行。

  1. Vue就像是模板中填充数据,React就像是在 JS 中拼装 HTML,它们本质上还是html,通过浏览器渲染出来
  2. Flutter或原生(Android, iOS)开发就像是以前用 VB 开发应用一样,控件要用它们自己的,而不是用 html 来写
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/10 5:01:16

Flutter 安装配置

文章目录参考网址安装配置运行 flutter doctor安装必要的依赖Flutter镜像源设置永久设置&#xff08;推荐&#xff09;Windows 系统macOS/Linux 系统常用国内镜像源检查镜像是否生效其他优化建议恢复默认源常用命令项目相关构建相关包管理开发工具测试相关设备与模拟器升级与维…

作者头像 李华
网站建设 2026/3/1 22:01:15

深求·墨鉴保姆级教程:从图片到Markdown的极简OCR操作指南

深求墨鉴保姆级教程&#xff1a;从图片到Markdown的极简OCR操作指南 1. 为什么你需要一个“会写字”的OCR工具&#xff1f; 你有没有过这样的时刻&#xff1a; 手里攥着一页会议白板照片&#xff0c;想快速整理成纪要&#xff0c;却对着模糊的字迹反复放大、截图、打字&…

作者头像 李华
网站建设 2026/3/6 3:03:27

数字资产管控新范式:DownKyi重构视频资源管理全流程

数字资产管控新范式&#xff1a;DownKyi重构视频资源管理全流程 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xf…

作者头像 李华
网站建设 2026/3/11 1:20:21

Visio流程图结合RMBG-2.0:专业图表制作技巧

Visio流程图结合RMBG-2.0&#xff1a;专业图表制作技巧 1. 为什么Visio图表总显得不够“专业” 做技术方案汇报、产品设计说明或者系统架构展示时&#xff0c;你是不是也遇到过这样的情况&#xff1a;花了一下午精心排版的Visio流程图&#xff0c;一放到PPT里就显得单薄&…

作者头像 李华
网站建设 2026/3/9 11:17:24

Arduino循迹小车在复杂轨迹下的表现:系统分析与优化

Arduino循迹小车在真实世界里“不迷路”的秘密&#xff1a;从抖动脱轨到稳如老司机 你有没有试过让Arduino循迹小车跑一段带十字路口、几处断线、还有个急弯的赛道&#xff1f; 一开始信心满满——接上线、烧进代码、按下启动键…… 结果&#xff1a; - 在交叉口原地打转三圈…

作者头像 李华
网站建设 2026/3/10 6:46:52

Face3D.ai Pro环境配置:CUDA 12.1+cuDNN 8.9+PyTorch 2.5兼容方案

Face3D.ai Pro环境配置&#xff1a;CUDA 12.1cuDNN 8.9PyTorch 2.5兼容方案 1. 为什么这套组合特别重要 Face3D.ai Pro 不是普通的人脸重建工具&#xff0c;它对底层计算环境有明确而严苛的要求。你可能已经试过直接 pip install torch&#xff0c;结果发现模型加载失败、GPU…

作者头像 李华