Vue 组件

组件

  组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以表现为用 js 特性进行了扩展的原生 HTML 元素。

总结:

   组件是用来完成特点功能的一个自定义的HTML标签
 例如:

<body>
    <mytag></mytag>
</body>

注意: mytag就是一个组件, 该组件必须通过Vue为mytag赋予一定的功能

组件的作用

组件是对特点功能代码(html,css,js)的封装, 通过组件的名字可以重复利用该组件中的代码.

组件分类

全局组件和局部组件

全局组件

1全局组件的语法:
   Vue.component("自定义标签的名字",{配置对象})

2. 全局组件的特点:
   2.1  全局组件可以在任何被挂着的标签中使用.
   2.2  全局组件的配置对象中必须包含template属性

3. 注意事项:
    template中的html必须在一个标签中. 仅且只能有一个根节点.

4. 全局组件应用场景
   如果该组件的特定功能需要在任何被挂着的标签中使用. 推荐使用全局组件

<div id="app">
    <mycomponent1></mycomponent1>
    <mycomponent2></mycomponent2>
</div>

<div id="app1">
    <mycomponent1></mycomponent1>
    <mycomponent2></mycomponent2>
</div>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
    //>>1. 定义第一个全局组件
    Vue.component("mycomponent1",{
        template : "<h1>这是第一个全局组件</h1>"
    })

    //>>2. 定义第二个全局组件
    var component2Config = {
        template : "<h1>这是第二个全局组件</h1>"
    };
    Vue.component("mycomponent2",component2Config);

    var app = new Vue({
        el: "#app",
        data: {
        }
    });

    var app1 = new Vue({
        el: "#app1",
        data: {
        }
    });
</script>

局部组件

1. 局部语法:

   var app = new Vue({
    el: "#app",
    data: {},
    components : {
        "局部组件的名字1" : {组件的配置对象}
        "局部组件的名字2" : {组件的配置对象}
    }
  });

2. 局部组件的特点
   局部组件只能够在所挂载的标签中使用.

<div id="app1">
    <mycomponent></mycomponent>
</div>
<div id="app2">
    <mycomponent></mycomponent>
</div>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">

    //>>1. 在id=app1挂载的实例的components中定义局部组件
    var app1 = new Vue({
        el: "#app1",
        data: {},
        components : {
            "mycomponent" : {
                template : "<h1>这是一个局部组件</h1>"
            }
        }
    });

    //>>2. 在id=app2的标签中是不能够使用上面app2对象的局部组件.
    var app2 = new Vue({
        el: "#app2",
        data: {}
    });
</script>

组件使用两种HTML模板

两种方式
   1 直接在template属性写上html代码字符串
        template: "html代码的字符串"

   2 将当前网页中的html标签作为模板代码 (大量的HTML不用拼装HTML字符串)
      a. 在网页中定义template标签或者script标签包含模板中需要的html模板代码
       <!--
       <template id="mytemplate">
            <h1>template标签中的html</h1>
        </template>

       <script type="text/template" id="mytemplate">
            <h1>template标签中的html</h1>
        </script>

        -->
      b. template属性上使用上门的html模板代码.
       <!--
        "mycomponent2":{
              template: "#mytemplate" ,  #代表找到对应的html代码作为当前组件的模板代码
        }-->

   3.注意事项:
    如果是script的话建议加上 type="text/template"

<div id="app">
    <mycomponent1></mycomponent1>
    <mycomponent2></mycomponent2>
    <mycomponent3></mycomponent3>
</div>


<template id="mytemplate2">
    <h1>template标签中的html</h1>
</template>
<script type="text/template" id="mytemplate3">
    <h1>script标签中的html</h1>
</script>

<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {},
        components:{
            "mycomponent1":{
                template: "<h1>这是html标签代码字符串</h1>"
            },
            "mycomponent2":{
                template: "#mytemplate2"
           },
            "mycomponent3":{
                template: "#mytemplate3"
            }
        }
    });
</script>

组件中的数据必须是函数

1. 组件中数据的定义
   语法:

      "组件的名字":{
            template: "",
            data : function(){
                return {
                  键1:值1,
                  键2:值2
                }
            }
       }

2.注意事项:
    2.1  data数据只能够以函数的形式返回,因为函数中可用写其他的业务代码
    2.2  只能够在各自的组件模板中使用各自的组件中的data数据
    2.3  Vue对象中的数据不能够在组件中使用.  组件的数据也不能够在挂载的html标签上使用.

<div id="app">
    {{message}}
    <mycomponent1></mycomponent1>
    <mycomponent2></mycomponent2>
    <mycomponent3></mycomponent3>
</div>


<template id="mytemplate2">
    <h1>template标签中的html--- {{message}}</h1>
</template>

<script type="text/template" id="mytemplate3">
    <h1>script标签中的html--- {{message}}</h1>
</script>

<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
    var app = new Vue({
        el: "#app",
        data: {
            message: "这是app中的data数据"
        },
        components:{
            "mycomponent1":{
                template: "<h1>这是html标签代码字符串---{{message}}</h1>",
                data :function () {
                    return {
                        message:"组件mycomponent1中的数据"
                    }
                }
            },
            "mycomponent2":{
                template: "#mytemplate2",
                data :function () {
                    return {
                        message:"组件mycomponent2中的数据"
                    }
                }
            },
            "mycomponent3":{
               template: "#mytemplate3",
                data :function () {
                    return {
                        message:"组件mycomponent3中的数据"
                    }
                }
            }
        }
    });

