Vuejs第八篇之Vuejs组件的定义实例解析


Posted in Javascript onSeptember 05, 2016

本文参考官方文档整理的一篇更加细致代码更加安全的一篇适合新手阅读学习吧教程。

本篇资料来于官方文档:

http://cn.vuejs.org/guide/components.html

什么是组件?

组件(Component)是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。

组件的定义

①组件的作用:

【1】扩展HTML元素,封装可重用的代码;

【2】组件是自定义元素,Vuejs的编译器可以为其添加特殊的功能;

【3】某些情况下,组件可以是原生HTML元素的形式,以is的方式扩展。

②写一个标准的组件:

分为以下几步:

【1】挂载组件的地方,需要是Vue实例所渲染的html元素,具体来说,比如上面的<div id=”app”></div>这样的html元素及他的子节点;

【2】定义一个组件,用

var 变量名 = Vue.extend({template:”这里是html的模板内容”})
这样的形式创建,例如:

//定义一个组件 
var btn = Vue.extend({ 
template: "<button>这是一个按钮</button>" 
})

【3】将定义的组件注册到Vue实例上,这会让指定标签,被组件的内容所替代。

如代码:

//注册他到Vue实例上 
Vue.component("add-button", btn);

具体而言,每一个以下这样的标签(在Vue的根实例范围内的)

<add-button></add-button>

会被

<button>这是一个按钮</button>

所替代。

【4】以上方法是全局注册(每个Vue实例的add-button标签都会被我们定义的所替代);
解决办法是局部注册。

如代码:(这是是设置了template属性,也可以在没有这个属性的时候,在<div id=”app”></div>标签内放置<add-button></add-button>标签

<div id="app"> 
</div> 
<script> 
//定义一个组件 
var btn = Vue.extend({ 
template: "<button>这是一个按钮</button>" 
}) 

Vue.component("add-button", btn); 

//创建根实例,也就是说让Vue对这个根生效 
var vm = new Vue({ 
el: '#app', 
template: "<add-button></add-button>" 
}); 
</script>

③局部注册组件:

简单来说,只对这一个Vue实例生效,具体做法是,在注册那一步,跳过;

然后在声明Vue实例的时候,将添加到components这个属性中(他是一个对象,以KV形式放置)(注意,这个单词多一个s)

如代码:

<div id="app"> 
</div> 
<script> 
//定义一个组件 
var btn = Vue.extend({ 
template: "<button>这是一个按钮</button>" 
}) 
//创建根实例,也就是说让Vue对这个根生效 
var vm = new Vue({ 
el: '#app', 
template: "<add-button></add-button>", 
components: { 
"add-button": btn 
} 
}); 
</script>

注:

根据官方教程,这种方法(指局部注册),也适用于其他资源,比如指令、过滤器和过渡。

④步骤简化:

【1】定义组件和注册组件结合起来一步完成:

//定义一个组件 
Vue.component("add-button", { 
template: "<button>这是一个按钮</button>" 
});

【2】局部注册时,定义和注册一步完成:

//创建根实例,也就是说让Vue对这个根生效 
var vm = new Vue({ 
el: '#app', 
template: "<add-button></add-button>", 
components: { 
"add-button": { 
template: "<button>这是一个按钮</button>" 
} 
} 
});

⑤data属性

直接给组件添加data属性是不可以的(无效);

原因在于,假如这么干,那么组件的data属性有可能是一个对象,而这个对象也有可能是外部传入的(例如先声明一个对象,然后这个对象作为data的值),可能导致这个组件的所有副本,都共享一个对象(那个外部传入的),这显然是不对的。

因此,data属性应该是一个函数,然后有一个返回值,这个返回值作为data属性的值。

且这个返回值应该是一个全新的对象(即深度复制的,避免多个组件共享一个对象);

如代码:

var vm = new Vue({ 
el: '#app', 
template: "<add-button></add-button>", 
components: { 
"add-button": { 
template: "<button>这是一个按钮{{btn}}</button>", 
data: function () { 
return {btn: "123"}; 
} 
} 
} 
});

另外,假如这样的话,btn的值是一样的(因为他们实际上还是共享了一个对象)

<div id="app"> 
</div> 
<div id="app2"> 
</div> 
<script> 
var obj = {btn: "123"}; 
var vm = new Vue({ 
el: '#app', 
template: "<add-button></add-button>", 
components: { 
"add-button": { 
template: "<button>这是一个按钮{{btn}}</button>", 
data: function () { 
return obj; 
} 
} 
} 
}); 
obj.btn = "456"; 
var vm2 = new Vue({ 
el: '#app2', 
template: "<add-button></add-button>", 
components: { 
"add-button": { 
template: "<button>这是一个按钮{{btn}}</button>", 
data: function () { 
return obj; 
} 
} 
} 
}); 
</script>

注:

el属性用在Vue.extend()中时,也须是一个函数。

⑥is特性:

【1】按照官方教程,一些HTML元素对什么元素可以放在它之中是有限制的;

但实际我自己测试没发现问题,所以不明白。

【2】给个URL吧,如果真出问题了我再回头研究。

http://cn.vuejs.org/guide/components.html#u6A21_u677F_u89E3_u6790

以上所述是小编给大家介绍的Vuejs第八篇之Vuejs组件的定义实例解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS实现判断滚动条滚到页面底部并执行事件的方法
Dec 18 Javascript
jQuery调取jSon数据并展示的方法
Jan 29 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
Jun 10 Javascript
js脚本分页代码分享(7种样式)
Aug 19 Javascript
JQuery ztree 异步加载实例讲解
Feb 25 Javascript
AngularJS ng-style中使用filter
Sep 21 Javascript
js获取元素下的第一级子元素的方法(推荐)
Mar 05 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 Javascript
详谈DOM简介及节点、属性、查找节点的方法
Nov 16 Javascript
js生成word中图片处理方法
Jan 06 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
Feb 02 Javascript
vue动画打包后失效问题的解决方法
Sep 18 Javascript
详细谈谈AngularJS的子级作用域问题
Sep 05 #Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
Sep 05 #Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
Sep 05 #Javascript
JS简单随机数生成方法
Sep 05 #Javascript
使用React实现轮播效果组件示例代码
Sep 05 #Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
Sep 05 #Javascript
Bootstrap的fileinput插件实现多文件上传的方法
Sep 05 #Javascript
You might like
thinkphp中的url跳转用法分析
2016/07/12 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
Javascript实现运算符重载详解
2018/04/07 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
JS实现简易计算器
2020/02/14 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
Python中处理unchecked未捕获异常实例
2015/01/17 Python
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
使用Python实现简单的服务器功能
2017/08/25 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python递归函数实例讲解
2019/02/27 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
2020/06/18 Python
python中的时区问题
2021/01/14 Python
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
自习课吵闹检讨书范文
2014/09/26 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
Redis Stream类型的使用详解
2021/11/11 Redis