Skip to content

Vue 3 基础

作者: luote (luote) · 个人主页 luote996.cn

Vue 是什么

Vue 是用于构建用户界面的渐进式框架。你只需关注 数据(state)视图(template) 的绑定,数据变化时视图自动更新。create-luote 使用 Vue 3组合式 API(Composition API)

单文件组件 SFC

.vue 文件包含三块:

vue
<template>
  <div>{{ message }}</div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const message = ref('hello luote')
</script>

<style scoped>
div { color: #409eff; }
</style>
作用
templateHTML 模板,支持 Vue 指令
script setup逻辑与状态,lang="ts" 使用 TypeScript
style scoped仅作用于当前组件的样式

响应式 ref 与 reactive

typescript
import { ref, reactive } from 'vue'

const count = ref(0)
count.value++  // script 中访问 ref 需 .value

const form = reactive({
  username: '',
  password: ''
})
form.username = 'admin'  // reactive 对象直接改属性

模板里使用 ref 会自动解包,写 即可,不必写 .value

常用模板语法

语法作用
文本插值
v-if / v-else条件渲染
v-for="item in list"列表渲染
v-model="form.name"双向绑定,表单必备
@click="handleClick"事件绑定
:src="url"属性绑定,冒号是 v-bind 简写

登录页 login/index.vue 中表单、按钮、错误提示都是这些语法的组合。

组合式 API 生命周期

typescript
import { onMounted, onUnmounted } from 'vue'

onMounted(() => {
  // 组件挂载后,常用来请求首屏数据
})

onUnmounted(() => {
  // 清理定时器、取消订阅
})

组件通信

方式场景
props父 → 子,子组件只读
emit子 → 父,触发事件
Pinia跨页面共享状态(见后文)

CaptchaInput.vue 通过 props 接收验证码 key,通过 emit 把用户输入同步给父组件。

计算属性与侦听

typescript
import { computed, watch } from 'vue'

const fullName = computed(() => `${first.value} ${last.value}`)

watch(count, (newVal) => {
  console.log('count changed', newVal)
})

复杂衍生数据用 computed 缓存;需要在数据变化时执行副作用用 watch

Element Plus 与 Vue

Element Plus 是 Vue 3 组件库,直接使用标签即可:

vue
<el-button type="primary" @click="submit">登录</el-button>
<el-input v-model="form.username" placeholder="用户名" />

已在 main.ts 全局注册,无需每个页面单独 import 常用组件(图标等除外)。

与 luote 脚手架的关系

路径说明
src/view/login/index.vue表单、验证码、登录逻辑
src/component/CaptchaInput.vue可复用子组件
src/layout/MainLayout.vue布局与导航
src/App.vue根组件,挂载 router-view

下一章:Vite Pinia Router

MIT Licensed