Vue组件之全局组件与局部组件的使用详解


Posted in Javascript onOctober 09, 2017

组件 (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>

显示结果:

Vue组件之全局组件与局部组件的使用详解

全局组件和局部组件一样,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>

显示结果:

Vue组件之全局组件与局部组件的使用详解

当使用 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>

渲染结果为:

Vue组件之全局组件与局部组件的使用详解

对于全局与局部的作用域问题,我们可以这样理解,只要变量是在组件内部用的,这些变量必须是组件内部的,而在外部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:

Vue组件之全局组件与局部组件的使用详解

下面这种写法不会返值回来:

Vue组件之全局组件与局部组件的使用详解

2.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指的是Window

Vue组件之全局组件与局部组件的使用详解

由于它和小程序不一样,我发现在data里面this指的是window,在methods里面this才是Vue实例

所以建议大家用es5写吧

new Vue({
  el:"#app1",
  data:{that:this},
})

Vue组件之全局组件与局部组件的使用详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
asp.net+js 实现无刷新上传解析csv文件的代码
May 17 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
Apr 18 Javascript
jquery对ajax的支持介绍
Dec 10 Javascript
用js控制组织结构图可以任意拖拽到指定位置
Jan 17 Javascript
JQuery弹出层示例可自定义
May 19 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
8 行 Node.js 代码实现代理服务器
Dec 05 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
Jun 21 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
Aug 16 Javascript
元素全屏的设置与监听实例
Nov 28 Javascript
react-navigation之动态修改title的内容
Sep 26 Javascript
使用Jenkins部署React项目的方法步骤
Mar 11 Javascript
Angular2监听页面大小变化的解决方法
Oct 09 #Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
Oct 09 #Javascript
input 标签实现输入框带提示文字效果(两种方法)
Oct 09 #Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
Oct 09 #Javascript
JS中Attr的用法详解
Oct 09 #Javascript
移动端效果之Swiper详解
Oct 09 #Javascript
浅谈node的事件机制
Oct 09 #Javascript
You might like
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
PHP+MySQL删除操作实例
2015/01/21 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
python中reload(module)的用法示例详解
2017/09/15 Python
python 字符串只保留汉字的方法
2018/11/16 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
python__new__内置静态方法使用解析
2020/01/07 Python
Python pandas如何向excel添加数据
2020/05/22 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
出纳岗位职责模板
2013/11/27 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
教师中国梦演讲稿
2014/04/23 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js