超简单的Vue.js组件入门javascript
在vue开发中,为了能让一些页面中的元素使用性和复用性更高咱们能够将一些html元素封装成可用的一些组件或者是模板。而后经过嵌套的方式进行在页面中嵌套使用,实现一种积木式编程。html
经过Vue.extend()声明组件
Vue.extend是vue提供出来给咱们实现组件的函数vue
//组装组件(声明组件) var MyComponent = Vue.extend({ //被封装的html内容 template: '<div>This is your first vue components!</div>', //绑定在这个组件内的数据 data: '', //监听这个组件的事件的方法 methods: '', //属性,一般被用来进行数据的通讯 props: '' });
注册组件——向vue核心容器注册这个组件
这是为了让vue更好的管理组件(复用和删除)java
Vue.component('my-component', MyComponent); //注册组件,传入别名(my-component)和组件名称(MyComponent)
初始化Vue.js的管理边界编程
var vm = new Vue({ el: '#app', });
装入组件app
在页面中嵌入 <div id="app"> <my-component></my-component> </div>
简单四步,完成一个组件的装载流程 :)模块化
Q1: 组件化除了视图复用性更高之外的特殊做用?
让一个组件具备自身独立的功能——模块化!>_<!!!函数
Q2: 如何在组件中进行js事件的绑定以及数据绑定?组件化
var MyComponent = Vue.extend({ template: '<p></p>', methods: { searchList: function() { console.log('Your cause an event!'); }, }, ready: function() { //在模块准备就绪时触发 console.log("Loading Complete!"); }, data: function() { //这里进行数据绑定,注意,为了方便数据的预处理,组件中的data是经过函数返回的对象 return { result: '' } } });
Q3:那都是经过一对一的绑定来实现数据同步的吗?
No!有种羁绊叫作组件嵌套this
经过组件之间的相互嵌套来达到组件内部的数据同步,而且这样的机制有利于开发功能性组件(如轮播图,搜索框,评论区等)
父子组件通讯
父组件传值给子组件——只要data发生改变
父组件的view发生改变,子组件的view也发生改变
值传到子组件的方式是经过props属性
子组件经过props数据进行view同步
js脚本
var child = Vue.extend({ template: '<p>{{ content }}</p>', props: ['content'] }); var Father = Vue.extend({ template: '<div><child :content='message'></child><input type="text" @change="sendMessage( $event );"/></div>',//将message代理到content属性中 data: function() { return { message: '' } }, method: { sendMessage: function( event ) { //触发事件的事件列表 this.message = event.target.value; //改变message的值 } } }); //注册父组件 Vue.component('father-component', Father); //定义边界 var vm = new Vue({ el: '#app' });
html
<div id="app"> <father-component></father-component> </div>
运行效果:
兄弟组件通讯
兄弟组件的通讯是经过一个共同的父组件或者边界来进行桥接
建立兄弟组件
经过父组件“桥梁函数”的“分发”,子组件分别获得model,并同步到本身的view中去
js脚本
//孪生哥哥 var twinsCompOld = Vue.extend({ template: '<p>I am the old brother, my age is {{ title }}<input type="number" @change="GrowUp( $event )"></p>', props: ['title', 'bridge'],//哥哥传入控制年龄增加的回调函数 methods: { GrowUp: function(event) { this.bridge(event.target.value);//将当前的年龄传入桥梁 } } }); //孪生弟弟 var twinsCompLittle = Vue.extend({ template: '<p>I am the little brother, my age is {{ title }}</p>', props: ['title']//同步年龄 }); //父亲 var Father = Vue.extend({ template: '<div>{{ say }}<oldBrother :title="sonAge" :bridge="sendMessage"></oldBrother><littleBrother :title="sonAge"></littleBrother></div>', components: { 'oldBrother': twinsCompOld, 'littleBrother': twinsCompLittle }, data: function() { var self = this; //由于执行这个函数的是子组件,所以须要将父组件的指针保存一下 return { say: 'Daddy love you!', sonAge: 0, sendMessage: function( content ) { //桥梁函数 self.sonAge = content; return self.sonAge;//儿子的年龄变化了 } } } }); //注册父组件 Vue.component('father-component', Father); //定义边界 var vm = new Vue({ el: '#app' });
html:
<body> <father-component></father-component> </body>
运行效果: