组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。个人认为就是一个可以重复利用的结构层代码片段。全局组件注册方式:Vue.component(组件名,{方法})eg:<body>
<div id="app">
<my-component></my-component>
</div>
<div id="app1"><my-component></my-component></div>
<script>
Vue.component("my-component",{template:"<h1>我是全局组件</h1>"
});
new Vue({el:"#app"
});
new Vue({el:"#app1"
})
</script>
</body>渲染结果:<div id="app"><h1>我是全局组件</h1>
</div>
<div id="app1"><h1>我是全局组件</h1>
</div>这里需要注意:1.全局组件必须写在Vue实例创建之前,才在该根元素下面生效;eg:<body>
<div id="app"><my-component></my-component>
</div>
<div id="app1"><my-component></my-component></div>
<script>new Vue({el: "#app"});Vue.component("my-component", {template: "<h1>我是全局组件</h1>"});new Vue({el: "#app1"})
</script>
</body>这样只会渲染app1根元素下面的,并不会渲染app根元素下面的,并且会报错。2.模板里面第一级只能有一个标签,不能并行;<body>
<div id="app"><my-component></my-component>
</div>
<script>new Vue({el: "#app"});Vue.component("my-component", {template: "<h1>我是全局组件</h1>" +"<p>我是全局组件内标签</p>"});new Vue({el: "#app1"})
</script>
</body>这样子会报错,并且只会渲染第一个标签h1;我们应该这样子写:<body>
<div id="app"><my-component></my-component>
</div>
<script>new Vue({el: "#app"});Vue.component("my-component", {template: "<h1>我是全局组件<p>" +"我是全局组件内标签</p></h1>"});new Vue({el: "#app1"})
</script>
</body>局部组件注册方式,直接在Vue实例里面注册eg:<body>
<div id="app1"><child-component></child-component>
</div>
<script>new Vue({el: "#app1",components:{"child-component":{template:"<h1>我是局部组件</h1>"}}});
</script>局部组件需要注意:1.属性名为components,s千万别忘了;2.套路比较深,所以建议模板定义在一个全局变量里,代码看起来容易一点,如下:(模板标签比较多的时候,这样子写更加简洁规整)<body>
<div id="app1"><child-component></child-component>
</div>
<script>var child={template:"<h1>我是局部组件</h1>"};new Vue({el: "#app1",components:{"child-component":child}});
</script>
</body>关于组件中的其他属性,可以和实例中的一样,但是data属性必须是一个函数:eg:<body>
<div id="app1"><child-component></child-component>
</div>
<script>var child={template:"<button @click='add2'>我是局部组件:{{m2}}</button>",data:function(){return {m2:1}},methods:{add2:function(){this.m2++}}};new Vue({el: "#app1",components:{"child-component":child}})
</script>
</body>显示结果:clipboard.png全局组件和局部组件一样,data也必须是一个函数:<body>
<div id="app1"><my-component></my-component>
</div>
<script>Vue.component("my-component",{template:"<button @click='add1'>全局组件:{{m1}}</button>",data:function(){return {m1:10}},methods:{add1:function(){this.m1++}}});new Vue({el:"#app1"})
</script>
</body>显示结果:clipboard.png当使用 DOM 作为模板时 (例如,将 el 选项挂载到一个已存在的元素上),你会受到 HTML 的一些限制,因为 Vue 只有在浏览器解析和标准化 HTML 后才能获取模板内容。尤其像这些元素 <ul>,<ol>,<table>,<select> 限制了能被它包裹的元素,而一些像<option> 这样的元素只能出现在某些其它元素内部。自定义组件 <my-row> 被认为是无效的内容,因此在渲染的时候会导致错误。变通的方案是使用特殊的 is 属性:eg:<body>
<div id="app1">
<ul><li is="my-component"></li>
</ul>
</div>
<script>Vue.component("my-component",{template:"<h1>{{message}}</h1>",data:function(){return {message:"hello world"}}});new Vue({el:"#app1"})
</script>
</body>渲染结果为:clipboard.png对于全局与局部的作用域问题,我们可以这样理解,只要变量是在组件内部用的,这些变量必须是组件内部的,而在外部html结构中引用的变量,都引用的是该挂载下的实例里面的变量eg:<body>
<div id="app1">
<my-component></my-component>
</div>
<script>Vue.component("my-component",{template:"<button @click='add3'>" +"{{message}}</button>",data:function(){return {message:"hello world"}},methods:{add3:function(){alert("我是局部")}}});new Vue({el:"#app1",methods:{add3:function(){alert("我是全局")}}})
</script>
</body>弹出框显示:我是局部Vue中所谓的全局指的是该挂载下的区域;下面这种做法是错误的,按我的想法觉得应该会弹出:我是全局,但是却报错,也就是说组件处于全局下不可以添加默认事件,要用全局的事件函数,必须父子通信<body>
<div id="app1">
<my-component @click="add3"></my-component>
</div>
<script>Vue.component("my-component",{template:"<button @click='add3'>" +"{{message}}</button>",data:function(){return {message:"hello world"}}});new Vue({el:"#app1",methods:{add3:function(){alert("我是全局")}}})
</script>
</body>额外话题:1.函数return后面必须跟返回的内容,不能换行写eg:clipboard.png下面这种写法不会返值回来:clipboard.png2.Vue和小程序等一样,采用es6的函数写法,this指向是不一样的<body>
<div id="app1"><button @click="f">ES5</button><button @click="f1">ES6</button>
</div>
<script>
new Vue({el:"#app1",methods:{f:function(){console.log(this)},f1:()=>{console.log(this)}}
})
</script>
</body>结果:第一个this指的是Vue实例第二个this指的是Windowclipboard.png由于它和小程序不一样,我发现在data里面this指的是window,在methods里面this才是Vue实例所以建议大家用es5写吧new Vue({el:"#app1",data:{that:this},
})clipboard.png

