zoukankan      html  css  js  c++  java
  • Vue之组件

    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>
    
  • 相关阅读:
    PAT (Advanced Level) 1080. Graduate Admission (30)
    PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)
    PAT (Advanced Level) 1078. Hashing (25)
    PAT (Advanced Level) 1077. Kuchiguse (20)
    PAT (Advanced Level) 1076. Forwards on Weibo (30)
    PAT (Advanced Level) 1075. PAT Judge (25)
    PAT (Advanced Level) 1074. Reversing Linked List (25)
    PAT (Advanced Level) 1073. Scientific Notation (20)
    PAT (Advanced Level) 1072. Gas Station (30)
    PAT (Advanced Level) 1071. Speech Patterns (25)
  • 原文地址:https://www.cnblogs.com/wjs521/p/9932322.html
Copyright © 2011-2022 走看看