1

组件

1、什么是组件

组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。
对于自定义标签名,Vue.js 不强制要求遵循 W3C 规则 (小写,并且包含一个短杠),尽管遵循这个规则比较好。
myComponent驼峰式命名不能用
切记
组件在注册之后,便可以在父实例的模块中以自定义元素 <my-component></my-component> 的形式使用。要确保在初始化根实例之前注册了组件

2、全局及局部组件

2.1、全局组件

全局组件就是多少个vue根实例都能用
【案例】
<div id="app">
    {{msg}}
    <my-component></my-component>
</div>
<div id="app1">
    {{msg}}
    <my-component></my-component>
</div>
<script>
    //创建全局组件(注册)
    //组件里面的data是个函数
    Vue.component("my-component",{
        template:'<div>{{msg1}}<input type="button" value="弹出" v-on:click="tanchu"/></div>',
        data:function(){
            return {
                msg1:"组件创建"
            }
        },
        methods:{
            tanchu:function(){
                alert(this.msg1)
            }
        }
    })
    //初始化根实例
    var app = new Vue({
        el:"#app",
        data:{
            msg:"组件",
        }
    });
    //初始化根实例
    var app1 = new Vue({
        el:"#app1",
        data:{
            msg:"组件",
        }
    });
</script>
结果为下图

图片描述

2.2、局部组件

不必在全局注册每个组件。通过使用组件实例选项注册,可以使组件仅在另一个实例/组件的作用域中可用
【案例】
<div id="app">
    {{msg}}
    <my-component></my-component>
</div>
<script>
    //创建局部组件(注册)
    //组件里面的data是个函数
    var zujian = {
        template:'<div>{{msg1}}<input type="button" value="弹出" v-on:click="tanchu"/></div>',
        data:function(){
            return {
                msg1:"组件创建"
            }
        },
        methods:{
            tanchu:function(){
                alert(this.msg1)
            }
        }
    }
    //初始化根实例
    var app = new Vue({
        el:"#app",
        data:{
            msg:"组件",
        },
        //挂在组件
        components:{
            'my-component':zujian
        }
    });
</script>
结果为下图

图片描述

3、组件配置

在这个配置找那个我们可以使用字符串模板
<script type="text/x-template"></script>
【案例】
<div id="app">
    {{msg}}
    <table>
        <tr is="my-component"></tr>
    </table>
    
</div>
<script type="text/x-template" id="tpl">
    <tr>
        <td>{{msg1}}</td><td>2</td><td>3</td><td>4</td>
    </tr>
</script>
<script>
    //创建局部组件(注册)
    //组件里面的data是个函数
    var teTPl = {
        template:"#tpl",
        data:function(){
            return {
                msg1:"data在组件中是个函数"
            }
        }
    }
    //初始化根实例
    var app = new Vue({
        el:"#app",
        data:{
            msg:"组件",
        },
        //挂在组件
        components:{
            'my-component':teTPl
        }
    });
</script>
结果为下图

图片描述

4、动态创建组件

通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,我们让多个组件可以使用同一个挂载点,并动态切换
运行效果

图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>动态组件</title>
    <script type="text/javascript" src="js/vue.js"></script>
    <style>
        .sf{
            width: 200px;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <div id="app">
        <ul>
            <li @click="qiehuan='dttpl'">首页</li>
            <li @click="qiehuan='dt1tpl'">关于</li>
        </ul>
        <keep-alive>
            <conmponent :is="qiehuan"></conmponent>
        </keep-alive>
    </div>

    <script type="text/x-template" id="dtTpl">
        <div class="sf">
            <div class="sf-header">动态</div>
            <div class="sf-body">
                创建
            </div>
            <div class="sf-bottom">组件</div>
        </div>
    </script>
    <script>
        var dt = {
            template:"#dtTpl",
        }
        var dt1 = {
            template:"<a>关于我们<input type = 'text'/></a>"
        }
        var app = new Vue({
            el:"#app",
            data:{
                qiehuan:"dttpl"
            },
            components:{
                'dttpl':dt,
                'dt1tpl':dt1
            }
        })
    </script>
</body>
</html>
如果把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。为此可以添加一个 keep-alive 指令参数

Besmall
334 声望37 粉丝