Vuejs第十三篇之组件——杂项


Posted in Javascript onSeptember 09, 2016

什么是组件?

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

本篇资料是小编参考官方文档的基础上整理的一篇更加细致的说明,代码更多更全,非常适合新手学习。

官方文档:

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

组件——杂项详细介绍如下所示:

①组件和v-for

简单来说,就是组件被多次复用;

例如表格里的某一行,又例如电商的商品橱窗展示(单个橱窗),都可以成为可以被复用的组件;

只要编写其中一个作为组件,然后使数据来源成为一个数组(或对象,但个人觉得最好是数组),通过v-for的遍历,组件的每个实例,都可以获取这个数组中的一项,从而生成全部的组件。

而数据传输,由于复用,所以需要使用props,将遍历结果i,和props绑定的数据绑定起来,绑定方法同普通的形式,在模板中绑定。

示例代码:

<div id="app"> 
<button @click="toknowchildren">点击让子组件显示</button> 
<table> 
<tr> 
<td>索引</td> 
<td>ID</td> 
<td>说明</td> 
</tr> 
<tr is="the-tr" v-for="i in items" v-bind:id="i" :index="$index"></tr> 
</table> 
</div> 
<script> 
var vm = new Vue({ 
el: '#app', 
data: { 
items: [1, 2, 3, 4] 
}, 
methods: { 
toknowchildren: function () { //切换组件显示 
console.log(this.$children); 
} 
}, 
components: { 
theTr: { //第一个子组件 
template: "<tr>" + 
"<td>{{index}}</td>" + 
"<td>{{id}}</td>" + 
"<td>这里是子组件</td>" + 
"</tr>", 
props: ['id','index'] 
} 
} 
}); 
</script>

说明:

【1】记得将要传递的数据放在props里!

【2】将index和索引$index绑定起来,因为索引从0开始,因此索引所在列是从0开始;id是和遍历items的i绑定在一起的,因此id从1开始。

【3】可以在父组件中,通过this.$children来获取子组件(但是比较麻烦,特别是组件多的时候,比较难定位);

②编写可复用的组件:

简单来说,一次性组件(只用在这里,不会被复用的)跟其他组件紧密耦合是可以的,但是,可复用的组件应当定义一个清晰的公开接口。(不然别人怎么用?)

可复用的组件,基本都是要和外部交互的,而一个组件和外部公开的交互接口有:

【1】props:允许外部环境数据传递给组件;

【2】事件:允许组件触发外部环境的action,就是说通过在挂载点添加v-on指令,让子组件的events触发时,同时触发父组件的methods;

【3】slot:分发,允许将父组件的内容插入到子组件的视图结构中。

如代码:

<div id="app"> 
<p>这是第一个父组件</p> 
<widget 
:the-value="test" 
@some="todo"> 
<span>【第一个父组件插入的内容】</span> 
</widget> 
</div> 
<div id="app2"> 
<p>这是第二个父组件</p> 
<widget @some="todo"> 
</widget> 
</div> 
<script> 
Vue.component("widget", { 
template: "<button @click='dosomething'><slot></slot>这是一个复用的组件,点击他{{theValue}}</button>", 
methods: { 
dosomething: function () { 
this.$emit("some"); 
} 
}, 
events: { 
some: function () { 
console.log("widget click"); 
} 
}, 
props: ['theValue'] 
}) 
var vm = new Vue({ 
el: '#app', 
data: { 
test: "test" 
}, 
methods: { 
todo: function () { 
console.log("这是第一个父组件") 
} 
} 
}); 
var vm_other = new Vue({ 
el: '#app2', 
data: { 
name: "first" 
}, 
methods: { 
todo: function () { 
console.log("这是另外一个父组件") 
} 
} 
}); 
</script>

说明:

【1】在第一个父组件中使用了分发slot,使用了props来传递值(将test的值传到子组件的theValue之中);

【2】在两个组件中,子组件在点击后,调用methods里的dosomething方法,然后执行了events里的some事件。又通过挂载点的@some=”todo”,将子组件的some事件和父组件的todo方法绑定在一起。

因此,点击子组件后,最终会执行父组件的todo方法。

【3】更改父组件中,被传递到子组件的值,会同步更改子组件的值(即二者会数据绑定);

③异步组件:

按照我的理解,简单来说,一个大型应用,他有多个组件,但有些组件无需立即加载,因此被分拆成多个组件(比如说需要立即加载的,不需要立即加载的);

需要立即加载的,显然放在同一个文件中比较好(或者同一批一起请求);

而不需要立即加载的,可以放在其他文件中,但需要的时候,再ajax向服务器请求;

这些后续请求的呢,就是异步组件;

做到这种异步功能的,就是Vue.js的功能——允许将组件定义为一个工厂函数,动态解析组件的定义。

