vue组件开发
博客专区 > wshining 的博客 > 博客详情
vue组件开发
wshining 发表于2周前
vue组件开发
  • 发表于 2周前
  • 阅读 2163
  • 收藏 115
  • 点赞 4
  • 评论 8

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

什么是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接收数据,先看如下代码:

	//html
	<input type="text" name="" value="" v-model="inp">{{inp}}<br />
	<my-con msg1="hello" msg2="world" v-bind:child-inp="inp"></my-con><br />
	
	//js代码
	var testconponent=Vue.extend({
		props:['msg1','msg2','childInp'],
		template:"<h2>hello{{msg1}}{{msg2}}<br/><button v-on:click='toUpper'>btn</button></h2>",
		methods:{
			toUpper:function(){
				console.log('dfdf');
			}
		}
	});
	Vue.component('my-con',testconponent);

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>
共有 人打赏支持
粉丝 13
博文 57
码字总数 38718
评论 (8)
莫默磨墨先生
不错:thumbsup:
曾建凯
不错不错,简单扼要,概括性强��
ztw2010
vue大发好
达浪啊达浪
2.0 注册事件部分可以简写的 myComponent
ztw2011
厉害@ztw2010
SimonYe
可以
ztw2011
����@ztw2010
认真做事开心做人
mark
×
wshining
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: