组件及其属性 || 青训营笔记

70 阅读3分钟

一、组件

组件封装的是完整的页面功能(包括:HTML、CSS、JS),而函数只封装JS(逻辑)

组件完成的是页面的模块化;js完成的是逻辑的模块化

组件的概念:

组件是自定义标签,vueJS提供的组件可以让程序员自定义标签,对页面进行模块化。每个标签里包含HTML,CSS,JS。

vue的组件就是一个vue对象。(vue的两大核心:数据驱动,组件化) 。vue对象的配置项,在vue组件里也可以使用。 ​ 组件的配置项如下: ​ 没有el属性。 ​ template:html模板代码,只能有一个根标签

data:必须是个函数 ​ methods:

………………………………

一个完整的标签格式是: <标签名 属性名=“属性值" 事件=”函数“>内容</标签名>

vue组件的基本使用(标签名):

1、定义组件:

第一种:

let 组件变量名= Vue.extend({
        template:'<div class="header">{{msg}},我是header组件</div>'
        data:function(){
            return {
                msg:”hi”
            }
        },
  });

第二种(简化写法):

let 组件变量名={
    template:'<div class="header">{{msg}},我是header组件</div>'
    data:function(){
        return {
            msg:”hi”
        }
    }
}; 
2、注册组件:

全局注册:

Vue.component('标签名',组件变量名);

全局注册的组件,在任何vue对象里都可以使用

局部注册:

//在vue对象的components选项里进行注册
new Vue({
     el:
     components:{
         标签名:组件变量名
     }     
});

局部注册的组件,只能在当前vue对象(组件)里使用。

3、使用组件:

组件就是自定义标签,所以,使用组件,就跟使用标签是同样的。

<标签名></标签名>

示例代码:

<body >
    <div id="box">
        <!--使用组件(组件就是自定义标签,所以,就是使用标签)-->
       <chat></chat>
    </div>
</body></html>
<script src="./js/vue.js"></script><script>// 定义组件
let chatObj = {
    template:`
        <div>
            <div style="width:200px;height:300px;border:1px solid black" v-html="msg"></div><br/>
            <input type="text" v-model="str" />
            <input type="button" value="发送" @click="send" />
        </div>
    `,
    data:function(){
        return{
            str:"",
            msg:""
        }
    },
    methods:{
        send(){
            this.msg += this.str+"<br/>"
            this.str ="";
        }
    }
};
​
// 2、全局注册
Vue.component("chat",chatObj);
     
let vm = new Vue({
        el: "#box",
        data: {
        },
        //局部注册:
        components:{
            "chat":chatObj
        }
    });
​
</script>
4、组件嵌套:

把一个组件的标签写在另外一个组件的template里,就是组件嵌套。

如:

  //子组件 
  let mycomson = {
        template:"<div>我是son里的div:{{msg}}</div>",    
        data:function(){
            return {
                msg:"hi:son"
            }
        }
    };
​
   //父组件
    let myComParent = {
        template:`<div>
                        <p>我是p:{{msg}}</p>
                        <my-com-son></my-com-son>                    
                    </div>`,
        data:function(){
            return {
                msg:"hi"
            }
        },
        components:{
            // 局部注册了另外一个组件
            "my-com-son":myComSon
        }    
    };
5、组件编写方式与 Vue 实例(对象)的区别:

1、组件的标签名不可和html官方的标签名同名,标签名如果小驼峰,那么使用时,用短横线(羊肉串的写法),或者组件名首字母大写(这个规则是在未来的单文件组件,模块化的写法里使用)。

2、组件没有el选项,只有根实例存在el,组件里使用template定义模板

3、组件模板(html代码)只能有一个根标签

4、data必须是个函数(面试题),vue组件的data为什么是个函数。

一个组件的 data 选项必须是一个函数,且要有返回object(就是vue对象的data),只有这样,每个实例(vue组件对象)就可以维护一份被返回对象的独立的拷贝,否则,组件复用时,数据相互影响。即:组件的作用域(应该)是独立的。

简单回答:如果不是函数,那么,复用的组件的data共享同一块内存空间。

组件的属性(标签的属性)

使用props(property的简写)来完成组件属性的声明。 props是外部给组件传入的数据。data是组件内部的数据。

使用 Prop 传递静态数据

1)、在组件内部增加配置项 props来声明组件里的属性。props里面可以声明多个属性,所以,是个数组。

​
let myComParent = {
        props:["name","sex"], //声明了两个自定义属性
        template:`<div>
                        <p>我是p:{{msg}}</p>     
                        <p>人的信息:</p>             
                        <p>姓名:{{name}}</p>             
                        <p>性别:{{sex}}</p>             
                    </div>`,
        data:function(){
            return {
                msg:"hi"
            }
        } 
    };

2)、使用组件时,给属性传入数据:

<!-- 使用组件时,给属性传入值,传入的值,就可以在组件内部使用 -->
<my-com-parent name="张三疯他哥" sex="男"></my-com-parent>