Vue3&React|如何理解组合式API和选项式API

选项式API

早在 Vue2 阶段,都是使用的选项式API的风格,之前学习的也是这样的风格。

在 xxx.vue 文件中,js部分内容大体结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<script>
export default {
data() {
return {
count: 0
}
},
computed: {
double() {
return this.count * 2
}
},
methods: {
increment() {
this.count++
}
}
}
</script>

组件会被分为几大部分:data, methods, computed 等核心部分,每个部分约定了会什么样的操作(数据定义、计算逻辑、方法调用等)

这种方式有利有弊,好处在于结构清晰简单,但是问题在于逻辑相对分散,不利于组件复用

组合式API

React 一直以来都采用的是组合式API的风格,通过定义”函数”并返回JSX(TSX)的方式来定义组件,在JSX(TSX)中通过Hooks组合对应逻辑

Vue3 开始也引入了组合式API的风格,和React很像,我们直接通过代码来进行学习

需求背景

下面以封装一个 获取鼠标在屏幕的二维坐标位置 组件为例,展示 React 和 Vue3 中组合式API的实现风格

React

  • useState定义状态
  • 函数组件内部编写更新鼠标位置逻辑
  • 组件首次渲染时绑定鼠标更新事件
  • 暴露组件状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { useState, useEffect } from 'react'

export function useMouse() {
const [x, setX] = useState(0)
const [y, setY] = useState(0)

useEffect(() => {
const update = e => {
setX(e.pageX)
setY(e.pageY)
}
window.addEventListener('mousemove', update)
return () => window.removeEventListener('mousemove', update)
}, [])

return { x, y }
}

1
2
3
4
5
6
7
8
import { useMouse } from './useMouse'

function MouseTracker() {
const { x, y } = useMouse()

return <p>Mouse at {x}, {y}</p>
}

Vue3

  • 定义状态
  • 函数组件中编写更新逻辑
  • 组件首次渲染时绑定鼠标更新事件
  • 暴露组件状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { ref, onMounted, onUnmounted } from 'vue'

export function useMouse() {
const x = ref(0)
const y = ref(0)

function update(event) {
x.value = event.pageX
y.value = event.pageY
}

onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))

return { x, y }
}

1
2
3
4
5
6
7
8
9
10
<script setup>
import { useMouse } from './useMouse.js'

const { x, y } = useMouse()
</script>

<template>
<p>Mouse at {{ x }}, {{ y }}</p>
</template>

小结

通过上述代码逻辑我们可以发现:

  • React和Vue3的组合式API风格为组件的封装和复用性提供了便利,是重点关注和学习的部分
  • Vue2的选项式API实现较为简单,结构清晰但是缺乏复用性
  • 选项式和组合式没有哪一种更好,对于初学者而言建议学习选项式,但是在实际开发生产用的更多的还是组合式API风格

Vue3&React|如何理解组合式API和选项式API
http://example.com/2025/06/05/Vue3-React-如何理解组合式API和选项式API/
作者
Noctis64
发布于
2025年6月5日
许可协议