百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Vue组件的注册使用

toqiye 2024-11-27 21:09 8 浏览 0 评论

前言:在单页面应用开发中,大多数情况下只有一个html页面,那么单页面的页面跳转,其实就是各组件之间的切换,那么这个组件其实就充当的是一个一个独立的html页面的角色,只不过这个组件之间可以复用,传值,随意调用,在vue中通常由(vue-router)和组件(component)来配合完成,那么这个component就是我们下来将要学习的组件。

什么是组件?

官方说组件是可复用的 Vue 实例,且带有一个名字,它与 new Vue 拥有相同的选项,比如它拥有生命周期钩子、data、computed、methods 等,与 new Vue 的唯一区别是不拥有 el 这样的根实例选项。

注册组件的两种方式

全局注册

Vue.component('my-component-name', {/*...*/})

局部注册

var ComponentA = { /*....*/ }

new Vue({
  el: '#app',
  components: {
    'component-a': ComponentA
  }
})

无论是全局注册还是局部注册,每个组件都需要有个名字。比如在全局注册的my-component-name和局部注册的component-a都是组件的名称, 组件名称推荐的命名方式hello-word的方式,也就是字母全小写,不同字母使用连字符

全局注册组件的使用场景

    <div id="app">
      <btn-success></btn-success>
    </div>
    
    <script type="text/javascript">
      Vue.component('btn-success', {
        template: '<div> <button class="btn-success" @click="onSuccessClick">成功</button> </div>',
        methods:{
          onSuccessClick: function(){
            alert('点击了Success按钮');
          }
        }
      });
      
      var vm = new Vue({
        el: "#app",
      })
      
    </script>

上面的案例中我们注册了一个全局组件btn-success,可以看到我们为这个组件提供了一个模板template,这个模板里的内容其实就是这个组件最终要渲染的内容,并给它添加了一个点击事件 onSuccessClick,点击 btn-success 就会触发 onSuccessClick 方法。

这就是一个单独模块,它可以独立去维护自己的点击事件以及生命周期钩子,当我们需要使用它时,只需要通过 <btn-success></btn-success> 标签名的方式就可以把它展示在我们的 el 中,在使用VueCli构建工具开发的时候,组件将会被拆分成.vue后缀的单独文件,并且各个组件相互独立,互不干扰。

需要注意的是,组件中的data选项的指向不再是一个对象{},而变成了一个方法funvtion(){return {}},并通过return返回一个独立的对象。

举个例子 我们将刚才上边的例子改造为一个累加的效果,点击按钮一次加一!

   <div id="app">
      <!-- 调用全局组件 -->
      <btn-success></btn-success>
      <btn-success></btn-success>
      <btn-success></btn-success>
    </div>
    
    <script type="text/javascript">
      // 定义全局组件btn-success
      Vue.component('btn-success', {
        template: '<div> 当前值:{{ count }}  <button class="btn-success" @click="onSuccessClick">成功</button> </div>',
        data:function(){
          return {
            count: 0
          }
        },
        methods:{
          onSuccessClick: function(){
            this.count += 1
          }
        }
      });
      
      var vm = new Vue({
        el: "#app",
      })
      
    </script>

注意:此时在组件中定义的count值目前只能在组件中调用,el中不能调用,还需要注意的是通过全局注册的组件,无论是否对它进行了引用,它总会包含在最终的构建结果中,试想一下,当我们费尽心思来优化工具配置,希望最终构建结果尽可能精简时,这是不是一件非常令人绝望的事情?

基于此,vue更推荐使用局部注册的方式来进行组件的定义。

局部注册组件的使用场景

依然以刚才的示例为底,我们改造一下变成局部注册组件的方式,完成累加任务!

   <div id="app">
      <!-- 调用全局组件 -->
      <btn-success></btn-success>
      <btn-success></btn-success>
      <btn-success></btn-success>
    </div>
    
    <script type="text/javascript">
      var btnCountAdd = {
        template: '<div><span>当前count的值:{{count}}</span><button @click="onCountAddClick">count++</button></div>',
        data: function () {
                return {
                    count: 0
                }
              },
        methods: {
          onCountAddClick: function () {
            this.count += 1;
          }
        }
      };
      
      
      var vm = new Vue({
        el: "#app",
        components:{
          'btn-success': btnCountAdd
        }
      })
      
    </script>