Vue组件之全局组件与局部组件相关推荐

  1. vue组件调用(全局调用和局部调用)

    当用vue-cli创建一个项目后, 创建项目的方法: https://www.cnblogs.com/fps2tao/p/9376847.html 编写了组件怎么,在其他组件中调用了? 组件listB ...

  2. 「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信

    月亮啊月亮 你能照见南边,也能照见北边 照见她,你跟她说一声,就说我想她了. 前言 前一篇文章写了 vue 中利用 Props 实现组件之间的通信,那种方式是最简单也是最基础的组件之间的通信方式.父组 ...

  3. vue 封装组件供全局使用_vue 封装组件的基本操作

    /**1.封装组件 局部 封装**/ // 1.创建组件构造器对象 const cpnC = Vue.extend({ template: ` <div> </div>` }) ...

  4. VueJS组件之全局组件与局部组件

    全局组件 所有实例都能用全局组件. HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  5. Vue3(撩课学院)笔记02-创建组件,全局组件,局部组件,父子组件,组件标签化,组件的data数据共享,组件间通讯,props,父传子$ref,子传父$parent

    1.创建一个组件 首先要创建一个根组件进行挂载 再创建一个子组件,完成子组件的逻辑 子组件主要使用template模板来完成布局和逻辑 把子组件通过根组件.component的方法挂载到根组件上 &l ...

  6. 【Vue.js 牛刀小试】:第九章 - 组件基础再探(data、props)

    系列目录地址 一.基础知识概览 第一章 - 一些基础概念(posted at 2018-10-31) 第二章 - 常见的指令的使用(posted at 2018-11-01) 第三章 - 事件修饰符的 ...

  7. -组件基础-局部组件 // 局部组件的简写

    -组件基础-局部组件 <!DOCTYPE html> <html lang="en"><head><meta charset=" ...

  8. 三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放

    一.什么是组件化? 人面对复杂问题的处理方式: 任何一个人处理信息的逻辑能力都是有限的 所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容. 但是,我们人有一种天生的能力,就是将问题 ...

  9. vue 组件 全局组件和局部组件component

    1.全局组件 <!DOCTYPE html> <html><head><meta charset="UTF-8"><title ...

最新文章

  1. 在Eclipse中安装ADT
  2. 马斯克又破纪录了:120米史上最高火箭已组装,计划今年完成首次轨道试飞
  3. NTU 课程笔记:ERIC(3) 开展研究
  4. hystrix 源码 线程池隔离_基于hystrix的线程池隔离
  5. 如何高效地学习和工作:计算机行业人员出门便携装备推荐
  6. boost::shared_ptr用法测试程序
  7. 执行shell出现bad interpreter
  8. [js] 你是如何比较js函数的执行速度的?
  9. 国内外免费PHP开源建站程序一览(最全)
  10. P1830 轰炸III
  11. iOS - Card Identification 银行卡号识别
  12. 深度学习实践指南(二)—— 符号编程
  13. 拓端tecdat|R语言风险价值:ARIMA,GARCH模型,Delta-normal法滚动估计,预测VaR(Value at Risk)和回测分析花旗公司股票时间序列数据
  14. 斯坦福大学公开课 :Andrew Ng 机器学习课堂笔记之第一节(机器学习的动机与应用)
  15. Proximity indication
  16. CVE-2020-25540:ThinkAdmin未授权列目录/任意文件读取漏洞复现
  17. js-时间相关操作(获取当前日期、最近三天、近一月及前N天的日期)
  18. 敏感性、特异性、假阳性、假阴性
  19. 第一性原理(DFT)基础知识
  20. Linux开放1521端口允许网络连接Oracle Listene

热门文章

  1. python实现文件管理系统_Python使用文件操作实现一个XX信息管理系统的示例
  2. Java---线程多(工作内存)和内存模型(主内存)分析
  3. ES6函数第三篇:函数篇(新增API与箭头函数)
  4. 查看静态链接和动态链接
  5. Inndb和Memory
  6. Python程序开发——第八章 文件
  7. python idle退出_【ZZ】windows+python2.7在IDLE中执行sys.exit()出现的问题及解决方案
  8. java keypad game,Take character and return the Keypad equivalant
  9. 通俗易懂了解Vue双向绑定原理及实现
  10. 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表