Vite、Setup 语法糖总结
vite、vue3 使用了很久了,也到了该总结一波的时候了,各位大佬都来 looklook,查缺补漏,总结一下,形成概念,梳理一套属于自己的完整的知识体系, Vue3.2 版本开始才能使用语法糖!先查看自己的 vue 版本是否支持 setup 语法糖,在说怎么用
1、ref、reactive
ref: 接受一个内部值并返回一个响应式且可变的 ref 对象,有一个 .value 属性,可以通过其读取/修改对象的值。
reactive: 创建一个响应式对象,与 ref 不同的是,reactive 接受的参数是一个对象,可以使用 toRef(infoObj)为对象中的每一个属性创建一个 ref, 它可以保持对原属性的响应式链接
ts
<script setup lang='ts'>
const flag = ref<Boolean>(true);
console.log(flag.value); // true
const user = ref<userItem>({
name: "张三",
age: 18,
});
console.log(user.value.name); //张三
</script>
ts
<script setup lang='ts'>
const user =reactive({
name: "张三",
age: 18,
});
console.log(user.name); //张三
</script>
没什么特殊的区别,习惯哪个方便,就用哪个,什么 ref 存在异步问题之类的,可以忽略不计~
2、路由 Router
路由 Router、Route: 页面内 import 引入 vue-router 路由,使用 use 方法初始化路由
ts
import { useRouter, useRoute } from "vue-router";
const router = useRouter();
const route = useRoute();
console.log(route.query); // 获取query
console.log(route.params); // 获取params
//路由跳转
router.push({
path: `/Home`,
query: {},
params: {},
});
3、computed
ts
<script setup lang='ts'>
import { computed } from 'vue'
const a = ref<number>(1)
const b = ref<number>(2)
//简写
const total = computed(()=> {
return a.value + b.value
})
//完整写法
const total = computed({
get(){
return total
},
set(value){
total += 1
}
})
</script>
4、vuex/store
ts
<script setup lang="ts">
import {useStore} from 'vuex' const store = useStore() //获取store数据
console.log(store.state.xxx) //调用commit方法
store.commit('commit方法名','参数') //调用action方法
store.dispatch('action方法名','参数')
</script>
5、await 的支持
setup 语法糖中可直接使用 await ,不需要写 async , setup 会自动变成 async
6、数据的声明与使用
由于 setup 不需要写 return,所以直接声明数据即可。
ts
<script setup lang='ts'>
const demo = ref<String>('')
</script>
7、父子组件通信
7.1、 父组件内调用子组件,无需使用 components 对象注册组件
7.2、 子组件接收父组件传递来的数据,使用 defineProps 对象接收
7.3、 子组件向父组件传递数据,需先在 defineEmits 内注册 emit 函数名,然后才可以使用 emit('函数名','参数')进行父子通信
ts
<template>
//调用子组件->接收方法、传递数据
<child @getChildFunc="getChildFunc" data="data数据"/>
</template>
<script setup lang='ts'>
import child from './child.vue'
//只写重点
const getChildFunc = val => {
console.log('子组件传递来的数据' + val) // '子组件传递来的数据child-data'
}
</script>
ts
<template>
<button @click='childSendFunc'>点击-给父组件传递数据</button>
</template>
<script setup lang='ts'>
const props = defineProps({
data: String,
});
const emit = defineEmits(["getLeaveListFunc"]);
childSendFunc = ()=>{
console.log(props.data) // 'data数据'
emit('getChildFunc','child-data')
}
</script>
8、vite.config.ts 基础配置
ts
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
//gzip压缩
import viteCompression from "vite-plugin-compression";
import path from "path";
export default defineConfig({
plugins: [
vue(),
viteCompression({
//gzip压缩(不懂->百度)
verbose: true,
disable: false,
threshold: 1024,
algorithm: "gzip",
ext: ".gz",
}),
],
base: "./", //文件引用路径
server: {
host: "localhost",
port: "8081",
proxy: {
"/api": {
target: "http://localhost:3000", //代理目标端口
changOrigin: true, //是否跨域
rewrite: (path) => path.replace(/^\/api/, ""), //代理使用api,但是访问的后台接口不会增加/api这个路径(如果加上了,可能引起接口404)
},
},
},
resolve: {
alias: {
//路径别名
// 如果报错__dirname找不到,需要安装node,执行yarn add @types/node --save-dev
"@": path.resolve(__dirname, "src"),
comps: path.resolve(__dirname, "src/components"),
},
},
css: {
preprocessorOptions: {
scss: {
//引入全局less文件
additionalData: `@import "./src/assets/css/hack.less";`,
},
},
},
});