vue组件

vue组件

一、组件化

1.1 组件化的概念

将一个页面拆分为一个个小功能块,每个功能块完成属于自己这部分独立的功能

任何应用都可以抽象为一棵组件树

构建组件的步骤

  • 1.调用Vue.extend()方法创建组件的构造器

  • 2.调用Vue.component()方法注册组件

  • 3.在Vue实例的作用范围中使用组件

1.2 全局组件和局部组件

  • 全局组件:可以在多个Vue实例中被调用
  • 局部组件:只能在本实例中被调用
<div id="app">
    <!--3.调用组件 -->
    <my-cpn></my-cpn>
</div>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    //1.创建组件构造器
    const cpn=Vue.extend({
        template:`
			<h2>hello</h2>
		`
    })
    //2.注册组件(全局组件,可以在多个Vue实例中被调用)
    Vue.component('my_cpn',cpn);
    var app =new Vue({
        el:"#app",
        data:{
            message:"hello"
        },
        //局部组件,只能在本实例中被调用
        components:{
            my_cpn:cpn
        }
    })
</script>

1.3 父组件和子组件

  • 父组件
  • 子组件
<div id="app">
    <!--3.调用组件 -->
    <cpn2></cpn2>
</div>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    //1.创建组件构造器
    //子组件
    const cpnC1=Vue.extend({
        template:`
		<h2>我是第一个组件</h2>
		`
    }),
    //父组件
    const cpnC2=Vue.extend({
        template:`
           <h2>我是第二个组件</h2>
           <cpn1></cpn1>
            `,
        components:{
           cpn1:cpnC1		//组件二中注册组件一
        }
   })
    var app =new Vue({
        el:"#app",
        data:{
            message:"hello"
        },
        //注册局部组件
        components:{
            cpn2:cpnC2
        }
    })
</script>

2 组件简写

2.1组件的语法糖写法

  • 全局组件注册的语法糖
  • 局部组件注册的语法糖
<div id="app">
    <cpn1></cpn1>
    <cpn2></cpn2>
</div>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    //全局组件注册的语法糖
    Vue.component('cpn1',{
        template:`
			<h2>我是全局组件语法糖</h2>
		`
    })
    var app =new Vue({
        el:"#app",
        data:{
            message:"hello"
        },
        //局部组件注册的语法糖
        components:{
            cpn2:{
                template:`
				<h2>我是局部组件语法糖</h2>
				`
            }
        }
    })
</script>

2.2 组件的分离写法

  • script标签:
  • template标签:
<!--1.script标签-->
<script type="text/x-template" id="cpn">
        <div>
            <h2>我是内容</h2>
    </div>
</script>
<!--2.template标签-->
<template id="cpn">
    <div>
        <h2>{{title}}</h2>
    </div>
</template>

<div id="app">
    <cpn1></cpn1>
</div>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    Vue.component('cpn1',{
        template:'#cpn',
        data(){
            return{
                title:"hhhh"
            }
        }
    })
    var app =new Vue({
        el:"#app",
        data:{
        },
    })
</script>

3 data属性

  • 返回不同的对象
  • 返回同一个obj对象
<template id="cpn">
    <div>
        <h2>当前计数:{{counter}}</h2>
        <button @click="incream">+</button>
        <button @click="decream">-</button>
    </div>
</template>

<div id="app">
    <cpn1></cpn1>
    <cpn1></cpn1>
    <cpn1></cpn1>
</div>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<script>
    // 接2
    // const obj={
    //     counter:0
    // }
    Vue.component('cpn1',{
        template:'#cpn',
        //1.返回不同的对象
        data(){
            return{
                counter:0
            }
        },
        //2.返回同一个obj对象
        // data(){
        //     return obj;
        // },
        methods:{
            incream(){
                this.counter++;
            },
            decream(){
                this.counter--;
            }
        }
    })
    var app =new Vue({
        el:"#app",
        data:{
            message:"hello"
        },

    })
</script>

4 父子组件通信

  • 父组件通过props向子组件传递数据
    • 数组语法
    • 对象语法
<body>
    <template id="cpn">
        <div>
            <p>{{cmovie}}</p>
            <p>{{cmessage}}</p>
        </div>

    </template>
    <div id="app">
        <!--进行传值绑定-->
        <cpn :cmovie="movie" :cmessage="message"></cpn>
    </div>
    <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
    <script>
        const cpn={
            template:'#cpn',
            //数组语法
            props:['cmovie','cmessage'],
            //对象语法
            props:{
                //1.类型限制
                cmovie:Array,
                cmessage:String,
                cproxy:[String,Array]//多个可能的类型
                //2.提供默认值
                cmessage:{
                type:String,
                default:'aaaa',//当没有传值过来的时候就是显示默认值
                required:true,//一定要有传值
            	},
                //3.类型是对象或者数组时,默认值必须是一个函数
                cmovie:{
                    type:Array,
                    default(){
                        return []
                    }
                }
        	},
              data(){
                  return {}
              }
        }
        var app=new Vue({
            el:"#app",
            data:{
                message:"hello",
                movie:['快把我哥带走','唐人街探案','星际'],
            },
            components:{
                cpn
            }
        })
    </script>
</body>
  • 子组件通过事件向父组件发送消息
<body>
    <!--子组件模板-->
    <template id="cpn">
        <div>
            <button v-for="item in sorts" 
                    @click="btnclick(item)">
                {{item.name}}
            </button>
        </div>
    </template> 
    <!--父组件模板-->
    <div id="app">
        <!--监听子组件发送过来的事件,没有参数,默认将子组件的item传过去-->
        <cpn @itemclick="cpnclick"></cpn>
    </div>
    <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
    <script>
        //1.子组件
        const cpn={
            template:'#cpn',
            data(){
                return {
                    sorts:[
                        {id:'111',name:'益智休闲'},
                        {id:'222',name:'烧脑悬疑'},
                        {id:'333',name:'轻松经营'},
                    ]
                }
            },
            methods:{
                btnclick(item){
                    //向父组件发送事件
                    this.$emit('itemclick',item)
                }
            }
        }
        // 2.父组件
        var app=new Vue({
            el:"#app",
            data:{

            },
            components:{
                cpn
            },
            methods:{
                cpnclick(item){
                    console.log(item);
                }
            }
        })
    </script>
</body>
posted @ 2020-09-22 00:22  Hyjjing  阅读(261)  评论(0编辑  收藏  举报