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 相关文章推荐
javascript 读取XML数据,在页面中展现、编辑、保存的实现
Oct 27 Javascript
javascript查询字符串参数的方法
Jan 28 Javascript
Jquery实现上下移动和排序代码
Oct 17 Javascript
JS简单实现动态添加HTML标记的方法示例
Apr 08 Javascript
AngularJS模态框模板ngDialog的使用详解
May 11 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 Javascript
浅谈VUE中演示v-for为什么要加key
Jan 16 Javascript
微信小程序利用button控制条件标签的变量问题
Mar 15 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
Apr 10 Javascript
QT与javascript交互数据的实现
May 26 Javascript
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
php 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
php实现socket推送技术的示例
2017/12/20 PHP
YII框架页面缓存操作示例
2019/04/29 PHP
jQuery 使用手册(五)
2009/09/23 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
深入浅析同源策略和跨域访问
2015/11/26 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
Numpy中ndim、shape、dtype、astype的用法详解
2020/06/14 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
质检的岗位职责
2013/11/17 职场文书
竞争上岗实施方案
2014/03/21 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
公司宣传语大全
2015/07/13 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
Python装饰器详细介绍
2022/03/25 Python