文档章节

vue组件开发

wshining
 wshining
发布于 2017/09/10 16:59
字数 1007
阅读 2603
收藏 131

什么是vue组件

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

组件使用步骤

1. 定义组件

    var myComponent = Vue.extend({
		template:"<h2>this is my first component</h2>"
	});

2. 注册组件

	 全局注册组件
     Vue.component('myComponent',myComponent)
	 局部注册组件
	 var apk = new Vue({
	    el:"#apk",
	    components:{
	 	"myComponent":myComponent
	   }
     })

3. 使用组件

	<div id="apk">
		<my-component></my-component>
	</div>

4. 上面的定义过程比较繁琐,也可以不用每次都调用Vue.component和Vue.extend方法:

    // 在一个步骤中扩展与注册
    Vue.component('my-component', {
    	template: '<div>A custom component!</div>'
    })
    
    // 局部注册也可以这么做
    var Parent = Vue.extend({
   		 components: {
	    	'my-component': {
	    		template: '<div>A custom component!</div>'
	   		 }
    	}
    })

组件常用方法使用

1. 嵌套组件

组件本身也可以包含组件,下面的parent组件就包含了一个命名为child-component组件,但这个组件只能被parent组件使用:

	var myComponent = Vue.extend({
		template:"<h2>this is my first component</h2>"
	});
	var myComponent2 = Vue.extend({
		template:"<h2>嵌套组件:<myComponent1></myComponent1></h2>",
		components:{
			"myComponent1":myComponent
		}
	});

2. 父子组件之间的通信

使用 v-bind: (或直接用冒号) 传递数据,使用props接收数据,先看如下代码:

	<!DOCTYPE html>
	<html lang="en">
	
	<head>
	    <meta charset="UTF-8">
	    <title>Title</title>
	    <script src="https://unpkg.com/vue/dist/vue.js"></script>
	</head>
	
	<body>
	    <div id="box">
	        <input type="text" name="" value="" v-model="inp">{{inp}}
	        <br />
	        <my-con msg1="hello" msg2="world" v-bind:child-inp="inp" v-on:listen="change"></my-con>
	        <br />
	    </div>
	    <script>
	    var testconponent = Vue.extend({
	        props: ['msg1', 'msg2', 'childInp'],
	        template: "<h2> {{msg1}} {{msg2}}  {{childInp}}<br/><button [@click](https://my.oschina.net/willclick) = 'toUpper' >btn</button></h2>",
	        methods: {
	            toUpper: function() {
	               this.$emit('listen', 'abc');
	            }
	        }
	    });
	    Vue.component('my-con', testconponent);
	    new Vue({
	        el: '#box',
	        data(){
	        	return {
	        		inp:''
	        	}
	        },
	        methods:{
	        	change(data){
	        		this.inp = data;
	        	}
	        }
	    })
	    </script>
	</body>
	
	</html>

3. 非父子组件之间的通信

上面我们使用props只能解决父子组件之间的通信,当两个兄弟关系的组件,就不能这样传递了
兄弟节点之间需要使用 事件的触发方法 $emit去实现

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Title</title>
	    <script src="https://unpkg.com/vue/dist/vue.js"></script>
	</head>
	<body>
	   <div id="box">
	       <com-a></com-a> <!-- 调用com-a组件 -->
	       <com-c></com-c><!-- 调用com-c组件 -->
	   </div>
	<script>
	   var Event=new Vue();  // 声明一个独立的空Vue公用实例,用来触发通讯的事件
	
	    var a={
	        template:'<div><span>我是a组件,我的数据内容是{{msga}}</span><br><input type="button" value="我要发送数据" @click="send"></div>',
	        data(){
	            return{
	             msga:'我是a数据,我要发送给兄弟组件'
	            }
	        },
	        methods:{
	            send(){
	                Event.$emit('a-msg',this.msga)  //触发前面 Event 公用示例的方法,那么别的地方就可以想办法监听接收这个事件。参数(事件名,传输的值)
	            }
	        }
	    };
	    var c={
	        template:"<div><h3>这是C组件</h3><span>我从A里面接受的数据:{{a}}</span></div>",
	        data(){
	            return{
	                a:''
	            }
	        },
	        mounted(){    //这里的mouted表示当组件和页面挂载完成的时候,需要执行的函数
	            var _this = this;  //因为在Event.on内部的this是指向 Event实例的,所以这里,先使用 _this将this存起来,后面就可以使用了。
	            Event.$on('a-msg',function (a) {  //使用on监听事件 a-msg,这样当a组件中使用 emit主动触发了 Event实例的a-msg事件之后,这里就可以接收到
	                alert('触发了接收');
	                _this.a = a;
	            })
	        }
	    };
	    new Vue({
	        el:'#box',
	        components:{
	            'com-a':a,
	            'com-c':c
	        }
	    })
	</script>
	</body>
	</html>

