vueapi对比

Vue API 对比

Created: 9/12/2025 15:01:19
Updated: 9/21/2025 15:47:36
Exported: 9/22/2025 18:30:19
Link: https://chatgpt.com/c/68c3c4fa-62d8-8320-b093-948aa7ef98f7

Prompt:vue中选项式api和组合式api

Response:

Vue 中,主要有两种编写组件的方式:选项式 API(Options API)组合式 API(Composition API)。两者本质上是不同的编程范式,各有优缺点。


1. 选项式 API (Options API)

这是 Vue2 默认的写法,Vue3 仍然支持。

特点:

  • 通过 配置项(options)来组织代码,如 datamethodscomputedwatchprops 等。
  • 逻辑按 功能类型 分组,而不是按功能逻辑聚合。

示例:

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

<template>
<div>
<p>Count: {{ count }}</p>
<p>Double: {{ double }}</p>
<button @click="increment">+</button>
</div>
</template>

优点:

  • 上手简单,适合小型项目和初学者。
  • API 直观,和 Vue2 兼容性好。

缺点:

  • 当组件逻辑复杂时,datamethodswatch 里的逻辑分散,不利于逻辑复用和维护
  • 大型项目中不利于拆分和组织。

2. 组合式 API (Composition API)

这是 Vue3 引入的新写法,使用 setup()<script setup> 组织逻辑。

特点:

  • 通过 函数 的形式组织逻辑,把相关的数据和逻辑聚合在一起。
  • 使用 refreactivecomputedwatch 等组合式函数。
  • 更容易提取和复用逻辑(自定义 Hook/函数)。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script setup>
import { ref, computed } from 'vue'

const count = ref(0)
const increment = () => count.value++
const double = computed(() => count.value * 2)
</script>

<template>
<div>
<p>Count: {{ count }}</p>
<p>Double: {{ double }}</p>
<button @click="increment">+</button>
</div>
</template>

优点:

  • 逻辑按功能聚合,清晰易读。
  • 逻辑复用方便(可抽取到 composable 函数)。
  • 更灵活,能写更高阶的功能。

缺点:

  • 对初学者来说学习成本较高(需要理解 refreactivecomputed 等)。
  • 写法不如选项式直观。

3. 比较总结

对比点 选项式 API (Options API) 组合式 API (Composition API)
学习曲线 简单,容易上手 较复杂,需要理解响应式 API
代码组织 按功能类型分组 按逻辑聚合分组
逻辑复用 mixins(容易冲突) composables(灵活、清晰)
适用场景 小型项目,初学者 中大型项目,复杂逻辑复用
Vue 版本支持 Vue2 / Vue3 Vue3 及以上

👉 结论:

  • 小型项目或初学阶段 → 用 选项式 API,简单直观。
  • 中大型项目 → 用 组合式 API,逻辑清晰,方便扩展和复用。

Prompt:我看不懂

Response:

没关系 👍 我帮你把 Vue 的 选项式 API组合式 API 用最简单的方式解释。


你可以把它们理解成 两种写代码的风格


选项式 API(Options API)

👉 就像做饭时,把 食材放在一个篮子,调料放在另一个篮子,工具放在第三个篮子。

  • data:存放数据(食材)
  • methods:存放方法(做菜的动作)
  • computed:存放计算结果(菜做好了)

代码例子(Vue2/3 都能用):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<script>
export default {
data() {
return {
count: 0 // 数据
}
},
methods: {
add() { // 方法
this.count++
}
},
computed: {
double() { // 计算属性
return this.count * 2
}
}
}
</script>

<template>
<p>{{ count }}</p>
<p>{{ double }}</p>
<button @click="add">加一</button>
</template>

📌 特点:容易上手,但是如果菜很多(逻辑复杂),找东西麻烦。


组合式 API(Composition API)

👉 就像做饭时,你把 相关的东西放在一起:食材 + 工具 + 做法都放到一个小盒子里。

  • refreactive 定义数据
  • computed 定义计算属性
  • 用函数把逻辑组织在一起

代码例子(Vue3 用法):

1
2
3
4
5
6
7
8
9
10
11
12
13
<script setup>
import { ref, computed } from 'vue'

const count = ref(0) // 数据
const add = () => count.value++ // 方法
const double = computed(() => count.value * 2) // 计算属性
</script>

<template>
<p>{{ count }}</p>
<p>{{ double }}</p>
<button @click="add">加一</button>
</template>

📌 特点:写起来有点难,但逻辑很清楚,而且方便拆分复用。


对比总结

  • 选项式 API:分类存放 → 简单,好理解,但逻辑复杂时不好找。
  • 组合式 API:逻辑打包 → 稍微难点,但结构清晰,适合大项目。

Prompt:什么是vue router

Response:

好的,我用简单的语言帮你解释 Vue Router 👇


🌐 什么是 Vue Router?

Vue Router 就是 Vue.js 官方的路由管理器
你可以把它理解成一个 地图导航系统,专门帮你在不同的“页面”之间切换。


