1、script-setup 模式中父组件获取子组件的数据

咱们能够应用全局编译器宏的defineExpose宏,将子组件中须要裸露给父组件获取的参数,通过 {key: vlaue}形式作为参数即可,父组件通过模版 ref 形式获取子组件实例,就能获取到对应值:

// 子组件<script setup>    let name = ref("pingan8787")    defineExpose({ name }); // 显式裸露的数据,父组件才能够获取</script>// 父组件<Chlid ref="child"></Chlid><script setup>    let child = ref(null)    child.value.name //获取子组件中 name 的值为 pingan8787</script>

留神:

全局编译器宏只能在 script-setup 模式下应用;
script-setup 模式下,应用宏时无需 import能够间接应用;
script-setup 模式一共提供了 4 个宏,包含:defineProps、defineEmits、defineExpose、withDefaults。

2、配置全局自定义参数

在 Vue2.x 中咱们能够通过 Vue.prototype 增加全局属性 property。然而在 Vue3.x 中须要将 Vue.prototype 替换为 config.globalProperties 配置:

// Vue2.xVue.prototype.$api = axios;Vue.prototype.$eventBus = eventBus;// Vue3.xconst app = createApp({})app.config.globalProperties.$api = axios;app.config.globalProperties.$eventBus = eventBus;

应用时须要先通过 vue 提供的 getCurrentInstance办法获取实例对象:

// A.vue<script setup lang="ts">import { ref, onMounted, getCurrentInstance } from "vue";onMounted(() => {  const instance = <any>getCurrentInstance();  const { $api, $eventBus } = instance.appContext.config.globalProperties;  // do something})</script>

3、v-model 变动

Vue2.x

<ChildComponent v-model="pageTitle" /><!-- 是以下的简写: --><ChildComponent :value="pageTitle" @input="pageTitle = $event" />

Vue3.x

<ChildComponent v-model="pageTitle" /><!-- 是以下的简写: --><ChildComponent :modelValue="pageTitle" @update:modelValue="pageTitle = $event"/>

4、开发环境报错不好排查

Vue3.x 对于一些开发过程中的异样,做了更敌对的提醒正告,比方上面这个提醒:

这样可能更分明的告知异样的出处,能够看出大略是 <ElInput 0=......这边的问题,但还不够分明。这时候就能够增加 Vue3.x 提供的全局异样处理器,更清晰的输入谬误内容和调用栈信息,代码如下:

// main.tsapp.config.errorHandler = (err, vm, info) => {    console.log('[全局异样]', err, vm, info)}

这时候就能看到输入内容如下:

5、察看 ref 的数据不直观,不不便

当咱们在控制台输入 ref申明的变量时。

const count = ref<numer>(0);console.log('[测试 ref]', count)

会看到控制台输入了一个 RefImpl对象:

看起来很不直观。咱们都晓得,要获取和批改 ref申明的变量的值,须要通过 .value来获取,所以你也能够:

console.log('[测试 ref]', count.value);

这里还有另一种形式,就是在控制台的设置面板中开启 「Enable custom formatters」选项。

这时候你会发现,控制台输入的 ref的格局发生变化了:

6、Vite

(1)Vite 配置 alias 类型别名

当我的项目比较复杂的时候,常常须要配置 alias 门路别名来简化一些代码:

import Home from '@/views/Home.vue'

在 Vite 中配置也很简略,只须要在 vite.config.ts 的 resolve.alias中配置即可:

// vite.config.tsexport default defineConfig({  base: './',  resolve: {    alias: {      "@": path.join(__dirname, "./src")    },  }  // 省略其余配置})

如果应用的是 TypeScript 时,编辑器会提醒门路不存在的正告⚠️,这时候能够在 tsconfig.json中增加 compilerOptions.paths的配置:

{  "compilerOptions": {    "paths": {      "@/*": ["./src/*"]     }  }}

(2)Vite 配置全局 scss

当咱们须要应用 scss 配置的主题变量(如 $primary)、mixin办法(如 @mixin lines)等时,如:

<script setup lang="ts"></script><template>  <div class="container"></div></template><style scoped lang="scss">  .container{    color: $primary;    @include lines;  }</style>

咱们能够将 scss 主题配置文件,配置在 vite.config.ts 的 css.preprocessorOptions.scss.additionalData中:

// vite.config.tsexport default defineConfig({  base: './',  css: {    preprocessorOptions: {      // 增加公共款式      scss: {        additionalData: '@import "./src/style/style.scss";'      }    }  },  plugins: [vue()]  // 省略其余配置})

如果不想应用 scss 配置文件,也能够间接写成 scss 代码:

export default defineConfig({  css: {    preprocessorOptions: {      scss: {        additionalData: '$primary: #993300'      }    }  }})

7、VueRouter

(1)script-setup 模式下获取路由参数

因为在 script-setup模式下,没有 this能够应用,就不能间接通过 this.$router或 this.$route来获取路由参数和跳转路由。当咱们须要获取路由参数时,就能够应用 vue-router提供的 useRoute办法来获取,应用如下:

// A.vue<script setup lang="ts">import { ref, onMounted } from 'vue';import router from "@/router";import { useRoute } from 'vue-router'let detailId = ref<string>('');onMounted(() => {    const route = useRoute();    detailId.value = route.params.id as string; // 获取参数})</script>

如果要做路由跳转,就能够应用 useRouter办法的返回值去跳转:

const router = useRouter();router.push({  name: 'search',  query: {/**/},})

8、Element Plus

(1)element-plus 打包时 @charset 正告

我的项目新装置的 element-plus 在开发阶段都是失常,没有提醒任何正告,然而在打包过程中,控制台输入上面正告内容:

尝试在 vite.config.ts中配置 charset: false,后果也是有效:

// vite.config.tsexport default defineConfig({  css: {    preprocessorOptions: {      scss: {        charset: false // 有效      }    }  }})

最初在官网的 issues 中找到解决办法:

// vite.config.tscss: {  postcss: {    plugins: [      // 移除打包element时的@charset正告      {        postcssPlugin: 'internal:charset-removal',        AtRule: {          charset: (atRule) => {            if (atRule.name === 'charset') {              atRule.remove();            }          }        }      }    ],  },}