可以配合webpack使用。

至于如何具体使用,我还不太明白,教程中写的不清,先搁置等需要的时候来研究。

链接:

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

④资源命名的约定:

简单来说,html标签(比如div和DIV是一样的)和特性(比如要写成v-on这样的指令而不是vOn)是不区分大小写的。

而资源名往往是写成驼峰式(比如camelCase驼峰式),或者单词首字母都大写的形式(比如PascalCase,我不知道该怎么称呼这个,不过这样写很少的说)。

Vue.component("myTemplate", {
//......略
})

Vue.js可以自动识别这个并转换,

<my-template></my-template>

以上那个模板可以自动替换这个标签。

⑤递归组件:

简单来说,递归组件就是组件在自己里内嵌自己的模板。

组件想要递归,需要name属性,而Vue.component自带name属性。

大概样子是这样的,

<div id="app"> 
<my-template></my-template> 
</div> 
<script> 
Vue.component("myTemplate", { 
template: "<p><my-template></my-template></p>" 
})

这种是无限递归,肯定是不行的。因此,需要控制他递归的层数,例如通过数据来控制递归,当数据为空时,则停止递归。

示例代码如下:

<ul id="app"> 
<li> 
{{b}} 
</li> 
<my-template v-if="a" :a="a.a" :b="a.b"></my-template> 
</ul> 
<script> 
Vue.component("myTemplate", { 
template: '<ul><li>{{b}}</li><my-template v-if="a" :a="a.a" :b="a.b"></my-template></ul>', 
props: ["a", "b"] 
}) 
var data = { 
a: { 
a: { 
a: 0, 
b: 3 
}, 
b: 2 
}, 
b: 1 
} 
var vm = new Vue({ 
el: '#app', 
data: data, 
methods: { 
todo: function () { 
this.test += "!"; 
console.log(this.test); 
} 
} 
}); 
</script>

说明:

【1】向下传递时,通过props传递a的值和b的值,其中a的值作为递归后组件的a和b的值的数据来源;
然后判断传递到递归后的组件的a的值是否存在,如果存在则继续递归;
如果a的值不存在,则停止递归。

⑥片断实例:

简单来说,所谓片断实例,就是组件的模板不是处于一个根节点之下:

片断实例代码:

Vue.component("myTemplate", { 
template: '<div>1</div>' + 
'<div>2</div>', 
})

非片断实例:

Vue.component("myTemplate", { 
template: '<div>' + 
'<div>1</div>' + 
'<div>2</div>' + 
'</div>', 
})

片断实例的以下特性被忽略:

【1】组件元素上的非流程控制指令(例如写在挂载点上的,由父组件控制的v-show指令之类,但注意,v-if属于流程控制指令);

【2】非props特性(注意,props不会被忽略,另外props是写在挂载点上的);

【3】过渡(就是transition这个属性,将被忽略);

更多的参照官方文档:

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

⑦内联模板

参照:http://cn.vuejs.org/guide/components.html#u5185_u8054_u6A21_u677F

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

Javascript 相关文章推荐
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Feb 09 Javascript
javascript实现日历控件(年月日关闭按钮)
Dec 12 Javascript
javascript校验价格合法性实例(必须输入2位小数)
May 05 Javascript
Javascript封装DOMContentLoaded事件实例
Jun 12 Javascript
Redis基本知识、安装、部署、配置笔记
Mar 05 Javascript
axios学习教程全攻略
Mar 26 Javascript
Angularjs验证用户输入的字符串是否为日期时间
Jun 01 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
简述JS浏览器的三种弹窗
Jul 15 Javascript
详解在Angular4中使用ng2-baidu-map的方法
Jun 19 Javascript
微信小程序的开发范式BeautyWe.js入门详解
Jul 10 Javascript
JS如何在不同平台实现多语言方式
Jul 16 Javascript
jQuery属性选择器用法示例
Sep 09 #Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
Sep 09 #Javascript
vuejs动态组件给子组件传递数据的方法详解
Sep 09 #Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 #Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 #Javascript
Ajax使用原生态JS验证用户名是否存在
May 26 #Javascript
jQuery子元素过滤选择器用法示例
Sep 09 #Javascript
You might like
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
PHP学习之正则表达式
2011/04/17 PHP
初识Laravel
2014/10/30 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
js核心基础之构造函数constructor用法实例分析
2019/05/11 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
python登录QQ邮箱发信的实现代码
2013/02/10 Python
Python 多核并行计算的示例代码
2017/11/07 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Python socket服务常用操作代码实例
2020/06/22 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
给全校老师的建议书
2014/03/13 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
Mysql基础知识点汇总
2021/05/26 MySQL
python实现会员管理系统
2022/03/18 Python