🚗 类比一下

  • 在网页里,其实只有一个 index.html 文件(单页面应用 SPA)。
  • 但是我们希望看起来像有很多页面:主页、关于页、详情页…
  • Vue Router 就是“导航”工具,根据网址不同,展示不同的 Vue 组件。

就像你在手机地图里:

  • 输入 /home 👉 去首页
  • 输入 /about 👉 去关于页
  • 输入 /user/1 👉 去用户 1 的详情页

📝 基本用法

安装:

1
npm install vue-router

创建路由文件(router.js):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { createRouter, createWebHistory } from 'vue-router'
import Home from './pages/Home.vue'
import About from './pages/About.vue'

const routes = [
{ path: '/home', component: Home },
{ path: '/about', component: About }
]

const router = createRouter({
history: createWebHistory(), // 使用浏览器历史模式
routes
})

export default router

在 Vue 入口文件 main.js 里使用:

1
2
3
4
5
6
7
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

const app = createApp(App)
app.use(router)
app.mount('#app')

在页面里跳转:

1
2
3
4
5
6
7
8
9
<template>
<div>
<router-link to="/home">首页</router-link>
<router-link to="/about">关于</router-link>

<!-- 这里显示对应的组件 -->
<router-view></router-view>
</div>
</template>

📌 关键点记住:

  1. router-link = 超链接,用来跳转。
  2. router-view = 显示当前路由对应的页面。
  3. routes = 路由表,规定哪个路径显示哪个组件。

Prompt:嵌套路由

Response:

很好 👍 你已经理解 Vue Router 的基础了,现在我帮你讲 嵌套路由


🌳 什么是嵌套路由?

  • 简单来说:一个页面里面还有子页面
  • 就像一个大商场(父路由),里面有不同的店铺(子路由)。
  • 在 Vue 里,父组件里面用 <router-view> 再嵌套一个子路由。

📝 示例

比如我们有一个 用户中心(/user) 页面,里面有两个子页面:

  • /user/profile → 用户资料
  • /user/settings → 用户设置

1. 定义路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import { createRouter, createWebHistory } from 'vue-router'
import User from './pages/User.vue'
import UserProfile from './pages/UserProfile.vue'
import UserSettings from './pages/UserSettings.vue'

const routes = [
{
path: '/user',
component: User, // 父组件
children: [ // 子路由
{
path: 'profile', // 注意这里不要写 `/`
component: UserProfile
},
{
path: 'settings',
component: UserSettings
}
]
}
]

const router = createRouter({
history: createWebHistory(),
routes
})

export default router

2. 父组件 User.vue

1
2
3
4
5
6
7
8
9
10
<template>
<div>
<h2>用户中心</h2>
<router-link to="/user/profile">资料</router-link>
<router-link to="/user/settings">设置</router-link>

<!-- 子路由出口 -->
<router-view></router-view>
</div>
</template>

3. 访问效果

  • 访问 /user/profile 👉 显示 UserProfile
  • 访问 /user/settings 👉 显示 UserSettings
  • 外层始终是 User.vue,里面的 <router-view> 再切换子组件

