news 2026/4/18 7:48:06

浅谈 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/4/16 0:30:27

PyQt5与STM32通信上位机软件:项目应用实例解析

PyQt5 STM32&#xff1a;一个跑在真实产线上的温控上位机&#xff0c;是怎么炼成的&#xff1f;去年冬天&#xff0c;我在某家做工业温控模块的客户现场调试时&#xff0c;遇到一台刚下线的STM32F407设备——它每隔17秒就丢一帧温度数据&#xff0c;UI界面上的曲线像心电图一样…

作者头像 李华
网站建设 2026/4/16 21:25:05

Qwen3-ForcedAligner-0.6B基础操作:OGG/M4A格式兼容性测试与转换建议

Qwen3-ForcedAligner-0.6B基础操作&#xff1a;OGG/M4A格式兼容性测试与转换建议 1. 工具定位与核心价值 Qwen3-ForcedAligner-0.6B不是独立运行的模型&#xff0c;而是Qwen3-ASR语音识别系统中负责字级别时间戳对齐的关键组件。它与主干ASR模型&#xff08;Qwen3-ASR-1.7B&a…

作者头像 李华
网站建设 2026/4/18 7:39:28

StructBERT情感分类模型效果展示:92.35%高置信度积极情感识别案例

StructBERT情感分类模型效果展示&#xff1a;92.35%高置信度积极情感识别案例 1. 为什么这个数字让人眼前一亮&#xff1f; 你有没有试过把一段热情洋溢的用户评价扔进情感分析工具&#xff0c;结果却只得到“中性”或“勉强积极”的反馈&#xff1f;很多中文情感模型在面对真…

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

GLM-4-9B-Chat-1M多语言支持体验:中日韩德对话全搞定

GLM-4-9B-Chat-1M多语言支持体验&#xff1a;中日韩德对话全搞定 1. 这不是“能说多国话”&#xff0c;而是真正“听懂会聊”的多语言能力 你有没有试过用一个模型同时和日本客户聊产品细节、帮韩国同事润色技术文档、给德国合作伙伴写正式邮件&#xff0c;还顺手把三段内容互…

作者头像 李华