Vue组件

全局组件的创建、注册、使用

  • 创建

    /* 组件创建格式
        let 设置变量保存组件 = Vue.extend({
            template: 模板
        }); 
        1.指定组件的模板
        2.模板只能有一个根元素 */
    
    let myTemplate = Vue.extend({
        template: `<div><p>我是组件</p></div>`,
    });
    
  • 注册

    /* 注册组件格式:
        Vue.component("组件使用时的名称", 组件变量); */
    Vue.component("abc", myTemplate);
    
  • 使用

    <!--注册组件相当于自定义一个标签,而使用组件就是使用标签-->
    <div id="app">
        <abc></abc>
    </div>
    
    new Vue({
        el: '#app'
    })
    

组件的创建、注册流程合并优化

  • 优化一:在组件注册的时候直接传递组件的创建代码
    Vue.component("abc", {
        template: `<div><p>我是组件</p></div>`,
    });
    
  • 优化二:template属性可以使用外部模板
    <!--自定义模板
    1.通过这种方法自定义模板有语法提示-->
    <script type="text/html" id="info">
        <div>
            <p>我是组件</p>
        </div>
    </script>
    
    Vue.component("abc", {
        // 传递模板ID
        template: "#info",
    });
    
  • 优化三:使用Vue提供的模板标签,自定义模板
    <template id="info">
        <div>
            <p>我是组件</p>
        </div>
    </template>
    
    Vue.component("abc", {
        // 传递模板ID
        template: "#info",
    });
    

优化情况下全局与局部组件的注册和使用

<template id="info">
    <div>
        <p>我是组件</p>
    </div>
</template>
  • 全局组件
    <div id="app">
        <abc></abc>
    </div>
    
    Vue.component("abc", {
        template: "#info",
    });
    
    new Vue({
        el: '#app',
    })
    
  • 局部组件
    <div id="app1">
        <abc></abc>
    </div>
    
    <div id="app2">
        <abc></abc>
    </div>
    
    /* 局部组件注册通过在Vue实例的components属性上注册
    格式:    
    components: {
            "组件标签名称": {
                template: "模板ID",
            }
        } */
    new Vue({
        el: '#app1',
        components: {
            "abc": {
                template: "#info",
            }
        }
    })
    
    new Vue({
        el: '#app2',
    })
    

自定义组件中data和methods

<div id="app">
    <abc></abc>
</div>
<template id="info">
    <div>
        <p @click="abcFn">{{ str }}</p>
    </div>
</template>
  • 全局组件
    /* 注意点
    1.自定义的组件的data是一个函数,函数内部通过return返回对象,在对象内部书写数据 */
    
    Vue.component("abc", {
        template: "#info",
        data: function () {
            return {
                str: "我是组件11"
            }
        },
        methods: {
            abcFn() {
                alert("abc")
            }
        }
    });
    
    new Vue({
        el: '#app'
    })
    
  • 局部组件
    new Vue({
        el: '#app',
        components: {
            "abc": {
                template: "#info",
                data: function () {
                    return {
                        str: "我是组件11"
                    }
                },
                methods: {
                    abcFn() {
                        alert("abc")
                    }
                }
    
            }
        }
    })
    

自定义组件中data为什么是通过函数返回对象?

  • 避免在创建多个组件得时候,多个组件使用同一个份数据
    <!--点击按钮时,只有对应得组件参数进行变化-->
    <div id="app">
        <abc></abc>
        <abc></abc>
        <abc></abc>
    </div>
    
    <template id="info">
        <div>
            <button @click="add">加加</button>
            <p>{{ number }}</p>
        </div>
    </template>
    
    Vue.component("abc", {
        // 传递模板ID
        template: "#info",
        data: function () {
            return {
                number: 1,
            }
        },
        methods: {
            add() {
                this.number++;
            }
        }
    });
    
    new Vue({
        el: '#app'
    })
    

组件得切换显示

