一、组件名

自定义组件的名称强烈推荐遵循W3C规范中的方式:字母全小写且必须包含一个连字符。

二、全局注册和局部注册的区别

  • 全局注册

    Vue.component进行注册。全局注册的可以在任何创建的实例中引用。全局注册往往是不够理想的,比如你使用webpack这样的构建系统,全局注册所有的组件意味着即便你不再使用一个组件了,

    它仍然会被包含在你最终的构建结果中。这就造成用户的下载JavaScript无谓的增加。
  • 局部注册

    局部注册可以通过一个普通的对象来定义。
var componentA = {};
var componentB = {};
var componentC = {}; new Vue({
el: '#app',
components:{
'component-a': componentA,
'component-b': componentB
}
//components对象中的‘component-a’是自定义元素的名字,‘component-b’是这个组件的选项对象。
})

注意:局部注册的组件在其子组件中不可用,如果希望能用,则要这样做:

var componentA = {};
var componentB = new Vue({
el: "#aa",
components:{
'component-a':'componentA'
}
})

三、可以通过webpack等工具来实现组件的注册

  • 在模块系统中可以通过import和export实现局部注册

    如果你使用了Babel和webpack这样的模块系统,那么可以建立一个components目录, 并将每个组件放置在其各自的文件中

    你在局部注册之前,需要导入每个你想使用的组件。
import ComponentA from './ComponentA';
import ComponentC from './ComponnetC'; export default {
components: {
componentA,
componentC
}
}
//现在componentA和componentC都可以在这个组件中使用了。
  • 基础组件的自动化全局注册

    有一些组件可能只包含一个按钮或者输入框,这种称为基础组件,想要一次性局部引用这些组件显得有点繁琐。所以可以在main.js入口文件中,可以进行自动化全局注册。
import Vue from 'vue'
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase' const requireComponent = require.context(
// 其组件目录的相对路径
'./components',
// 是否查询其子目录
false,
// 匹配基础组件文件名的正则表达式
/Base[A-Z]\w+\.(vue|js)$/
) 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
)
})

四、Prop的类型

一般我们在使用prop的时候,就是在注册组件的时候设置prop,prop通常的类型是字符串数组。

prop: ['dd','fffe','age']

但是通常自己希望每个prop都有指定的值类型。你可以以对象形式列出prop,对应的是prop各自的名称和值。

props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object
}

这样如果在遇到错误的类型时,浏览器会在控制台打印出错误。prop可以传递字符串、数字、布尔值、数组、对象、一个对象的所有属性

五、Prop验证

为了定制prop的验证方式,你可以为props中的值提供一个带有验证需求的对象,而不是一个字符串数组。

Vue.component('my-component',{
props:{
//基础类型检查 (null 匹配任何类型)
propA: Number,
//多个可能的类型
propB: [String,Number],
//必填的字符串
propC: {
type: String,
require:true
},
//默认的数字
propD: {
type: Number,
default: 100
},
//带有默认值的对象
propE: {
type:Object,
default:function(){
//对象或数组默认值必须从一个工厂函数获取
return {
message:'hello'
}
}
},
//自定义验证函数
propF:{
validator: function (value){
//这个值必须匹配下列字符串中的一个
return ["success,warning,danger"].indexOf(value) !== -1;
}
}
}
})

这些prop验证都是在新实例创建之前,所以实例的属性在default或validator函数中是不可用的。

六、禁用特性继承

如果你不希望子组件的分元素继承特性,可以在组件的选项中设置inheritAttrs: false.

Vue.component('base-input', {
inheritAttrs: false,
props: ['label', 'value'],
template: `
<label>
{{ label }}
<input
v-bind="$attrs"
v-bind:value="value"
v-on:input="$emit('input', $event.target.value)"
>
</label>
`
}) <base-input
v-model="username"
class="username-input"
placeholder="Enter your username"
></base-input>

