Vue-第四章Vue组件

目录

4.1Vue组件的介绍

4.2Vue组件的使用

4.3组件之间的通信

4.4Vue的插槽


4.1Vue组件的介绍


Vue提供灵活的组件系统。使用Vue组件可以将可复用的小组件
|构建成大型应用。Vue组件中可以自定义标签,并拥有自身的模板、
样式和交互。
1. Vue组件介绍
2. Vue组件的使用
3. 组件之间的通信
4. Vue的插槽


Vue组件的介绍
组件系统是Vue中一个重要的概念,它提供了一种抽象,可以使
用独立和可复用的小组件来构建大型应用,任意类型的应用界面都可
以抽象为一个组件树。
组件是可复用的Vue实例且带有一个名字。组件可以扩展HTML
元素,封装可重用的HTML代码,可将组件看作自定义的HTML元素
 

Vue组件的使用
注册组件过程又细分为全局注册和局部注册。
1.全局注册
全局注册就是调用Vue.component()注册组件,全局注册的组件可以在
当前页面的任意Vue实例下使用。
2.局部注册
如果不需要全局注册,或者是让组件在其他组件内使用,可以在Vue实
例化时,设置选项参数的components参数属性实现局部注册。

全局组件的案例

<div id="app1">
        <h1>Vue实例1</h1>
        <my-comp></my-comp>
    </div>
    <div id="app2">
        <h1>Vue实例2</h1>
        <my-comp></my-comp>
    </div>
    <script src="/js/vue.min.js"></script>
    <script>
        //创建组件
        var myComp = Vue.extend({
                template: "<h1>使用vue全局组件</h1>"
            })
            //注册组件
        Vue.component("my-comp", myComp);

        var vm = new Vue({
            el: "#app1"
        })
        var vm = new Vue({
            el: "#app2"
        })
    </script>

局部组件的案例

<div id="app1">
        <h1>Vue实例1</h1>
        <my-comp></my-comp>
    </div>
    <div id="app2">
        <h1>Vue实例2</h1>
        <my-comp></my-comp>
    </div>
    <script src="/js/vue.min.js"></script>
    <script>
        //创建组件
        var myComp = Vue.extend({
            template: "<h1>使用vue全局组件</h1>"
        })

        var vm = new Vue({
            el: "#app1",
            //注册组件
            components: {
                "my-comp": myComp
            }
        })
        var vm = new Vue({
            el: "#app2"
        })
    </script>


4.2Vue组件的使用


3.组件注册语法
Vue.js为了简化这个过程,提供了注册语法糖,即在注册组件时直接创
建和注册组件,Vue在背后会自动地调用Vue.extend()。
(1 )简化全局注册:
11全局注册,my-comp是组件标签名称
   //全局注册组件
    Vue.component("my-comp", myComp);
(2)简化局部注册

 var vm = new Vue({
            el: "#app1",
            //局部注册组件
            components: {
                "my-comp": myComp
            }
        })    
    
自定义组件模板案例

  <div id="app1">
        <h1>Vue实例1</h1>
        <my-comp></my-comp>

    </div>
    <div id="app2">
        <h1>Vue实例2</h1>
        <my-comp></my-comp>
    </div>

    <!-- //自定义组件 -->
    <template id="myComp">
        <h1>使用template标签自定义组件模板</h1>
    </template>

    <script src="/js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: "#app1",
            //局部注册组件
            components: {
                "my-comp": {
                    template: "#myComp"
                }
            }
        })
        var vm = new Vue({
            el: "#app2",
            //局部注册组件
            components: {
                "my-comp": {
                    template: "#myComp"
                }
            }
        })
    </script>

4.组件的data和el选项:
一般实例化Vue的多 数选项也可以用在Vue.extend()或Vue.component()
中的,不过有两个特殊选项参数除外,即data和el。
”Vue.js规定: 在定义组件的选项时, data和el选项必须使用函数。
如果data选项指向某个对象,这意味着所有的组件实例共用一个data。
使用一个函数作为data选项,让这个函数返回一个新对象。
 

自定义组件传值案例


    <div id="app1">
        <!-- 使用控件 -->
        <fruit-list-comp></fruit-list-comp>
    </div>

    <!-- //自定义组件 -->
    <template id="myFuit">
        <div>
            <ul>
                <li v-for="fruit in fruitList">{{fruit}}</li>
            </ul>
        </div>
    </template>

    <script src="/js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: "#app1",
            //局部注册组件
            components: {
                "fruit-list-comp": {
                    data: function() {
                        return {
                            fruitList: [
                                "火龙果",
                                "刺角瓜",
                                "莲雾",
                                "佛手湖"
                            ]
                        }
                    },
                    template: "#myFuit"
                }
            }
        })
    </script>

4.3组件之间的通信

