Vue之全局组件
全局组件可以被任何局部组件调用
<div id="app"> <!--这里是组件的使用--> <global-component></global-component> </div> <script> // 注意这里是component不是components Vue.component('global-component',{ template:` <div> <h2>{{wanrong}}</h2> // 这里的变量可以获取data中返回的值 <h3>{{wanrong}}</h3> </div> `, data(){ return { wanrong:'Hello wanrong!', } } }); new Vue({ el:'#app', // 这里是组件的使用 template: `<global-component></global-component>` }) </script>
Vue之局部组件
<div id="app"> </div> <script> // 第一步创建一个object对象 let Header = { template: ` <div> <h1>{{greeting}}</h1> </div> `, data() { return {greeting: 'Hello World'} // 这是一个单体函数用来给greeting传递值 } }; let App = { // 使用子组件 template: ` <app-header></app-header> `, // 在父组件中注册子组件 components:{ 'app-header': Header, } }; new Vue({ el:'#app',
// 使用父组件 template:'<app></app>',
// 注册父组件 components: { App, } }) </script>
Vue之父子组件的通信
<div id="app"> </div> <script> let Header = { template: ` <div> <h1>{{ greeting }}</h1> <h2>{{ fatherData }}</h2> </div> `, // 获取父亲组件传递过来的值(获取的是count的值) props: ['fatherData'], data() { return { greeting: 'Hello Vue', // 给greeting传递一个值 } }, }; let App = { template: ` <div> <app-header :fatherData="count"></app-header> </div> `, components: { 'app-header': Header, }, data() { return { count: 100, // 给count传值 } } }; new Vue({ el: '#app', template: `<App></App>`, components: { App, } }) </script>
Vue之子父组件的通信
<div id="app"> </div> <script> let Header = { template: ` <div> <button v-on:click="sonClick">点击给父组件传递数据</button> // 点击button按钮会触发sonClick这个方法 </div> `, methods: { sonClick: function () { this.$emit('click',0.1); // 会自动的触发下面的click方法,并且会给fatherClick函数传递一个0.1这个值 } }, }; let App = { template: ` <div> <span v-bind:style="{ fontSize: postFontSize + 'em' }">father</span> // em可以理解为代表单位,例如:px等等 <app-header v-on:click="fatherClick"></app-header> // 上面的$emit会自动的获取click事件,并执行click事件所代表的的fatherClick函数,
这里不一定是一个函数也可以是一个表达式。 </div> `, components: { 'app-header': Header, // 注册app-header }, data() { return { postFontSize: 1, } }, methods: { fatherClick: function (value) { this.postFontSize += value; // 会获取到上面传递的值0.1,并修改后传递给postFontSize这个值 } } }; new Vue({ el: '#app', template: `<App></App>`, components: { App, } }) </script>
vue非父子组件的通信
<div id="app"> <wjs></wjs> <gxx></gxx> </div> <script> // 创建一个中间调度器 let zq = new Vue(); let wjs = { template: ` <div> <h1>这是wjs</h1> <button @click="wjs_click">点击向gxx说话</button> </div> `, methods: { wjs_click: function () { // 向中间调度器提交事件 zq.$emit('wjs_say','ainio') } } }; let gxx = { template: ` <div><h1>这是gxx</h1>{{say}}</div> `, data(){ return { say: '', } }, mounted(){ // 监听中间调度器中的方法 let that = this; // 因为this的指向问题所以要处理 zq.$on('wjs_say',function (data) { that.say = data }) } }; const app = new Vue({ el: '#app', components: { wjs: wjs, gxx: gxx, } }) </script>
Vue组建系统之混入
<div id="app"> <my-gxx></my-gxx> <my-zq></my-zq> </div> <script> let mixs = { // 提高代码的复用性 methods: { show: function (name) { alert(name + '来了') }, hide: function (name) { alert(name + '走了') }, }, }; let mygxx = { template: ` <div> <button v-on:click="show('gxx')">点击显示gxx来了</button> // 绑定click事件,执行show函数 <button v-on:click="hide('gxx')">点击显示gxx走了</button> // 绑定click事件,执行hide函数 </div> `, mixins: [mixs], // 这样操作以后就不需要在进行重复的注册和使用组件了 }; let myzq = { template: ` <div> <button v-on:mouseenter="show('zq')">点击显示zq来了</button> <button v-on:mouseleave="hide('zq')">点击显示zq走了</button> </div> `, mixins: [mixs], }; new Vue({ el: '#app', components: { 'my-gxx': mygxx, 'my-zq': myzq, } })
Vue组建系统之插槽
<div id="app"> <global-component>首页</global-component> <global-component>免费课程</global-component> <global-component>轻课</global-component> <global-component>wjs</global-component> <global-component>gxx</global-component> </div> <script> Vue.component('global-component',{ template: ` <div class="box"><slot></slot></div> // slot就是插槽的写法 `, }, ); new Vue({ el: "#app", }) </script>
Vue组建系统之具名插槽
<div id="app"> <global-component> <div slot="home">首页</div> <div slot="freecourse">免费课程</div> <div slot="wjs">wjs</div> <div slot="gxx">gxx</div> </global-component> </div> <script> Vue.component('global-component', { template: ` <div class="box"> <slot name="freecourse"></slot> <slot name="gxx"></slot> <slot name="wjs"></slot> <slot name="home"></slot> </div> `, }, ); new Vue({ el: "#app", }) </script>