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 相关文章推荐
mailto的使用技巧分享
Dec 21 Javascript
使用Grunt.js管理你项目的应用说明
Apr 24 Javascript
jquery实现键盘左右翻页特效
Apr 30 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
Sep 21 Javascript
浅谈$('div a') 与$('div&gt;a')的区别
Jul 18 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
Feb 23 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
vue双花括号的使用方法 附练习题
Nov 07 Javascript
Vue监听事件实现计数点击依次增加的方法
Sep 26 Javascript
Vue 实现分页与输入框关键字筛选功能
Jan 02 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 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
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
通过js示例讲解时间复杂度与空间复杂度
2019/08/06 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
python中from module import * 的一个坑
2014/07/20 Python
python装饰器实例大详解
2017/10/25 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
python爬虫请求头的使用
2020/12/01 Python
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
教学评估实施方案
2014/03/16 职场文书
追悼会主持词
2014/03/20 职场文书
年终晚会主持词
2014/03/25 职场文书
中秋客户感谢信
2015/01/22 职场文书
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL