前端概念

Jetpack Compose vs Vue.js

声明式 UI 编程:组件 = UI + 状态

概念 Jetpack Compose Vue
UI 构建方式 使用 Kotlin 编写 UI 函数 使用 HTML + 模板语法
编程风格 声明式 声明式
示例 Text("Hello") <p>{{ message }}</p>

说明:

  • Jetpack Compose 用函数来“描述 UI”
  • Vue 用模板语法“声明 UI”
  • 二者都强调 状态驱动 UI,界面是数据的“映射”

响应式系统:状态变 → UI自动更新

功能 Jetpack Compose Vue
响应式状态管理 mutableStateOfrememberState reactive()ref()、Vue 2 是 data
自动更新机制 Compose 会重新组合(Recompose) Vue 会重新渲染 DOM
示例 val name by remember { mutableStateOf("冯宇杰") } data() { return { name: "冯宇杰" } }

说明:

  • Stateref 的值发生变化,界面自动刷新
  • 这就是所谓的“数据驱动视图”

组件化开发

特点 Jetpack Compose Vue
组件形式 Kotlin 函数(Composable) Vue 单文件组件(SFC)
状态隔离 每个 Composable 可维护自身状态 每个 Vue 组件有自己的 data()
重用方式 像函数一样调用 像标签一样引用 <MyComponent />

说明:

  • Compose 使用 @Composable 函数来封装 UI 单元
  • Vue 使用 .vue 文件封装组件
  • 都支持属性(props)、事件传递、插槽等概念

事件绑定与双向绑定

概念 Jetpack Compose Vue
单向数据绑定 默认行为(状态 -> UI) 默认行为(状态 -> 模板)
双向绑定 手动实现(如 TextFieldonValueChange) v-model
事件处理 onClick {} 等 Lambda @click="handler"

说明:

  • 两者都支持从 UI 控件中“获取输入”并更新状态
  • Vue 封装了 v-model 实现双向绑定;Compose 则需要手动处理

生命周期感知

Jetpack Compose Vue
LaunchedEffectDisposableEffect 等用于管理生命周期感知行为 createdmountedbeforeDestroy 等钩子

说明:

  • Vue 有传统的生命周期钩子
  • Compose 用更现代的 Effect API 来响应组件进入/退出组合的生命周期

路由与页面跳转(导航)

Jetpack Compose Vue
Navigation Compose Vue Router
声明式路由配置
参数传递 navArgument

状态管理和跨组件通信

Jetpack Compose Vue
ViewModel + State Hoisting Vuex(Vue2)/ Pinia(Vue3)
状态提升、状态共享 提倡单向流动

总结

共性概念 说明
响应式系统 UI 与数据自动同步
声明式编程 描述界面“应该长什么样”,不是“怎么去做”
状态驱动 状态决定 UI,不手动操作 UI 元素
组件化 UI = 可组合的模块
单向数据流 数据从父组件流向子组件,事件反向冒泡
生命周期感知 在特定生命周期执行代码

Jetpack Compose ≈ Vue + Vuex + JSX + 响应式系统,只不过 Compose 是 Kotlin 函数式语法,Vue 是 HTML 模板 + JS。

跨平台UI框架

  • Flutter、RN、CMP(JC的扩展)
  • Jetpack Compose(JC):android UI 框架
  • Compose Multiplatform(CMP):JetBrains 开发的JC扩展,用于跨平台支持
  • Kotlin Multiplatform(KMP): 用于编写跨平台共享业务逻辑

KMP 可以作为 CMP 的插件和底层跨平台支撑。反过来看,也可以认为 CMP 作为 KMP 项目中的 UI 支持,它不是 KMP 本身的一部分,只是一个通过启用共享 UI 来补充 KMP 的 SDK。