📌 总结

  • 父路由组件 里要有一个 <router-view> 占位符,子路由会显示在里面。
  • 子路由路径写的时候 **不要加斜杠 /**,否则会被当成根路径。

Prompt:vue代理配置

Response:

好问题 👍 你说的 Vue 代理配置,一般是指在 本地开发环境下,Vue 项目通过 代理(proxy) 转发 API 请求,解决 跨域问题


🔍 为什么需要代理?

  • 前端(Vue)通常运行在 http://localhost:8080
  • 后端 API 可能在 http://localhost:8081 或者其他域名
  • 浏览器有 同源策略,直接请求会报 跨域错误
  • 所以需要一个 代理服务器,把前端请求转发给后端,看起来像是同源的

📝 Vue2 (Vue CLI) 配置

vue.config.js 文件里写:

1
2
3
4
5
6
7
8
9
10
11
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8081', // 后端接口地址
changeOrigin: true, // 是否修改源
pathRewrite: { '^/api': '' } // 重写路径(可选)
}
}
}
}

👉 请求时:

1
axios.get('/api/users')

实际上会被代理到:

1
http://localhost:8081/users

📝 Vue3 (Vite) 配置

如果你用的是 Vite,就在 vite.config.js 里配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
plugins: [vue()],
server: {
proxy: {
'/api': {
target: 'http://localhost:8081',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}
})

👉 请求时:

1
fetch('/api/users')

实际上会去请求:

1
http://localhost:8081/users

📌 关键参数解释

  • target:代理的目标地址(后端服务地址)
  • changeOrigin:是否修改请求头里的 Origin,避免后端拒绝请求
  • pathRewrite / rewrite:路径重写,把 /api/xxx 变成 /xxx

要不要我给你整理一份 Vue2 vs Vue3 代理配置对照表,这样你就能快速区分该用哪个配置了?

Prompt:elementplus表单校验步骤

1. 引入 Form 组件

Element Plus 的表单校验主要依赖 <el-form><el-form-item>rules 规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<template>
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
<el-form-item label="用户名" prop="username">
<el-input v-model="form.username"></el-input>
</el-form-item>

<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email"></el-input>
</el-form-item>

<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="resetForm">重置</el-button>
</el-form-item>
</el-form>
</template>

2. 定义数据和校验规则

<script setup> 或普通 <script> 里写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { reactive, ref } from 'vue'

const formRef = ref() // 获取表单实例
const form = reactive({
username: '',
email: ''
})

// 校验规则
const rules = {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{ type: 'email', message: '邮箱格式不正确', trigger: 'blur' }
]
}

3. 提交时手动校验

调用 formRef.value.validate() 方法:

1
2
3
4
5
6
7
8
9
10
const submitForm = () => {
formRef.value.validate((valid) => {
if (valid) {
console.log('✅ 校验通过,可以提交数据:', form)
} else {
console.log('❌ 校验失败')
return false
}
})
}

4. 重置表单

调用 resetFields 方法:

1
2
3
const resetForm = () => {
formRef.value.resetFields()
}

📌 总结步骤

  1. <el-form> 包裹表单,设置 :model:rules
  2. <el-form-item> 上绑定 prop,对应 model 里的字段。
  3. 在脚本里定义 rules(必填、格式、长度等)。
  4. 通过 validate 方法进行校验,通过 resetFields 方法重置表单。

Prompt:后端请求格式是/depts?id=1,前端应该怎么写

Response:

明白啦 👍 你后端接口是这样:

1
GET /depts?id=1

也就是通过 查询参数(query parameter) 传递 id


🔹 如果你用 Axios

前端这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
import axios from 'axios'

// 方式一:直接拼接
axios.get('/depts?id=1').then(res => {
console.log(res.data)
})

// 方式二:推荐写法(params 会自动拼接到 URL 上)
axios.get('/depts', {
params: { id: 1 }
}).then(res => {
console.log(res.data)
})

👉 推荐 方式二,更清晰,Axios 会自动处理 ?id=1


🔹 如果你用 Fetch API

1
2
3
fetch('/depts?id=1')
.then(res => res.json())
.then(data => console.log(data))

🔹 如果你用了 Vue Router 路由跳转带参数

1
this.$router.push({ path: '/depts', query: { id: 1 } })

👉 最终地址会变成:

1
/depts?id=1

📌 总结:

  • 后端要求 /depts?id=1 → 前端就是 Query 参数请求
  • Axios 推荐写法:
1
axios.get('/depts', { params: { id: 1 } })

Prompt:

比如这里要怎么改export const deleteApi = (id) => {
return request.delete(/depts/${id})
}

Response:

👌 明白了,你现在的代码是 RESTful 风格,路径是:

1
/depts/1   // 把 id 放在路径里面

但是你后端接口格式是:

1
/depts?id=1   // 把 id 放在查询参数里

🔧 修改方式

只需要把 路径参数 改成 查询参数

1
2
3
4
5
export const deleteApi = (id) => {
return request.delete('/depts', {
params: { id } // ✅ axios 会自动拼接成 /depts?id=1
})
}

📌 对比

  • 原来写法(RESTful):
1
request.delete(`/depts/${id}`)

请求地址:/depts/1

  • 现在改法(Query 参数):
1
request.delete('/depts', { params: { id } })

请求地址:/depts?id=1

Prompt:总结

  1. 选项式 API vs 组合式 API
    • 选项式 API(Options API):代码按 功能类型 分类(data、methods…),简单直观,适合小项目。
    • 组合式 API(Composition API):代码按 逻辑聚合,用 setuprefreactive,更灵活,适合大项目。
  2. Vue Router
    • Vue 官方的路由管理器,用来在不同“页面”之间切换。
    • 核心:routes(路由表)、router-link(跳转)、router-view(显示页面)。
    • 嵌套路由:父路由里再用 <router-view>,子路由会显示在里面。
  3. Vue 代理配置(解决跨域)
    • Vue2 (CLI):在 vue.config.jsdevServer.proxy 配置。
    • Vue3 (Vite):在 vite.config.jsserver.proxy 配置。
    • 常用参数:target(后端地址)、changeOrigin(修改请求源)、rewrite(路径重写)。
  4. Element Plus 表单校验
    • <el-form> + rules 配置校验规则。
    • formRef.validate() → 提交时校验;formRef.resetFields() → 重置表单。
    • 支持必填、长度、邮箱、正则等多种规则。
  5. Axios 请求参数写法
    • Query 参数(/depts?id=1)
      1
      axios.get('/depts', { params: { id: 1 } })
    • RESTful 参数(/depts/1)
      1
      axios.delete(`/depts/${id}`)
    • 如果后端要求 /depts?id=1,就要用 params

👉 总结一句:

  • Vue 负责前端页面和组件逻辑(Options API / Composition API)。
  • Vue Router 负责页面跳转(路由和嵌套路由)。
  • 代理配置解决跨域问题。
  • Element Plus 提供 UI 和表单校验。
  • Axios 负责请求后端接口,不同参数写法要区分 querypath