vue组件讲解(is属性的用法)
什么是组件?
在说之前我们先搞清楚什么是组件?这样对我们下边的学习是很有帮助的。
组件(Component)是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可以重复使用的代码。在较高层次上,组件就是自定义元素,Vue.js的编辑器为它添加特殊功能。在有些情况下,组件也可以是原生元素的形式,以is特性进行扩展。
怎么使用组件?
说道这里,组件是什么,我们都有了清楚的了解,但是怎么使用呢?
首先,我们要进行注册,才能进行使用
注册
之前我们也说过,可以通过new来创建一个VUE实例
new Vue ({
'el' : '#element',
//选项
})
- 1
- 2
- 3
- 4
这样,一个vue实例我们就创建成功了,这时候就要注册一个组件,我们可以通过Vue.component(tagName,options)。由于作用域的不同,组件也是分为全局组件和局部组件的,我们先来说全局组件。
Vue.component('my-component',{
//选项
})
- 1
- 2
- 3
一个全局组件就这样组册成功了,此后便可以在父实例的模块中以自定义元素<my-component></my-component>的形式进行使用。一定切记,要确保在初始化根实例之前注册了组件:
<div id='app'>
<my-component></my-component>
</div>
- 1
- 2
- 3
//注册组件
Vue.component('my-component',{
'template' : '<div>一个全局组件</div>'
})
//创建根实例
new Vue({
'el' : '#app',
})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
以上渲染出来就是:
<div id='app'>
<div>一个全局组件</div>
</div>
- 1
- 2
- 3
局部注册
在开发中,我们不必在全局注册每个组件。通过使用组件实例选项注册,可以使组件仅在另一个实例/组件的作用域可用,代码如下:
var Child = {
'template' : '<div>一个组件</div>'
}
new Vue({
'el' : '#app',
//...
'component' : {
'my-component' : Child
//此时该模板只能在父实例中使用
}
})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这种封装方式也可适用于其他可注册的Vue功能。如指令
DOM模板解析说明
当使用DOM作为模板时(例如,将el选项挂载到一个已知的元素上),你会受到HTML的一些限制,因为Vue只有在浏览器解析和标准化HTML后才能获取模板内容。尤其像这些元素<ul>,<ol>,<table>,<select>限制了能被它保过的元素,而一些像option这样的元素只能出现在某些其他元素的内部。
在自定义组件中使用这些受限制的元素时会导致一些问题,例如:
<table>
<my-row>...</my-row>
</table>
- 1
- 2
- 3
自定义组件<my-row>被认为是无效的内容,因此在渲染的时候会出现导致错误。变通的方案是使用特殊的is属性:
<table>
<tr is='my-row'>...</tr>
</table>
- 1
- 2
- 3
应当注意,如果我们使用下面来源之一的字符串模板,这些限制将不适用:
<script type='text/x-template'>- JavaScript内联模板字符串
.Vue组件
因此,有必要的话请使用字符串模板
data必须是函数
通过Vue构造器传入的各种选项大多数都可以在组件里使用。data是个例外,它必须是函数。实际上,如果我们这样做:
Vue.component('my-component',{
'template' : '<span>{{message}}</span>',
'data' : {
'message' : 'hello'
}
})
- 1
- 2
- 3
- 4
- 5
- 6
那么Vue会停止,并在控制台发出警告,告诉你在组件中data必须是函数。理解这种规则存在的意义很有帮助,让我们假设用如下方式来避开Vue的警告:
<div id='app'>
<simple-counter></simple-counter>
<simple-counter></simple-counter>
<simple-counter></simple-counter>
</div>
- 1
- 2
- 3
- 4
- 5
var data = {counter : 0}
Vue.component('simple-counter',{
'template' : '<button v-on:click='counter += 1'>{{counter}}</button>'
//技术上data是一个函数,所以Vue不会警告
//但是我们返回给每个组件的实例调用了同一个data对象
'data' : function (){
return data
}
})
new Vue({
'el' : '#app'
})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
由于这三个组件共享一个data,因此增加一个counter会影响所有组件!很明显,这样做是不对的。我们可以通过为每个组件返回全新的data对象来解决这个问题,如下:
data : function (){
return {
counter : 0
}
}
- 1
- 2
- 3
- 4
- 5
现在每个counter都有它自己内部的状态了。
构成组件
组件意味着协同工作,通常父子组件会是这样的关系:组件A在它的模板中使用了组件B。它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件。然而,在一个良好定义的接口中尽可能将父子组件解耦是很重要的。这保证了每个组件可以在相对隔离的环境中书写和理解,也大幅度提高了组件的可维护性和可重用性。
在Vue中,父子组件的关系可以总结为 props down, events up。父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。看看它们是怎么工作的。如图:
vue组件讲解(is属性的用法)的更多相关文章
- vue组件的配置属性
vue组件的声明语法: Vue.component('component-name',{ template:'<p>段落{{prop1}} {{prop2}}</p>', da ...
- vue组件的inheritAttrs属性
vue官网对于inheritAttrs的属性解释:如果你不希望组件的根元素继承特性,你可以在组件的选项中设置 inheritAttrs: false. 可能不是很好理解,我们可以举个例子来验证一下. ...
- vue组件使用name属性来生成递归组件
先来个简单的数据 1 lists = [{ 2 id: 1, 3 title: '第一层', 4 children: [{ 5 id: 3, 6 title: '第二层', 7 children: [ ...
- vue之store中属性更新用法
//1.首先定义store对象下的属性 state: { data:'测试数据' } // 2.定义更改data数据的方法 mutations: { updatedata(state, p) { st ...
- vue组件的watch属性
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- vue第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件)
第六单元(vue的实例和组件-vue实例的相关属性和方法-解释vue的原理-创建vue的组件) #课程目标 掌握vue实例的相关属性和方法的含义和使用 了解vue的数据响应原理 熟悉创建组件,了解全局 ...
- Vue组件-组件的属性
在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 比如,子组件需 ...
- 深入理解Vue父子组件通讯的属性和事件
在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 父子组件之间的 ...
- vue组件之属性Props
组件的属性和事件 父子组件之间的通信 父子组件之间的通信就是 props down,events up,父组件通过 属性props向下传递数据给子组件,子组件通过 事件events 给父组件发送消息. ...
随机推荐
- Hall定理
Hall定理 Tags:图论 zybl 二分图\(G=<V1,V2,E>\)中,\(|V1|<|V2|\),当且仅当\(V1\)中任意\(k(=1,2,3..|V1|)\)个顶点都与 ...
- 一维码UPC E简介及其解码实现(zxing-cpp)
UPC(Universal Product Code)码是最早大规模应用的条码,其特性是一种长度固定.连续性的条 码,目前主要在美国和加拿大使用,由于其应用范围广泛,故又被称万用条码. UPC码仅可 ...
- Kubernetes学习之路(六)之创建K8S应用
一.Deployment的概念 K8S本身并不提供网络的功能,所以需要借助第三方网络插件进行部署K8S中的网络,以打通各个节点中容器的互通. POD,是K8S中的一个逻辑概念,K8S管理的是POD,一 ...
- Openstack入门篇(十五)之如何创建生产使用的openstack镜像
在linux-node1节点上: [root@linux-node1 ~]# yum install -y openstack-nova-compute [root@linux-node1 ~]# y ...
- 最新版CocoaPods的安装和使用以及版本升级遇到的问题
CocoaPods的下载及安装 mac系统已经默认安装好Ruby环境,如果你不确定自己系统中是否有Ruby的,可以在终端中输入命令行:ruby -v查看当前ruby版本.如图: 确定以后,接下来就可 ...
- IVF link error错误不显示的问题
遇到一个奇怪的问题,IVF编译链接时显示error LINK: 后面没有具体的错误信息(见后图,我的窗口后面是空的)环境:windows 10 64位系统,VS2017 commutity 版本, ...
- Android Studio 导入别人项目时候遇见的问题“Gradle DSL method not found: 'compile()'”
Gradle DSL method not found: 'compile() 遇见这个问题截图: 解决: 在项目的根目录的build.gradle文件中是不是用了compile方法 如果有的话,剪切 ...
- hover时显示可跟随鼠标移动的浮动框,运用函数节流与去抖进行优化
在很多笔试面试题中总能看到js函数去抖和函数节流,看过很多关于这两者的讨论,最近终于在一个需求中使用了函数去抖(debounce)和函数节流(throttle). 需要完成的效果是,鼠标在表格的单元格 ...
- php从入门到放弃系列-01.php环境的搭建
php从入门到放弃系列-01.php环境的搭建 一.为什么要学习php 1.php语言适用于中小型网站的快速开发: 2.并且有非常成熟的开源框架,例如yii,thinkphp等: 3.几乎全部的CMS ...
- vi/vim命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/mondol/p/vi-examples.html 进入vi vi filename # 打开或新建文件,并将光标置于第 ...