目录
一.简介及基础
1.Vue2/3
(1)版本
(2)调试工具
2.SPA
(1)概念
(2)优缺点
(3)快速创建vue的SPA项目
3.vite
4.template
二.组件的基本使用
1.Class与Style绑定
2.props
3.计算属性
4.自定义事件
5.组件上的v-module
6.侦听器
7.生命周期
8.组件间数据共享
(1)父子及兄弟组件间
(2) 兄弟组件共享数据
(3)后代关系组件间数据共享
(4)全局数据共享
9.全局配置axios
10.路由
(1)vue-router4.x用法
(2)命名路由
三.vue-cli
1.简介
2.创建项目
四.组件库
1.简介
2.引入element-ui
(1)完整引入
(2)按需引入
五.拦截器
六.proxy 跨域代理
优点:
快速创建工程化的SPA项目方式 | vite | vue-cli |
---|---|---|
支持的vue版本 | 仅支持vue3.x | 支持2.x 和 3.x |
是否基于webpack | 否 | 是 |
运行速度 | 快 | 较慢 |
功能完整度 | 小而巧(逐渐完善) | 大而全 |
是否建议在企业级开发中使用 | 目前不建议 | 建议 |
基于创建vite创建vue3.x
运行流程: 通过main.js把App.vue渲染到index.html的指定区域中
//main.js
// 1. 导入creatApp函数
import { createApp } from 'vue'
// 2. 导入待渲染的组件
import App from './App.vue'
import './index.css'
// 3. 调用函数 渲染模板结构至指定el区域
createApp(App).mount('#app')
渲染模板, 只起包裹作用
动态绑定: 使用v-bind: ,结合三元表达式,动态绑定class属性的值和行内的style样式
数组语法绑定: 三元表达式的数组动态绑定 (导致模板结构臃肿)
对象语法绑定: 对象中以键值对形式,动态添加移除类名
自定义验证函数, 封装组件时,精准控制prop属性值
props:{ //自定义属性 父组件向子组件传值可用
propA:{ //自定义属性指向一个对象
validator(val){ //validator函数, 对propA属性值进行校验 形参接收属性值 返回true验证通过, false验证不通过
return ['success','fail'].indexOf(val) !== -1 //匹配字符串,必须是这两个,不然报错
}
}
},
计算属性相比于方法: 会缓存计算结果,只有计算属性依赖项发生变化时,才重新进行计算, 性能更好
监听组件内的状态变化 (类似于vue2, 子组件向父组件传值)
计算属性和侦听器对比:
data(){
return{
info: { username : 'admin', password: ''}
}
},
watch:{
info:{ //监听info对象的变化 也可'info.username':{ }监听某个属性值的变化
async handler(newVal, oldVal){ //handler固定写法, 当username变化时,调用handler
const { data: res } = await axios.get('https://www.escook.cn/api/finduser/${newVal}') //解构出data, 并重命名为res
console.log(res); //Object { status: 0, message: "用户名可用!" }
},
deep: true, //监听对象时,使用deep对象,否则对象中的username等属性值无法被监听
immediate: true, //组件加载完毕后立即被调用一次当前的watch侦听器
}
}
//App.vue父组件 父子组件双向数据共享
// Son1.vue 子组件
Son1.vue------{{ num }}
props: ['num'],
emits: ['update: num'], //自定义事件
methods:{
add(){
this.$emit('update:num', this.num + 1)
}
},
EventBus.js, 借助mitt第三方包创建eventBus对象,从而实现兄弟组件之间的数据共享
父节点的组件向其子孙组件共享数据,组件之间的嵌套关系比较复杂, 使用provide(发送方)和inject(接收方)实现数据共享
实现声明式导航:
// 按需导入路由模块
import { createRouter, createWebHashHistory } from 'vue-router'
// 导入相关组件
import Home from './components/Start/Home.vue'
import Movie from './components/Start/Movie.vue'
// 创建路由实例对象
const router = createRouter({
// 指定路由工作模式 以哈希进行组件的切换
history: createWebHashHistory(),
// 路由高亮, 设置当前正在使用的组件的css样式, 若未设置,默认类名为router-link-active
linkActiveClass: 'active-router',
routes:[
{ path: '/' , redirect: '/home'}, //路由重定向
{ path: '/home', component: Home },
{ path: '/movie', component: Movie, redirect: '/tab1',children:[ //声明子路由, 可重定向打开即显示
{path: 'tab1', component: Tab1}
]},
]
})
// 声明全局路由导航守卫 使用路由规则前都会触发守卫,实行拦截
router.beforeEach(()=>{
console.log('1');
})
export default router
基于命令行: vue create 项目名称
基于可视化面板vue ui: 终端 vue ui
最常用的vue组件库
PC 端
操作相对复杂一些,但是只会引入用到的组件,能起到优化项目体积的目的
import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import { Loading } from 'element-plus'
import axios from 'axios'
axios.defaults.baseURL = 'https://www.escook.cn'
//声明变量,存储Loading组件的实例对象
let loadingInstance = null
// 配置请求拦截器
axios.interceptors.request.use(config => {
loadingInstance = Loading.service({ fullscreen: true}) //展示Loading效果
// 配置Token认证
config.headers.Authorization = 'xxx'
return config // 固定写法
})
// 配置响应拦截器
axios.interceptors.response.use( respose => {
loadingInstance = Loading.service({ fullscreen: false}) // 关闭loading效果
return respose
})
Vue.prototype.$http = axios
const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')
//vue.config.js中 配置proxy代理
module exports = {
devServer: {
proxy: 'https://www.escook.cn'
}
}