1.父组件和子组件:
可以在组件中定义并使用其他组件,这就构成了父子组件的关系,子组
件是在父组件中注册的,只能在父组件中使用,确切地说,子组件只能在父
组件的template中使用。
请注意下面两种子组件的使用方式是错误的:
(1)以子标签的形式在父组件中使用。
(2)在父组件标签外使用子组件。
 

父内调用子控件

 <div id="app1">
        <!-- 使用控件 -->
        <parent-comp></parent-comp>
    </div>

    <script src="/js/vue.min.js"></script>
    <script>
        // 创建子组件
        var child = Vue.extend({
            template: "<p>这是子组件</p>"
        });
        // 创建子组件
        var parent = Vue.extend({
            template: "<p>这是父组件<child-comp></child-comp></p>",
            components: {
                "child-comp": child
            }
        });
        //注册父组件
        Vue.component("parent-comp", parent)
        var vm = new Vue({
            el: '#app1'
        })
    </script>

2.通过props向子组件传递数据:
组件实例的作用域是孤立的,这意味着不能并且不应该在子组件的模板
内直接引用父组件的数据,可以使用props把数据传给子组件。
-一个组件默认可以拥有任意数量的props (属性) ,任何值都可以传递 |
给任何props。在组件中,使用选项props来声明需要从父组件中接收的数据
props的值可以是两种:一种是字符串数组;另一种是对象。
语法1
components:{
     "控件名":{
    props:["值名","isStyle"],
    template:"父组件名",
    }
}
语法2
components:{
     "控件名":{
    props:{
    值名:string //类型
    }
    template:"父组件名",
    }
}

  <div id="app">
        <!-- 使用父组件 -->
        <banner-component message="消夏玩一夏!" v-bind:is-style="isShowStyle"></banner-component>
    </div>
    <!-- 创建子组件 -->
    <template id="childComp">
        <span>{{ subMessage}}</span>
    </template>
    <!-- 创建父组件 -->
    <template id="parentComp">
        <div>
            <h1 :class="{banner:isStyle}">
                {{message}}
                  <!-- 使用子组件 -->
                <child-compontent sub-message="不玩就out啦!"></child-compontent>
            </h1>
        </div>
    </template>


    <script src="/js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                isShowStyle: true
            },
            // 注册父组件
            components: {
                "banner-component": {
                    props: ["message", "isStyle"], //数组语法
                    template: "#parentComp",
                    // 注册子组件
                    components: {
                        "child-compontent": {
                            props: {
                                subMessage: String //声明对象语法
                            },
                            template: "#childComp"
                        }
                    }
                }
            }
        });
    </script>



4.4Vue的插槽


插槽( Slot)是Vue提出来的一个概念,正如名字一样,用于将
所携带的内容插入到指定的某个位置,从而使模板分块,具有模块化
的特质和更大的重用性。
插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显
示就由子组件来进行控制。
通过定义一个或多个<slot>标签,可将外部标记引入到组件的虚
拟DOM中进行渲染,相当于“在此处渲染用户的标记”
插槽有两种使用方式:默认插槽和具名插槽。

下面是插槽的案例

<div id="app">
        <p-comp>
             <!-- 具名插槽使用 -->
            <template slot="header">
                <h1>管理</h1> 
            </template>
             <!-- 默认插槽使用 -->
             默认插槽
             <!-- 具名插槽使用 -->
            <template slot="footer">
                <h2>版权声明</h2>
            </template>
        </p-comp>
    </div>

    <!-- 创建组件 -->
    <template id="pComp">
        <div>
            <!-- 具名插槽 -->
            <slot name="header"></slot>    
            <!-- 默认插槽 -->
            <slot></slot>
            <!-- 具名插槽 -->
            <slot name="footer"></slot>    
        </div>
    </template>



    <script src="/js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            // 注册组件
            components: {
                "p-comp": {
                    template: "#pComp"
                }
            }
        });
    </script>

作用域插槽的使用
插槽可以控制HTML模板的显示与不显示。
作用域插槽( slot-scope )其实就是带数据的插槽。原来父组件
可以通过绑定数据传递给子组件,而作用域插槽可以通过子组件绑定
数据传递给父组件。
作用域插槽的使用场景:既可以复用子组件的slot,又可以使slot
内容不一 致。
 

作用域插槽案例,有些绕慢慢理解

  <div id="app">
        <book-list :books="bookList">
            <template slot="book" slot-scope="props">
                <li>{{props.bookname}}</li>
            </template>
        </book-list>
    </div>

    <!-- 创建组件 -->
    <template id="bookComp">
        <div>
            <ul>
                <slot name="book" v-for="book in books" :bookname="book.name"></slot>
            </ul>
        </div>
    </template>

    <script src="/js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                bookList: [{
                    name: "vue实战"
                }, {
                    name: "123456"
                }, {
                    name: "ASP.NET"
                }]
            },
            // 注册组件
            components: {
                "book-list": {
                    props: ["books"],
                    template: "#bookComp"
                }
            }
        });
    </script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值