在上面的代码中首先声明了一个变量 btnCountAdd,并为它指定了 template、data、methods 选项,然后在 new Vue 中通过 components 选项来注册了一个 btn-success 组件使其指向 btnCountAdd,这样就完成了一个组件的局部注册

这似乎和全局注册组件没有很好的区分,这是因为,在实际项目中我们一般不这样用,一般是通过模块化的方式来引入组件,我们来模拟一下真实环境!

// 项目结构

├── index.html
├── btn-count-add.js
└── main.js
// index.html

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

 <div id="app">
    <btn-count-add></btn-count-add> 
    <btn-count-add></btn-count-add> 
    <btn-count-add></btn-count-add> 
    <btn-count-add></btn-count-add> 
  </div>
// 这里通过 ES6 module的方式导入模块,type类型必须设置为module
<script src="./main.js" type="module"></script>
// main.js

import { btnCountAdd } from './btn-count-add.js'
var vm = new Vue({
    el: '#app',
    components: {
        'btn-count-add': btnCountAdd
    }
});
// btn-count-add.js

 var btnCountAdd = {
    template: '<div><span>当前count的值:{{count}}</span><button @click="onCountAddClick">count++</button></div>',
    data: function () {
        return {
            count: 0
        }
    },
    methods: {
        onCountAddClick: function () {
            this.count += 1;
        }
    }
};

// ES6的导出语法,将其导出
export { btnCountAdd };

我们把 btnCountAdd 抽象进btn-count-add.js文件中,并通过es6的导出语法将其导出,这就形成了一个单独的模块,当需要使用 btnCountAdd 的时候,便可以通过 import { btnCountAdd } from './btn-count-add.js' 来引入 btnCountAdd,并通过 components 选项来把它注册到 Vue 中。

这种引入方式在真实的项目环境中会经常使用,特别是当我们使用一些大搞工具(如:webpack, gulp)的时候,这种情况尤其普遍。

当使用局部注册的方式来注册组件的时候,虽然这种方式可以方便对项目进行模块化,并且有利于对打包的结果进行优化,但是同样会有一个小的问题——那就是每使用一个组件都需要通过 import 来把它进行引用。

当组件过多的时候,这不免是一个很麻烦的事情。为此 Vue 提供了一个更为便利的方式用于自动全局注册,当我们使用 Webpack+Vue-CLI 来构建项目的时候,可以在 main.js 中 new Vue 之前这样做:

// 需要 npm import --save lodash
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase'

const requireComponent = require.context(
  // 其组件目录的相对路径
  './components',
  // 是否查询其子目录
  false,
  // 匹配基础组件文件名的正则表达式,获取.vue结尾的文件
  /.vue$/
)


requireComponent.keys().forEach(fileName => {
  // 获取组件配置
  const componentConfig = requireComponent(fileName)

  // 获取组件的 PascalCase 命名
  const componentName = upperFirst(
    camelCase(
      // 剥去文件名开头的 `./` 和结尾的扩展名
      fileName.replace(/^\.\/(.*)\.\w+$/, '$1')
    )
  )

  // 全局注册组件
  Vue.component(
    componentName,
    // 如果这个组件选项是通过 `export default` 导出的,
    // 那么就会优先使用 `.default`,
    // 否则回退到使用模块的根。
    componentConfig.default || componentConfig
  )
});

比如 BtnSuccess.vue 则可以直接通过 <btn-success></btn-success> 来直接使用,并且未被使用到的组件并不会打包到构建结果之中。

下一节:组件之间的传参! 欢迎大家关注,一起学习探讨交流!

