当前位置 博文首页 > 文章内容

    Vue组件如何自动按需引入详析

    作者:shunshunshun18 栏目:未分类 时间:2021-12-28 15:11:10

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    在Vue中我们可以通过全局组件、局部注册的方式来使用组件

    全局注册

    通过app.component来创建全局组件

    import { createApp } from 'vue'
    import HelloWorld from './components/HelloWorld'
    
    const app = createApp({})
    
    // 全局注册一个名为hello-wolrd的组件
    app.component('hello-wolrd', HelloWorld);
    

    一旦我们全局注册了组件,我们就可以在任何地方使用这个组件:<hello-wolrd/>

    值得注意的是全局注册会使Vue失去TypeScript的支持, Vue 3 有一个 PR 扩展了全局组件的接口。目前,Volar 已经支持这种用法,我们可以通过在根目录添加components.d.ts文件的方式来添加全对局组件的TypeScript的支持

    declare module 'vue' {
      export interface GlobalComponents {
        HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
      }
    }
    

    局部注册

    我们可以直接从文件中引入vue组件使用,

    在单文件组件中(SFC)

    <template>
      <HelloWorld msg="Welcome to Your Vue.js App"/>
    </template>
    
    <script>
    import HelloWorld from './components/HelloWorld.vue'
    
    export default {
      name: 'App',
      components: {
        HelloWorld
      }
    }
    </script>
    

    在JSX中

    import HelloWolrd from './components/HelloWorld.vue'
    export default {
      name: "item",
      render(){
        return (
          <HelloWolrd msg="Welcome to Your Vue.js App"/>
        )
      }
    }
    

    局部注册的组件在其他组件中无法访问,在其父组件或子组件或中均不可用,所以你需要在每个使用该组件的地方重新引入并注册该组件

    import HelloWolrd from './components/HelloWorld.vue'
    

    但是这种直接导入组件的方式还有一个好处,如果我们导入的组件使用了typescript,我们无需任何插件就可以在组件中获得智能提示和类型检查的功能

    局部自动注册

    可以看到局部注册的优点是比较明显的,但是每次使用我们都需要重复导入,但是如果你的组件很多,你的组件注册代码看起来可能比较冗长,我们可以使用unplugin-vue-components,自动按需导入组件. 它会按需导入组件,但是不再需要导入和组件注册

    该插件会自动对使用的组件生成一个components.d.ts从而获得TypeScript的支持,

    安装插件

    vite

    // vite.config.ts
    import Components from 'unplugin-vue-components/vite'
    
    export default defineConfig({
      plugins: [
        Components({ /* options */ }),
      ],
    })
    

    rollup

    // rollup.config.js
    import Components from 'unplugin-vue-components/rollup'
    
    export default {
      plugins: [
        Components({ /* options */ }),
      ],
    }
    

    webpack

    // webpack.config.js
    module.exports = {
      /* ... */
      plugins: [
        require('unplugin-vue-components/webpack')({ /* options */ })
      ]
    }
    

    然后我们可以像往常一样在模板中使用组件,它会自动进行下面的转换

    <template>
      <div>
        <HelloWorld msg="Hello Vue 3.0 + Vite" />
      </div>
    </template>
    
    <script>
    export default {
      name: 'App'
    }
    </script>
    

    转换成

    <template>
      <div>
        <HelloWorld msg="Hello Vue 3.0 + Vite" />
      </div>
    </template>
    
    <script>
    import HelloWorld from './src/components/HelloWorld.vue'
    
    export default {
      name: 'App',
      components: {
        HelloWorld
      }
    }
    </script>
    

    默认它会在src/components目录下查找组件,我们可以通过dirs参数来自定义组件目录,其他配置参考github.com/antfu/unplu

    不同方案对比

    全局注册 局部注册 unplugin-vue-components
    TypeScript支持 定义components.d.ts文件 默认支持 自动生成components.d.ts文件
    组件作用域 全局 局部 局部
    使用方法 全局注册后使用 局部注册后使用 添加插件后使用

    关于组件名

    定义组件名的方式有两种:

    使用 kebab-case:

    Vue.component('my-component-name', { /* ... */ })
    当使用 kebab-case (短横线分隔命名)定义一个组件时,
    你也必须在引用这个自定义元素时使用 kebab-case,例如 <my-component-name>。
    

    使用 驼峰命名法PascalCase

    Vue.component('MyComponentName', { /* ... */ })
    当使用 PascalCase (首字母大写命名) 定义一个组件时,
    你在引用这个自定义元素时两种命名法都可以使用。
    也就是说 <my-component-name> 和 <MyComponentName>都是可接受的。
    注意,尽管如此,直接在 DOM (即非字符串的模板) 中使用时只有 kebab-case 是有效的。
    
    

    所以我们一般建议组件都采用kebab-case这种命名方式。

    参考

    v3.cn.vuejs.org/guide/compo

    v3.cn.vuejs.org/guide/types

    github.com/antfu/unplu

    总结