Vue组件深入了解(组件注册和Prop)的更多相关文章

  1. Vue.js 组件的三个 API:prop、event、slot

    组件的构成 一个再复杂的组件,都是由三部分组成的:prop.event.slot,它们构成了 Vue.js 组件的 API.如果你开发的是一个通用组件,那一定要事先设计好这三部分,因为组件一旦发布,后 ...

  2. Vue组件的定义、注册和调用

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>组 ...

  3. Vue.js 2.x:组件的定义和注册(详细的图文教程)

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 前言 什么是组件 组件: 组件的出现,就是为了拆分Vue实例的代码量的, ...

  4. Vue和React之间关于注册组件和组件间传值的区别

    注册组件 Vue中:1.引入组件:2.在components中注册组件:3.使用组件; React中:1.引入组件:2.使用组件; 子父传值 Vue中: 父组件向子组件传值: 1.在父组件中绑定值:2 ...

  5. VUE注册全局组件和局部组件

    全局组件 第一步:在components文件夹下建立一个子文件Users.vue <template> <div class="users"> {{msg} ...

  6. Vue(12)组件的组织结构和组件注册

    组件的组织 通常一个应用会以一棵嵌套的组件树的形式来组织: 例如,你可能会有页头.侧边栏.内容区等组件,每个组件又包含了其它的像导航链接.博文之类的组件. 为了能在模板中使用,这些组件必须先注册以便 ...

  7. Vue.js——60分钟组件快速入门(上篇)

    组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树: 那么什么是组件呢?组件可以扩展HTML ...

  8. Vue.js——60分钟组件快速入门(下篇)

    概述 上一篇我们重点介绍了组件的创建.注册和使用,熟练这几个步骤将有助于深入组件的开发.另外,在子组件中定义props,可以让父组件的数据传递下来,这就好比子组件告诉父组件:"嘿,老哥,我开 ...

  9. 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo

    前言 前端已经过了单兵作战的时代了,现在一个稍微复杂一点的项目都需要几个人协同开发,一个战略级别的APP的话分工会更细,比如携程: 携程app = 机票频道 + 酒店频道 + 旅游频道 + ..... ...

随机推荐

  1. 41、用Python实现一个二分查找的函数

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] def binary_search(dataset ...

  2. Python3中的SocketServer

    socket并不能多并发,只能支持一个用户,socketserver 简化了编写网络服务程序的任务,socketserver是socket的在封装.socketserver在python2中为Sock ...

  3. 【Python学习】request库

    Requests库(https://www.python-requests.org/)是一个擅长处理那些复杂的HTTP请求.cookie.header(响应头和请求头)等内容的Python第三方库. ...

  4. React 16 源码瞎几把解读 【三 点 二】 react中的fiberRoot

    〇.先来看看常用的常量 NoWork = 0 noTimeout = undefined HostRoot = 3 NoContext = 0b000; AsyncMode = 0b001; Stri ...

  5. 做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table【转】

    做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table 浓缩版: 使用replicate_do_db和replicate_i ...

  6. 142.Linked List Cycle II---双指针

    题目链接 题目大意:141题目的扩展,给出单链表,判断是否有环,如果有环,找出环的开始的结点,如果没有环,返回null. 法一(借鉴):在已经找出单链表环的基础上再找开始结点,要时刻记住这个环不一定是 ...

  7. 大数据系列之Flume+kafka 整合

    相关文章: 大数据系列之Kafka安装 大数据系列之Flume--几种不同的Sources 大数据系列之Flume+HDFS 关于Flume 的 一些核心概念: 组件名称     功能介绍 Agent ...

  8. Apache虚拟主机配置(多个域名访问多个目录)(转)

    Apache虚拟主机配置(多个域名访问多个目录) 为了方便管理虚拟主机,我决定使用一种方法,那就是修改httpd-vhosts.conf文件. 第一步首先要使扩展文件httpd-vhosts.conf ...

  9. 如何在Linux启动的时候执行一个命令

    在Linux启动起来时,执行一个命令的设置方法== 例如:需要执行的命令是cvslockd ============第一种方式:根据运行级别配置======================== 第一步 ...

  10. Nginx-1.6.3源码安装、虚拟主机

    源码安装nginx cat /etc/redhat-release uname -rm yum install pcre-devel openssl-devel -y rpm -qa pcre pcr ...