一、组件名

自定义组件的名称强烈推荐遵循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. Django之kindeditor

    1.什么是kindeditor? KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果,兼容IE.Firefox.Chrome.Safari.Opera等 ...

  2. JWT机制了解

    JWT简介 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象安 ...

  3. Java多线程学习(七)并发编程中一些问题

    本节思维导图: 关注微信公众号:"Java面试通关手册" 回复"Java多线程"获取思维导图源文件和思维导图软件. 多线程就一定好吗?快吗?? 并发编程的目的就 ...

  4. Linux内核中实现生产者与消费者(避免无效唤醒)【转】

    转自:http://blog.csdn.net/crazycoder8848/article/details/42581399 本文关注的重点是,避免内核线程的无效唤醒,并且主要是关注消费者线程的设计 ...

  5. SwitchSharp代理插件的安装和使用

    参考链接: http://bbs.feng.com/read-htm-tid-8227283.html 安装参考链接: http://jingyan.baidu.com/article/380abd0 ...

  6. ioctl socket getsockopt

    一 ioctl 函数产生原因: 虽然在文件操作结构体"struct file_operations"中有很多对应的设备操作函数,但是有些命令是实在找不到对应的操作函数.如CD-RO ...

  7. POJ 2186 Popular cows(Kosaraju+强联通分量模板)

    题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为 ...

  8. C语言获取输入,按单词输出

    #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { int num; printf ...

  9. AC日记——825G - Tree Queries

    825G - Tree Queries 思路: 神题,路径拆成半链: 代码: #include <cstdio> #include <cstring> #include < ...

  10. vue引入自己写的js文件

    话不多说,直接上代码呀~ 先来个结构图: 中规中矩的vue-cli就写了一个自己的js文件 那么我想要引入到vue组件里. 1.首先写我的js文件 2.引入到vue组件!!!一定要用{}把方法名拿过来 ...