解读Vue组件注册方式


Posted in Vue.js onMay 15, 2021

概述

组件化的概念让前端页面开发有了更清晰的结构。

Vue 中的组件就是一个 Vue 的实例对象。因此,Vue 组件的构造选项和 new Vue() 方法构造 Vue 实例的构造选项是一样的,其可接收的构造选项都是一样的。除了 el 这样 根实例 特有的选项。但是,Vue 组件必须得是可以复用的,因此,就必须要求构造选项中的 data 选项必须是一个函数,该函数返回一个对象。

为什么 data 选项是个返回对象的函数就可以保证组件的可复用性呢?

因为无论是 new Vue() 的方式还是定义 Vue组件 的方式创建一个 Vue 实例,其执行的操作都是将构造选项中的各属性值直接赋值给新创建的 Vue 实例对象。组件复用就是 Vue 使用 相同的构造选项 构造出多个同名不同地址的 Vue 实例对象。如果 Vue 组件定义时的构造选项中的 data 选项是一个对象,那么在组件复用时,多个组件就会共用一个 data 数据对象,因为是直接将 data 对象的地址赋值给组件的 Vue 实例的。但如果组件定义时的 data 选项是一个函数的话,那么 Vue 根据构造选项创建组件时会执行该函数从而得到一个对象。这样一来,每次创建 Vue 实例时的 data 对象都是重新生成的,因此,多个组件都有各自的 data 数据对象,不会相互影响。

实际上,在组件注册时是在定义组件的构造选项,在组件使用时才真正创建对应的 Vue 组件实例。

1 、全局注册

全局注册的组件可以在 Vue 根实例和所有的子组件中使用。注册入口为Vue.component()函数,一次注册,随时使用,注册方式如下:

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

示例如下:

//main.js
//此示例是在 vue-cli 创建的项目,默认是非完整版vue,无法用 template 选项,因此使用 render 函数写组件内容。
Vue.component('all-test',{
  data(){
    return {
      x: '我是全局组件'
    }
  },
  render(h){
    return h('div',this.x)
  }
})

//全局注册的组件直接使用即可
//App.vue
<template>
  <div id="app">
    <all-test />
  </div>
</template>

2 、局部注册

局部注册是通过一个普通的 JavaScript 对象来定义组件。然后组件的命名和注册入口是在 Vue实例 构造选项中的 components 选项。

let component = { options }

//new Vue 创建的根元素 Vue 实例
new Vue({
    el: '#app'
    components: {
        'my-component-name': component
    }
})

//或注册 Vue组件 创建的 Vue 实例
export default {
    components: {
        'my-component-name': component
    }
}

示例如下:

//App.vue
<template>
  <div id="app">
    <all-test />
    <component-a />
    <component-b />
  </div>
</template>

<script>
let ComponentA = {
  data(){
    return {
      x: '我是局部组件 A'
    }
  },
  render(h){
    return h('div',this.x)
  }
}

export default {
  name: 'App',
  components: {
    'component-a': ComponentA,
    'component-b': {
        data(){
          return {
            x: '我是局部组件 B'
          }
        },
        render(h){
          return h('div',this.x)
        }
    } 
  }
}
</script>

3 、模块系统中局部注册

在使用了诸如 Babel 和 webpack 的模块系统中可以使用 import 和 export 的方式单独导入组件的构造选项对象 或者 导入对应构造选项的 *.vue 文件。

//c.js
export default {
    data(){
        return {
          x: '我是 c.js 文件单独导出的组件构造选项对象'
        }
      },
      render(h){
        return h('div',this.x)
      }
}

//D.vue
<template>
    <div>
        {{x}}
    </div>
</template>

<script>
export default {
    data(){
        return {
            x: '我是 D.vue 文件导出的组件'
        }
    }
}
</script>

//App.vue
<template>
  <div id="app">
    <C />
    <D />
  </div>
</template>

import C from './c.js'
import D from './components/D.vue'

export default {
  name: 'App',
  components: {
    C,
    D 
  }
}
</script>

以上就是解读Vue组件注册方式的详细内容,更多关于Vue组件注册方式的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
VUE实现吸底按钮
Mar 04 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
Vue详细的入门笔记
May 10 Vue.js
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
Vue中使用import进行路由懒加载的原理分析
Apr 01 Vue.js
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
Vue OpenLayer 为地图绘制风场效果
Apr 24 Vue.js
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
Apr 30 Vue.js
如何理解Vue简单状态管理之store模式
May 15 #Vue.js
Vue如何实现组件间通信
May 15 #Vue.js
详解Vue的sync修饰符
May 15 #Vue.js
深入理解Vue的数据响应式
May 15 #Vue.js
详解Vue的options
May 15 #Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 #Vue.js
Vue接口封装的完整步骤记录
You might like
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
Dom与浏览器兼容性说明
2010/10/25 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
Python实现网站注册验证码生成类
2017/06/08 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
Python封装原理与实现方法详解
2018/08/28 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
浅析python中的del用法
2020/09/02 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
工商企业管理实习自我鉴定
2013/12/04 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
市级文明单位申报材料
2014/05/07 职场文书
教书育人演讲稿
2014/09/11 职场文书
运动会加油稿100字
2014/09/19 职场文书
助学贷款贫困证明
2014/09/23 职场文书
经典祝酒词大全
2015/08/12 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书