感谢您的阅读,如果对您有帮助,欢迎关注"CRMEB"。码云上有我们开源的商城项目,知识付费项目,JAVA版全开源商城系统,学习研究欢迎使用,老铁顺手点个star呗,老板奖励五毛,分你两毛五,关注我们保持联系!

相关推荐

基于Python查找图像中最常见的颜色

如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决很多实际问题。例如在农业领域中想确定水果的成熟度,我们可以通过检查水果的颜色是否落在特定范围内,来判断它们是否已经成熟。接下来我们将使...

出大要几次/圣彼得堡悖论

程序:fromrandomimportrandomdeffn():n=1whilerandom()<0.5:n+=1returnny=[fn()...

使用OpenCV测量图像中物体之间的距离

原文链接:https://www.pyimagesearch.com/2016/04/04/measuring-distance-between-objects-in-an-image-with-op...

让颜色更加饱满和有冲击力:图像颜色校正

大家拍照或图片时,获取会遇到图像颜色与实际颜色存在色差的现象。我们看一个标准色卡的图片:第一张图片就是有色差的图片,这种现象一般是相机或光线的原因造成的,我们可以通过标准色卡进行校正。第一张图片是有色...

Python 数据分析 : 实例

1、构建矩阵生成4x4形式的矩阵,矩阵中的数据是1~10之间的随机数random_list=np.random.random(16)random_list=np.round(...

用这些免费开源的图标库,为你的项目画龙点睛

精致好看的图标能够为你的项目增色不少,今天我就整理了一期图标库精选系列,希望你可以从中找到自己喜欢的图标库。下面就跟我来一场视觉的盛宴,我会一一介绍GitHub上品牌、流行、极小,各具特色的免费精...

ICON设计规范之图标尺寸

编辑导语:图标设计是UI设计中不可缺少的元素,它看似简单,但其实内含门道。本篇文章里,作者就对icon设计的相关知识和icon绘制方法做出经验介绍。如果你对icon设计也想要有所了解的话,那就点进来看...

PHP开发必备VSCode插件(大全)

通用chinese(simplified...):简体中文语言包liveserverhtml:实时预览prettier-codeformatter:最流行的代码格式化插件...

增强用户体验:前端开发中HTML5和CSS3表格属性的应用与优化研究

摘要:本文探讨了在前端开发中HTML5和CSS3表格属性的应用与优化。首先介绍了HTML5中常用的表格元素和CSS3中丰富的表格样式属性,旨在帮助开发人员定制表格的外观和样式。其次,研究了表格结构的优...

产品经理小技术:图片素材随手找,原型设计快又好

数十万互联网从业者的共同关注!作者:牛冰峰博客:http://uxfeng.com/画图——这项古老而精细的做法,是一代代产品狗们得以传承的立足之本。草图、线框图、思维导图、PPT插图、数据汇报图表、...

MAUI Blazor 项目实战 - 从0到1轻松构建多平台应用UI

前言最近在项目中尝鲜了MAUI,总体感受下来还是挺不错的,优缺点并存,但是瑕不掩瑜,目前随着.Net版本的迭代升级对它的支持也越来越友好,相信未来可期!感兴趣的朋友欢迎关注。文章中如有不妥的地方,也请...

webstorm常用的插件

1、AtomMaterialIcons推荐原因:这款插件不仅...

「智能家居」自动化平台nodered第三方节点dashboard的使用

自带节点库讲完了,开始说说第三方节点库dashboard,该库提供另一个可配置的UI页面,可以配置一些表单元素,以及图表。先来看一下别人使用dashboard制作的面板吧,是不是很漂亮。接下来我们一...

「炫丽」从0开始做一个WPF+Blazor对话小程序

大家好,我是沙漠尽头的狼。...

MAUI使用Masa blazor组件库

上一篇(点击阅读)我们实现了UI在Web端(BlazorServer/Wasm)和客户端(Windows/macOS/Android/iOS)共享,这篇我加上MasaBlazor组件库的引用,并...

取消回复欢迎 发表评论: