Vue组件化

52 阅读2分钟

文章目录

组件化

1.组件的使用

创建组件构造器

Vue.extend()创建组件构造器

注册组件

Vue.component()注册组件

使用组件

Vue实例范围使用组件

2.全局组件与局部组件

全局组件

//全局组件
        //1.创建组件构造器对象
        const cpnC =  Vue.extend({
            //模板,容器基本的html
            template: `
            <div>
                <h2>我是全局</h2>
                <p>我是内容</p>
                <p>我是内容</p>
            </div>
            `
        })
        //2.注册组件(全局组件)
        Vue.component('my-cpn',cpnC);
        //3.使用组件挂载
        var app = new Vue({
            el:"#app",
            data:{
                message:"Hello!"
            }
        })

局部组件

局部组件在vue内部定义

    //局部组件
        const cpnC1 =  Vue.extend({
            //模板,容器基本的html
            template: `
            <div>
                <h2>我是局部组件</h2>
                <p>我是内容</p>
                <p>我是内容</p>
            </div>
            `
        })
        var app1 = new Vue({
            el:"#app1",
            components: {
                cpn: cpnC1
            }
        })

父子组件

 const cpnC2 =  Vue.extend({
            //模板,容器基本的html
            template: `
            <div>
                <h2>我是父组件</h2>
                <p>我是内容</p>
                <p>我是内容</p>
                <cpn></cpn>
            </div>
            `,
            components: {
                cpn:cpnC
            }
        })

3.模板template组件

分离写法

可以写一个temple然后再注册时引用就可以

    <template id="cpn">
        在这里写html模板
    </template>

引用

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

data存放位置

const data = {};
Vue.component('cpn',{
    template:'#cpn'data(){
        return data;
    }
})

4.组件之间的通讯

props 属性向子组件传递数据

如下:
app2 vue对象中的data传递给cpn使用
主要注意的点
html中 :cstring=‘string’ 绑定数据让cpn能引用到父节点的值
app2 的components要将cpn注入进去
然后 cpn中的props属性可以做一些指定,例如取不到值默认显示和指定引用的类型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="/js/vue.js"></script>
</head>
<body>
    <div id="app2">
        <cpn :cstring='string' :cmovies='movies'></cpn>
    </div>
</body>
<template id="templates">
    <div>
        <h1>组件</h1>
        <p>{{cstring}}</p>
        <h2>{{cmovies}}</h2>
    </div>
</template>
<script>
    const cpn = {
        template:'#templates',
        props: {
            'cstring':{
                type:String,//在这里可以指定多个类型例如 [String,Number]
                default:'asdasdasd',//也可以是一个function 例如 default:function(){return ‘dasdasd’}
                validator:function(value){//可以对数据进行验证
                    console.log(value);
                    return value;
                }
            },
            'cmovies':{
                type:Array,
                default:['例子1','例子2'],
                required :true
            }
        },
        data(){
            return {};
        },
        methods:{
        }
    }
    var app2 = new Vue({
        el:"#app2",
        data:{
            string:'hello',
            movies:['海尔兄弟','投名状']
        },
        components: {
            cpn
        } 
    })
</script>
</html>

可指定数据类型
String Number Boolean Array Object Date Function Symbol

事件向父组件发送消息

  • 子组件模板监听到事件然后通过this.$emit(‘itemclick’,item);方式将事件发射出去
  • 父组件监听这个事件进行处理
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="/js/vue.js"></script>
</head>
<body>
    <div id="app2">
        <cpn @itemclick=emit></cpn>
    </div>
</body>
<template id="templates">
    <div>
        <h1>按钮</h1>
        <button v-for="(item,index) in categories" @click="buttonClick(item)">
            {{index}}:{{item.name}}
        </button>
    </div>
</template>


<script>
    //1.子组件
    const cpn = {
        template:'#templates',
        data(){
            return {
                categories:[
                    {id:'1',name:'炸弹'},
                    {id:'2',name:'炸弹1'},
                    {id:'3',name:'炸弹2'},
                    {id:'4',name:'炸弹3'},
                    {id:'5',name:'炸弹4'},
                    {id:'6',name:'炸弹5'},
                ]
            };
        },
        methods: {
            buttonClick(item){
                this.$emit('itemclick',item);
            }
        }
    }
    var app2 = new Vue({
        el:"#app2",
        data:{
        },
        components: {
            cpn
        },
        methods:{
            emit(item){
                console.log(item);
            }
        }
    })
</script>
</html>

5.获取子组件或父组件跟组件vue对象

子组件

console.log(this.$refs.refs.categories);
//这种写法需要给子组件增加ref标签
console.log( this.$children[0].categories);

父组件(不推荐使用因为耦合)

console.log(this.$parent.message);

根组件(可以使用根节点一般存储网关、ip、请求路径等)

 console.log(this.$root.message);

6.vue文件

以后写组件会直接写成vue文件

<template>html代码模板</template>
<script>js代码</script>
<style scoped>css style只作用于当前模板</template>

github 例子地址

github.com/1142235090/…