代码中,我们声明了一个独立的空Vue公用实例,用来触发通讯的事件。在a组件中使用 $emit触发事件,在 c组件中使用on监听事件,就可以实现数据的传递了。

4. 动态创建组件

使用is属性动态添加组件

	<!DOCTYPE html>
	<html>
	<head>
	<meta charset="utf-8">
	<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
	
	</head>
	<body>
	
	<div id="dynamic">
		<button id="home">Home</button>
		<button id="posts">Posts</button>
		<button id="archive">Archive</button>
		<br>
		<component :is="currentView"></component>
		</div>
	
		<script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
		<script>
		var vue = new Vue({
		    el:"#dynamic",
			data: {
			currentView: "home"
			},
			components: {
				"home":{
					template: "<h2>home</h2>"
				},
				"posts": {
					template: "<h2>Posts</h2>"
				},
				"archive": {
					template: "<h2>Archive</h2>"
				}
			}
		});
		document.getElementById("home").onclick = function(){
		vue.currentView = "home";
		};
		document.getElementById("posts").onclick = function(){
		vue.currentView = "posts";
		};
		document.getElementById("archive").onclick = function(){
		vue.currentView = "archive";
		};
		</script>
	</body>
	</html>

© 著作权归作者所有

共有 人打赏支持
上一篇: vuex初识
wshining
粉丝 14
博文 69
码字总数 47017
作品 0
深圳
前端工程师
私信 提问
加载中

评论(9)

魏希权
魏希权
ztw2011
ztw2011
����@ztw2010
SimonYe
SimonYe
可以
ztw2011
ztw2011
厉害@ztw2010
达浪啊达浪
达浪啊达浪
2.0 注册事件部分可以简写的 myComponent
ztw2010
ztw2010
vue大发好
曾建凯
曾建凯
不错不错,简单扼要,概括性强��
莫默磨墨先生
莫默磨墨先生
不错👍
Vue常用经典开源项目汇总参考-海量

Vue常用经典开源项目汇总参考-海量   Vue是什么?   Vue.js(读音 /vju/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。...

80368704
06/29
0
0
Vue插件开发流程详解-从开发到发布至npm(二)

 前记:上一篇 https://www.cnblogs.com/adouwt/p/9211003.html,(这里感谢博客园的网友,给我点赞推荐了) 说到了一个完整的vue插件开发、发布的流程,总结下来就讲了这么一个事,如何注入...

大灰狼的小绵羊哥哥
09/16
0
0
vue插件开发流程详解-从开发到发布至npm(二)

  前记:上一篇 https://www.cnblogs.com/adouwt/p/9211003.html,说到了一个完整的vue插件开发、发布的流程,总结下来就讲了这么一个事,如何注入vue, 如果封装vue插件,如何测试vue插件,...

阿逗
09/16
0
0
为什么选择MpVue进行小程序的开发

前言 mpvue是一款使用Vue.js开发微信小程序的前端框架。使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为H5和小程序提供了代码复用的能力。如果想将 H5 项目改造为小程序,或开发小程...

狗尾草的博客
08/01
0
0
Vue-Router源码学习之install方法

Vue是怎么注册插件的呢? 使用过Vue的coder都知道,如果想注册一个vue的插件,在vue对象上能够使用的话(并不是绑在Vue.prototype上的那种暴力方式),必须使用Vue.use(你的插件)的方式来注册...

酸楚与甘甜
09/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
25
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
13
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
35
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部