vue3部分知识梳理

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 对于一些开发过程中的异常,做了更友好的提示警告,比如下面这个提示:

vue3部分知识梳理_第1张图片

这样能够更清楚的告知异常的出处,可以看出大概是

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

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

vue3部分知识梳理_第2张图片

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

当我们在控制台输出 ref声明的变量时。

const count = ref(0);

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

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

vue3部分知识梳理_第3张图片

看起来很不直观。我们都知道,要获取和修改 ref声明的变量的值,需要通过 .value来获取,所以你也可以:

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

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

vue3部分知识梳理_第4张图片

vue3部分知识梳理_第5张图片

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

vue3部分知识梳理_第6张图片

6、Vite

(1)Vite 配置 alias 类型别名

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

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

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

// vite.config.ts
export 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)等时,如:




我们可以将 scss 主题配置文件,配置在 vite.config.ts 的 css.preprocessorOptions.scss.additionalData中:

// vite.config.ts
export 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

如果要做路由跳转,就可以使用 useRouter方法的返回值去跳转:

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

8、Element Plus

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

项目新安装的 element-plus 在开发阶段都是正常,没有提示任何警告,但是在打包过程中,控制台输出下面警告内容:

vue3部分知识梳理_第7张图片

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

// vite.config.ts
export default defineConfig({
  css: {
    preprocessorOptions: {
      scss: {
        charset: false // 无效
      }
    }
  }
})

最后在官方的 issues 中找到处理方法:

// vite.config.ts

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

你可能感兴趣的:(vue3)