04-Vue组件

八. 组件

8.1 组件化

为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块
==组件化== :从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一

8.2 三种方式创建组件

8.2.1 vue.extend 创建全局组件

var com1= Vue.extend({
            //通过template 属性 指定了 组件要展示的HTML结构
            template:'<h1>你好一号组件</h1>'
})

8.2.2 Vue.component

Vue.component('mycom1',Vue.extend({
    template:'<h1>你好二号组件</h1>'
})

8.2.3 组件模块对象

var login ={
    template:'<h1>你好三号组件</h1>'
}

8.2.4 通过template元素来定义组件的html模块

html代码:

<div id="app">
    <mycom></mycom>
</div>
<template id="tem">
//组件中的template属性 指向的模板内容,有且只能有唯一的根元素来进行包裹!所以要通过div来包裹
    <div>
        <h1> 通过template元素  来定义组件的html模块 </h1>
    <span> 很好很好 </span>
    </div>
</template>

vue代码:

Vue.component('mycom',{
        template:'#tem'
})

8.2.5 自定义私有组件

html代码:

<div id="app">
    <mycom></mycom>
</div>
<div id="app2">
    <show></show>
</div>
<template id="tem2">
    <h1> 定义私有组件 </h1>   
</template>

vue代码:

Vue.component('mycom',Vue.extend({
    template:'<h1>你好,全局组件</h1>'
})

var vm =new Vue({
    el:'#app',
    data:{},
    methods:{}  
})
var vm1 =new Vue({
            el:'#app2',
            data:{},
            methods:{},
            components:{ //定义私有组件
                show:{
                    template:'#tem'
                }
        }
})

8.3 组件中的data和methdos

组件中的data 是 一个的方法并且方法内部返回一个对象

组件中 的data 使用方式与实例中的data方式一样

html代码:

<div id="app">
            <mycom1></mycom1>
        </div>
        
        <template id="tem">
            <div>
                <h1>你好,这是组件++ {{msg}}</h1>
                <input type="button" value="组件按钮" @click="mycom"/>
            </div>
</template>

vue代码:

Vue.component('mycom1',{
            template:'#tem',
            //组件中 的data 是 一个的方法并且方法内部返回一个对象
            //组件中 的data  使用方式与实例中的data方式一样
            data:function(){
                return {
                    msg:'我是组件'
                }
            },
            methods:{
                mycom(){
                   console.log('这是组件的方法')
                }
            }
        })
        
        var vm =new Vue({
            el:'#app',
            data:{},
            methods:{
                
            }
        })

8.4 组件之间的传值和调用方法

8.4.1 props

1.子组件自定义绑定父组件的data 数据
2父组件将绑定属性名称 放到 props数组定义一下,子组件就可以使用这个属性了

html代码:

<div id="app">
    <!-- 父组件将传给子组件的数据 通过属性绑定 传递到子组件内部-->
    <com v-bind:parentmsg='msg'></com>
</div>

vue代码:

//子组件默认不能获取父组件的data上的数据和methods的方法
var vm =new Vue({
    el:'#app',
    data:{
        msg:'123-父组件'
    },
    methods:{},
    components:{
        //组件中的props数据都是通过父组件传递给子组件的
    com:{
        //子组件的data属性中数据是子组件私有的 子组件通过ajax请求回来的值 都可以存放到data中
        //data数据可读可写
        data:function  () {
            return {
                num:123
            }
        },
        template:'<h2>注册页面  === {{parentmsg}}</h2>',
        //将父组件传递过来的 parentmsg 属性 现在props数组中定义一下才能使用这个数据
        //props的数据只读 不能重新赋值
        props:['parentmsg']
    }
}
})

8.4.2 this.$emit()

1.子组件 绑定事件 调用 子组件内部的方法
2.子组件使用this.$emit() 触发父组件的自定义事件
3.父组件自定义绑定的事件 调用父组件的方法并传值

html代码:

<div id="app">
            <com @func="show"></com>
</div>
<template id="tem">
            <div >
                <input type="button" value="子组件的按钮" @click="myclick"/>
                <p>看看</p>
            </div>
</template>

vue代码:

var com ={
            template:'#tem',
            data:function  () {
                return {
                    list:{name:'我是子组件' ,age:1}
                }
            },
            methods:{
                myclick(){
                    // console.log('ok');
                    // 子组件可以使用 $emit 触发父组件的自定义事件。
                    this.$emit('func',this.list)
        }
    }
}
        
var vm =new Vue({
            el:'#app',
            data:{
                fromson:null
            },
            methods:{
                show(data){
                    // console.log("调用了父组件的方法--"+data);
                    // console.log(data);
                    this.fromson=data
                    console.log(this.fromson);
                }
            },
            components:{
                com
            }
})

8.4.3 tihs.$ref()

父组件可以通过 ==tihs.$ref()== 获取DOM元素 和 组件 组件的数据 ,方法

html代码:

<div id="app">
            <input type="button" value="获取元素" @click="myclick"/>
            <h1 ref='myh1'>哈哈哈哈哈</h1>
            <login ref='mylogin'></login>
</div>
        
<template id="tem">
            <div>
                <h1>你好你好</h1>
            </div>
</template>

vue代码:

var login={
            template:'#tem',
            data:function (){
                return{
                    name:'我是子组件的数据'
                }
            },
            methods:{
                look(){
                    console.log('调用了子组件的方法'+this.name);
                }
            }
}
        
var vm =new Vue({
            el:'#app',
            data:{},
            methods:{
                myclick(){
                    //通过ref获取 dom元素
                    console.log(this.$refs.myh1.innerText)
                    //通过ref获取 组件 组件的数据 方法
                    console.log(this.$refs.mylogin.name);
                    this.$refs.mylogin.look()
                }
            },
            components:{
                'login':login
            }
})

猜你喜欢

转载自www.cnblogs.com/hardywen/p/12014867.html
今日推荐