1、script-setup 模式中父组件获取子组件的数据
我们可以使用全局编译器宏的defineExpose宏,将子组件中需要暴露给父组件获取的参数,通过 {key: vlaue}方式作为参数即可,父组件通过模版 ref 方式获取子组件实例,就能获取到对应值:
// 子组件
// 父组件
注意:
全局编译器宏只能在 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.x
Vue.prototype.$api = axios;
Vue.prototype.$eventBus = eventBus;
// Vue3.x
const app = createApp({})
app.config.globalProperties.$api = axios;
app.config.globalProperties.$eventBus = eventBus;
使用时需要先通过 vue 提供的 getCurrentInstance方法获取实例对象:
// A.vue
3、v-model 变化
Vue2.x
Vue3.x
4、开发环境报错不好排查
Vue3.x 对于一些开发过程中的异常,做了更友好的提示警告,比如下面这个提示:
这样能够更清楚的告知异常的出处,可以看出大概是 这时候就能看到输出内容如下: 5、观察 ref 的数据不直观,不方便 当我们在控制台输出 ref声明的变量时。 会看到控制台输出了一个 RefImpl对象: 看起来很不直观。我们都知道,要获取和修改 ref声明的变量的值,需要通过 .value来获取,所以你也可以: 这里还有另一种方式,就是在控制台的设置面板中开启 「Enable custom formatters」选项。 这时候你会发现,控制台输出的 ref的格式发生变化了: 6、Vite (1)Vite 配置 alias 类型别名 当项目比较复杂的时候,经常需要配置 alias 路径别名来简化一些代码: 在 Vite 中配置也很简单,只需要在 vite.config.ts 的 resolve.alias中配置即可: 如果使用的是 TypeScript 时,编辑器会提示路径不存在的警告⚠️,这时候可以在 tsconfig.json中添加 compilerOptions.paths的配置: (2)Vite 配置全局 scss 当我们需要使用 scss 配置的主题变量(如 $primary)、mixin方法(如 @mixin lines)等时,如: 我们可以将 scss 主题配置文件,配置在 vite.config.ts 的 css.preprocessorOptions.scss.additionalData中: 如果不想使用 scss 配置文件,也可以直接写成 scss 代码: 7、VueRouter (1)script-setup 模式下获取路由参数 由于在 script-setup模式下,没有 this可以使用,就不能直接通过 this.$router或 this.$route来获取路由参数和跳转路由。当我们需要获取路由参数时,就可以使用 vue-router提供的 useRoute方法来获取,使用如下: 如果要做路由跳转,就可以使用 useRouter方法的返回值去跳转: 8、Element Plus (1)element-plus 打包时 @charset 警告 项目新安装的 element-plus 在开发阶段都是正常,没有提示任何警告,但是在打包过程中,控制台输出下面警告内容: 尝试在 vite.config.ts中配置 charset: false,结果也是无效: 最后在官方的 issues 中找到处理方法:// main.ts
app.config.errorHandler = (err, vm, info) => {
console.log('[全局异常]', err, vm, info)
}
const count = ref
console.log('[测试 ref]', count.value);
import Home from '@/views/Home.vue'
// vite.config.ts
export default defineConfig({
base: './',
resolve: {
alias: {
"@": path.join(__dirname, "./src")
},
}
// 省略其他配置
})
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
}
// vite.config.ts
export default defineConfig({
base: './',
css: {
preprocessorOptions: {
// 添加公共样式
scss: {
additionalData: '@import "./src/style/style.scss";'
}
}
},
plugins: [vue()]
// 省略其他配置
})
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: '$primary: #993300'
}
}
}
})
// A.vue
const router = useRouter();
router.push({
name: 'search',
query: {/**/},
})
// vite.config.ts
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
charset: false // 无效
}
}
}
})
// vite.config.ts
css: {
postcss: {
plugins: [
// 移除打包element时的@charset警告
{
postcssPlugin: 'internal:charset-removal',
AtRule: {
charset: (atRule) => {
if (atRule.name === 'charset') {
atRule.remove();
}
}
}
}
],
},
}