<style>
    *{
        margin: 0;
        padding: 0;
    }
    .v-enter{
        opacity: 0;
        margin-left: 500px;
    }
    .v-enter-to{
        opacity: 1;
    }
    .v-enter-active{
        transition: all 3s;
    }
    .v-leave{
        opacity: 1;
    }
    .v-leave-to{
        opacity: 0;
    }
    .v-leave-active{
        transition: all 3s;
        margin-left: 500px;
    }
</style>
<template id="home">
    <div>
        <p :style="obj">我是首页</p>
    </div>
</template>

<template id="other">
    <div>
        <p :style="obj">我是其它页面</p>
    </div>
</template>
Vue.component("home", {
    template: "#home",
    data: function () {
        return {
            obj: {
                "width": "200px",
                "height": "200px",
                "background": "red"
            }
        }
    }
});

Vue.component("other", {
    template: "#other",
    data: function () {
        return {
            obj: {
                "width": "200px",
                "height": "200px",
                "background": "blue"
            }
        }
    }
});
  • 组件用元素标签显示,那么也可以使用指令进行显示与隐藏,使用v-if相关指令
    new Vue({
        el: '#app',
        data: {
            isShow: true
        },
        methods: {
            change () {
                this.isShow = !this.isShow
            }
        }
    })
    
    <div id="app">
        <button @click="change">切换</button>
        <home v-if="isShow"></home>
        <other v-else></other>
    </div>
    
  • 使用Vue提供得component标签
    new Vue({
        el: '#app',
        data: {
            name: 'home'
        },
        methods: {
            change() {
                this.name = this.name === "home" ? 'other' : 'home'
            }
        }
    })
    
    <div id="app">
        <button @click="change">切换</button>
        <!--<component v-bind:is="需要显示的组件名称"></component>-->
        <component v-bind:is="name"></component>
    </div>
    
  • 组件切换的组件缓存:使用keep-alive标签对包裹component标签对(组件)
    new Vue({
        el: '#app',
        data: {
            name: 'home'
        },
        methods: {
            change() {
                this.name = this.name === "home" ? 'other' : 'home'
            }
        }
    })
    
    <div id="app">
        <button @click="change">切换</button>
        <keep-alive>
            <component v-bind:is="name"></component>
        </keep-alive>
    </div>
    
  • 组件切换动画问题
    <!--
    1.默认情况下,动画过渡的进入和离开是同时执行的
    2.但是可以对transition标签 设置过度模式mode-->
    
    <div id="app">
        <button @click="change">切换</button>
        <!--<component v-bind:is="需要显示的组件名称"></component>-->
        <transition mode="out-in">
            <component v-bind:is="name"></component>
        </transition>
    </div>
    
    new Vue({
        el: '#app',
        data: {
            name: 'home'
        },
        methods: {
            change() {
                this.name = this.name === "home" ? 'other' : 'home'
            }
        }
    })
    

组件注册时的名称和组件使用时的名字注意点

  • 在组件注册时如果使用了驼峰命名,那么在使用组件的时候只能用分隔命名使用

    <div id="app">
        <!--那么使用组件的时候只能只用分割命名-->
        <my-father></my-father>
    </div>
    
    <template id="father">
        <div>
            <p>我是父组件</p>
        </div>
    </template>
    
    // 这里使用驼峰命名注册组件名称
    Vue.component("myFather", {
        template: "#father",
    });
    
    new Vue({
        el: '#app',
    })
    
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • # .natvie >能够在使用组件的时候,将事件传递到组件的根元素上面。(默认在调用组件的时候,写的一些事件,是...
    考拉_2044阅读 379评论 0 0
  • 三、组件 组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML元素,封装可重用...
    小山居阅读 727评论 0 1
  • 组件 全局组件 <component-test></component-test> ...
    王蕾_fd49阅读 339评论 0 1
  • 1. 定义组件 语法: Vue.extend({ template: "" }) 定义组件使用Vue.exte...
    联旺阅读 608评论 0 0
  • 一、什么组件 组件 (Component) 是 Vue.js 的重要组成部分。能够让你在复杂的应用中拆分成独立模块...
    杨健kimyeung阅读 386评论 0 0

友情链接更多精彩内容