• 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>
    
  • 相关阅读:
    LAMP安装配置过程
    【校招面试 之 C/C++】第31题 C++ 11新特性(二)之nullptr关键字
    【校招面试 之 C/C++】第30题 C++ 11新特性(一)之auto关键字
    【校招面试 之 C/C++】第29题 C/C++ 关键字extern
    【校招面试 之 剑指offer】第18题 删除链表中的节点
    【校招面试 之 剑指offer】第17题 打印从1到最大的n位数
    【校招面试 之 剑指offer】第16题 数值的整数次方
    【校招面试 之 剑指offer】第11题 旋转数组中的最小数字
    【Linux 进程】之关于父子进程之间的数据共享分析
    【校招面试 之 剑指offer】第10-3题 矩阵覆盖问题
  • 原文地址:https://www.cnblogs.com/hyj-/p/13709566.html
Copyright © 2020-2023  润新知