组件中使用引用数据的问题

1. 注意事项:
    1.1 当组件返回一个全新的对象时, 组件在每次使用时都会使用各自的数据对象.
    1.2 当组件返回一个引用的已经存在的对象时, 每个组件都会公用同一个数据对象.

1.<div id="app">
2.    <mycomponent></mycomponent>
3.    <mycomponent></mycomponent>
4.    <mycomponent></mycomponent>
5.    <mycomponent></mycomponent>
6.</div>
7.
8.
9.<template id="mytemplate">
10.    <button @click="counter++">{{counter}}</button>
11.</template>
12.
13.<script type="text/javascript" src="../js/vue.js"></script>
14.<script type="text/javascript">
15.    var data ={ counter: 1};
16.    var app = new Vue({
17.        el: "#app",
18.        components: {
19.            "mycomponent": {
20.                template: "#mytemplate",
21.                /*
22.                该data函数在组件被每次使用时都返回一个全新的对象.
23.                data: function () {
24.                        return {
25.                            counter: 1
26.                        }
27.                },*/
28.
29.                //该data函数在组件被每次使用时公用同一个数据对象.
30.                data: function () {
31.                        return data;
32.                },
33.
34.            }
35.        }
36.    });
37.</script>

组件的父子关系

1. 语法:
    Vue.component("父组件的名字",{
        template: 'html <子组件名字></子组件名字>   html',
        components :{
            子组件的名字: {
                template : "子组件的模板"
            }
        }
    });

   定义在父组件中的组件叫做子组件

2. 注意事项
    2.1 父子模板的html都可以是一个template标签或者script标签
    2.2 子组件只能够在父组件中使用
    2.3.这种写法也适用于局部组件.
    4.4.子组件中可以继续定义子组件

1.<div id="app">
2.    <parent></parent>
3.</div>
4.<script type="text/javascript" src="../js/vue.js"></script>
5.<script type="text/javascript">
6.    Vue.component("parent",{
7.        template: "<h1>这是父模板 <child></child></h1>",
8.        components:{
9.            child:{
10.                template: "<h1>这是子模板</h1>"
11.            }
12.        }
13.    });
14.    var app = new Vue({
15.        el: "#app"
16.    });
17.</script>

Vue应用中的数据给顶级组件

因为每个组件都是独立的. 相互不能够默认情况下相互不能够共享数据.

语法:
    1 期望数据
    Vue.component("mycompenent",{
        props: ["期望数据的名字1", "期望数据的名字2"],
        template: "{{期望数据的名字1}}   {{期望数据的名字2}}",
    });
    var app = new Vue({
        el: "#app",
        data :{
            age :29
        }
    });

    2 在Vue挂着的标签中为组件传递数据
      <mycompenent 期望数据的名字1="值1" :期望数据的名字1="值2"></mycompenent>

语法解释:
  1. 子组件要显式地用 props 选项声明它预期的数据.
  2. 在父组件中使用子组件时, 通过标签属性的形式传递过来. 标签的数据不能够使用功能{{}},只能够使用数据绑定
  3. 如果属性是带有中划线的, 在props中一定要使用驼峰式的写法.

1.<div id="app">
2.    <mycompenent name="小花" :age="age"></mycompenent>
3.</div>
4.<script type="text/javascript" src="../js/vue.js"></script>
5.<script type="text/javascript">
6.    Vue.component("mycompenent",{
7.        props: ["name", "age"],
8.        template: "<h1>姓名: {{name}} 年龄:{{age}}</h1>",
9.    });
10.    var app = new Vue({
11.        el: "#app",
12.        data :{
13.            age :29
14.        }
15.    });
16.</script>

父组件的数据传递给子组件

语法:

    Vue.component("父组件的名字",{
        template: 'html <子组件名字 期望数据的名字1="表达式" 期望数据的名字2="表达式"></子组件名字>   html',
        components :{
            子组件的名字: {
                props:["期望数据的名字1","期望数据的名字2"]
                template : "子组件的模板"
            }
        }
    });

  语法解释:
    1. 子组件要显式地用 props 选项声明它预期的数据.
    2. 在父组件中使用子组件时, 通过标签属性的形式传递过来. 标签的数据不能够使用功能{{}},只能够使用数据绑定
    3. 如果属性是带有中划线的, 在props中一定要使用驼峰式的写法.

1.<div id="app">
2.    <parent></parent>
3.</div>
4.<script type="text/javascript" src="../js/vue.js"></script>
5.<script type="text/javascript">
6.    Vue.component("parent",{
7.        template: "<h1>这是父模板 <child name='张三' :student-age='age'></child></h1>",
8.        data : function () {
9.            return {
10.                age : 29
11.            }
12.        },
13.        components:{
14.            child:{
15.                props:["name","studentAge"],
16.                template: "<h1>这是子模板 姓名:{{name}} 年龄:{{studentAge}}</h1>"
17.            }
18.        }
19.    });
20.    var app = new Vue({
21.        el: "#app",
22.    });
23.    console.log(app);
</script>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时小浅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值