news 2026/8/29 6:00:16

浅谈 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/8/21 12:08:18

Flutter 组件层级关系

文章目录前言MaterialApp - 应用级根组件Scaffold - 页面骨架Container - 通用布局容器关系对比典型嵌套结构页面数量与组件关系数量对比典型多页面结构实际场景示例MaterialApp 的独特性每个页面的 ScaffoldContainer 的数量不确定性重要注意事项总结前言 上一篇我们迎来了 F…

作者头像 李华
网站建设 2026/8/21 12:08:19

灵感画廊入门指南:如何从Civitai下载SDXL 1.0模型并正确配置MODEL_PATH

灵感画廊入门指南&#xff1a;如何从Civitai下载SDXL 1.0模型并正确配置MODEL_PATH 1. 为什么你需要这篇指南&#xff1f; 你刚打开灵感画廊&#xff0c;界面安静得像一间午后的画室——宣纸色的背景、衬线字体、恰到好处的留白。你满怀期待点下“ 挥笔成画”&#xff0c;却看…

作者头像 李华
网站建设 2026/8/22 3:18:41

从零开始配置FPGA开发环境:Vivado 2019.1安装详解

Vivado 2019.1安装不是“点下一步”——一位FPGA工程师的环境配置手记 去年带三个实习生搭建Zynq-7000嵌入式视觉开发环境&#xff0c;三台Windows机器、两台Ubuntu 20.04服务器&#xff0c;耗了整整四天。不是代码写错了&#xff0c;也不是逻辑没仿真通——而是有人卡在 hw_…

作者头像 李华
网站建设 2026/8/26 3:00:21

ARM Cortex-M Keil工程创建超详细版指南

从零开始搭建一个真正可靠的 Keil Cortex-M 工程&#xff1a;那些手册不会告诉你的细节 你有没有过这样的经历&#xff1f;——在 Keil uVision 里点完“新建工程”&#xff0c;选好芯片&#xff0c;加好源文件&#xff0c;编译一下&#xff0c;结果满屏红色错误&#xff1a; …

作者头像 李华
网站建设 2026/8/24 7:42:05

MusePublic圣光艺苑技术解析:expandable_segments显存碎片治理

MusePublic圣光艺苑技术解析&#xff1a;expandable_segments显存碎片治理 1. 从画室到代码&#xff1a;一场显存优化的文艺复兴 你有没有试过在4090上跑SDXL时&#xff0c;明明显存还有空余&#xff0c;却突然弹出“CUDA out of memory”&#xff1f;不是模型太大&#xff0…

作者头像 李华
网站建设 2026/8/22 5:28:07

STM32串口DMA在Bootloader中的使用场景解析

STM32串口DMA在Bootloader中的实战落地&#xff1a;一个不会“卡死”的固件升级通道是怎样炼成的你有没有遇到过这样的现场&#xff1f;设备在现场跑着&#xff0c;突然要远程升级固件——结果串口一连上&#xff0c;Bootloader就开始疯狂进中断&#xff0c;CPU占用飙到70%&…

作者头像 李华