外观
Vue3 学习笔记
Vue3 是一套用于构建用户界面的渐进式框架,本文按复习视角梳理模板语法、组合式 API、组件、ECharts、axios 与 ElementPlus 的核心要点与常见易错点。
1. 模板语法与响应式
【重点要点】
- 插值
支持表达式、不支持下语句;v-text渲染纯文本,v-html渲染 HTML,注意v-html存在 XSS 风险。 - 属性绑定用
v-bind(简写:),事件绑定用v-on(简写@)。 - 响应式核心:
ref适合基本类型,JS 中取值必须.value;reactive适合对象,直接访问属性;两者在模板中都会自动解包。 - 条件渲染
v-if / v-else-if / v-else会增删节点,v-show只切换 display;列表用v-for。 - 易错点:JS 中忘写
.value;v-for的:key用唯一 id,不要直接用 index。
vue
<template>
<p>{{ msg }}</p>
<a :href="url">访问官网</a>
<button @click="count++">点击次数:{{ count }}</button>
<p v-if="count > 5">已经点超过 5 次了</p>
<ul>
<li v-for="item in list" :key="item.id">{{ item.name }}</li>
</ul>
</template>
<script setup>
import { ref } from 'vue'
const msg = ref('你好,Vue3')
const count = ref(0)
const url = ref('https://vuejs.org')
const list = ref([{ id: 1, name: '模板' }, { id: 2, name: '响应式' }])
</script>2. 组合式 API
【重点要点】
- 组合式 API 以
<script setup>为入口,按逻辑功能组织代码,替代选项式的 data/methods/computed。 computed有缓存,依赖变化才重算;watch侦听数据变化,可配{ deep: true, immediate: true };watchEffect自动追踪依赖。- 生命周期:请求接口常用
onMounted,清理定时器/事件用onBeforeUnmount。 - 跨层级传值用
provide / inject;ref处理基本类型,reactive处理对象。 - 易错点:
computed内不要写副作用;watch 监听reactive对象的属性需用 getter 或开启deep。
js
import { ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'
const price = ref(10)
const total = computed(() => price.value * 2)
watch(total, (newVal, oldVal) => {
console.log(`变化:${oldVal} -> ${newVal}`)
})
let timer = null
onMounted(() => { timer = setInterval(() => price.value++, 1000) })
onBeforeUnmount(() => clearInterval(timer))3. 各种简单组件
【重点要点】
- 组件是复用的基本单元:父传子用
props,子组件通过defineProps声明;子传父用defineEmits触发事件。 - 插槽
slot承载父组件注入的内容:具名插槽<template #header>,作用域插槽可接收子组件数据。 defineExpose把子组件内部方法暴露给父组件,通过 ref 调用;组件上也可直接使用v-model双向绑定。- 易错点:props 是单向数据流,子组件不能直接修改;事件名建议使用 kebab-case 便于模板书写。
vue
<!-- 子组件 Child.vue -->
<script setup>
defineProps(['title'])
const emit = defineEmits(['close'])
</script>
<template>
<div class="card">
<h3>{{ title }}</h3>
<slot>默认插槽内容</slot>
<button @click="emit('close')">关闭</button>
</div>
</template>vue
<!-- 父组件使用 -->
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const visible = ref(true)
</script>
<template>
<Child :title="'提示'" @close="visible = false">
<p>这是插槽传入的内容</p>
</Child>
</template>4. 图标,数据报表的前端框架ApacheECharts
【重点要点】
- ECharts 是 Apache 开源的数据可视化图表库,基于 JavaScript 的 canvas,适合做报表大盘。
- 使用流程:
npm install echarts→echarts.init(dom)→setOption(配置)。 - 常用图表:
line折线、bar柱状、pie饼图;常用配置项:title、tooltip、legend、xAxis、yAxis、series。 - 在
onMounted中初始化,onBeforeUnmount中dispose()销毁;窗口变化时调用chart.resize()。 - 易错点:容器必须有固定高度否则不显示;重复 init 同一容器会告警,需先 dispose;数据变化用
setOption覆盖。
js
import * as echarts from 'echarts'
import { ref, onMounted, onBeforeUnmount } from 'vue'
const chartRef = ref(null)
let chart = null
onMounted(() => {
chart = echarts.init(chartRef.value)
chart.setOption({
xAxis: { type: 'category', data: ['周一', '周二', '周三'] },
yAxis: { type: 'value' },
series: [{ type: 'line', data: [120, 200, 150] }]
})
window.addEventListener('resize', chart.resize)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', chart.resize)
chart && chart.dispose()
})html
<div ref="chartRef" style="width: 100%; height: 400px"></div>5. axios请求
【重点要点】
- axios 是基于 Promise 的 HTTP 客户端,支持
get/post等别名方法,配合then/catch或async/await使用。 - 常用配置:
baseURL统一前缀、timeout超时、headers携带 token。 - 拦截器:请求拦截器统一加 token、开 loading;响应拦截器统一拆数据、处理错误码与 401 跳转登录。
- 页面中一般放在
onMounted或事件函数里发起请求,配合try/catch处理异常。 - 易错点:响应内容是
res.data,业务数据常嵌套为res.data.data;GET 参数用params,POST 用data。
js
import axios from 'axios'
const request = axios.create({
baseURL: '/api',
timeout: 5000
})
// 请求拦截器:统一携带 token
request.interceptors.request.use(config => {
config.headers.Authorization = localStorage.getItem('token')
return config
})
// 响应拦截器:统一处理错误
request.interceptors.response.use(
res => res.data,
err => {
if (err.response && err.response.status === 401) {
location.href = '/login'
}
return Promise.reject(err)
}
)
// 页面中使用
async function getList() {
try {
const data = await request.get('/list', { params: { page: 1 } })
console.log(data)
} catch (err) {
console.error('请求失败', err)
}
}6. ElementPlus组件图标使用
【重点要点】
- Element Plus 是 Vue3 的桌面端组件库:
npm install element-plus,支持全量引入与按需自动导入(unplugin-vue-components / unplugin-auto-import)。 - 常用组件:
el-button、el-input、el-form表单校验(rules+prop+validate())、el-table、el-dialog、ElMessage消息提示。 - 图标单独成包:
npm i @element-plus/icons-vue,引入注册后可在模板中直接使用,或放入<el-icon>内。 - 易错点:按需引入必须配好插件否则样式丢失;图标组件需先 import 才能用;表单
prop必须与model字段名一致。
vue
<template>
<el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户名" prop="name">
<el-input v-model="form.name" placeholder="请输入用户名">
<template #prefix>
<el-icon><User /></el-icon>
</template>
</el-input>
</el-form-item>
<el-button type="primary" @click="submit">
<el-icon><Promotion /></el-icon> 提 交
</el-button>
</el-form>
</template>
<script setup>
import { ref, reactive } from 'vue'
import { ElMessage } from 'element-plus'
import { User, Promotion } from '@element-plus/icons-vue'
const formRef = ref(null)
const form = reactive({ name: '' })
const rules = {
name: [{ required: true, message: '请输入用户名', trigger: 'blur' }]
}
function submit() {
formRef.value.validate(valid => {
if (valid) {
ElMessage.success('校验通过,提交成功')
} else {
ElMessage.error('请检查表单内容')
}
})
}
</script>