web前端 -- vue -- vue组件 & vue实例

根据千峰教育学习视频所练习的笔记 | 学习一段时间,我也有写一点东西的必要了···

1. vue组件介绍

  • 组件系统是将一个大型的界面切分成一个一个更小的可控单元
  • 组件是复用(同一个头部可以用在游戏、微信、qq中)的,可维护的
  • 组件具有强大的封装性,易于使用
  • 大型应用中,组件与组件之间交互可以解耦操作

2. 创建vue组件

  • 全局组件
  • 局部组件

2.1. 先来看全局组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件</title>
    <script src="../vue.js"></script>
</head>
<body>
<div id="app">
<!--    使用自定义组件(标签)-->
    <my-header></my-header>
</div>
<div id="app2">
    <my-header></my-header>
</div>
<script>
 <!--    全局组件-->
<!--Vue.component定义组件,参数为组件名字,组件名字相当于我们自定义的标签-->
    Vue.component('my-header',{
        template:'<h2>标题</h2>'
    });
<!-- template对组件进行模板替换,替换成真实的html结构-->
    var vm = new Vue({
        el:'#app' <!--通过id来找,具有唯一性-->
    });
    var vm = new Vue({
        el:'#app2'
    });
</script>
</body>
</html>
  • 写好了之后我们看看组件能不能把模板渲染到<div>标签上:
![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024114035174-658047033.png)
  • 我们再来写一个<div>容器,id 为 app2,并为它创建一个实例:
<body>
···
<div id="app2">
    <my-header></my-header>
</div>
<script>
    ······
        el:'#app'
    });
    var vm = new Vue({
        el:'#app2'
    });
</script>
</body>

其实这个时候,也是可以渲染出组件的:

![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024114055685-1592895677.png)

因为这个vue组件是全局的,可以在 app 里用,也可以在 app2 里用。

2.2. 局部组件

除了创建全局组件之外,我们还能创建局部组件

  • 局部组件就是在单独创建的实例中进行创建,在这里我们要写配置,就是代码里的components
<body>
···
<div id="app2">
    <my-header></my-header>
</div>
<script>
    var vm = new Vue({
        el:'#app',
        components: {
            'my-header':{
                template:'<h2>标题</h2>'
            }
        }
    });
</script>
</body>
  • 我们看一下效果:可以知道全局组件和局部组件还是有区别的
![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024114108330-1042865763.png)

3. 组件数据的特点

我们能不能让自己创建的 vue 实例里的 data 下面的属性在组件中使用呢?试一下!

  • 我们先去vue实例下添加data
<script>
    var vm = new Vue({
        el:'#app',
        data:{
            //定义成对象 message
            message:'hello vue !'
        },
        components: {
            'my-header':{
                template:'<h2>标题</h2>'
            }
        }
    });
</script>
  • 接着,我们到<div>容器中渲染 message ,页面上就出来了:
<div id="app">
    {{message}}
    <my-header></my-header>
</div>
<div id="app2">
    ······
</div>
![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024114119132-118546746.png)
  • 那么我们这个{{message}}在实例下定义的数据不能在组件中用?我们到组件模板中去调用试一下:
<div id="app">
    <!-- {{message}} -->
    <my-header></my-header>
</div>
<div id="app2">
    ······
</div>
<script>
    var vm = new Vue({
        ······
        components: {
            'my-header':{
                template:'<h2>标题{{message}}</h2>'
            }
        }
    });
</script>

  • 大家可以看到,并不能找到 message 。因为数据是不共享的,是为了防止冲突和耦合性。所以说,message只能在容器中使用,在组件中是调用不到的。
![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024114128837-765625922.png)
  • 那么,我想要在组件中用到数据,就要用到组件提供的 data 配置了
<div id="app">
    <my-header></my-header>
</div>
<div id="app2">
    <my-header></my-header>
</div>
<script>
    var vm = new Vue({
        el:'#app',
        data:{
            message:'hello vue !'
        },
        components: {
            'my-header':{
                template:'<h2>标题{{message}}</h2>',
//在组件中使用数据(就不能写成对象了):组件中定义function函数,并用return返回 
                data:function () {
                    return{
                        message:'nice to meet you'
                    };
                }

            }
        }
    });
</script>
  • 这会儿我们就看到打印的是data配置里的message,不再是先前的hello vue 了。
![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024114141466-648031796.png)

4. vue实例与vue组件的关系

  • 所有的vue组件其实都是被扩展的vue实例,就是vue组件可以继承vue实例。

5. 补充:vue组件的模板语法规范

  • 根据之前的学习,我们可以知道,在组件中可以写上 template (模板)。当数据比较少的时候,是没有什么问题的,我们可以写作一行。当模板复杂起来之后,一行很长不方便阅读,我们有更好的方式对待。

  • 如图:我想在message下面加一些列表

![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024114153889-1390209271.png)
template:'<div><h2>{{message}}</h2><ul><li>张一山</li></ul> <ul><li>吴京</li></ul><ul><li>李现</li></ul><ul><li>肖战</li></ul></div>',

5.可以看到这样的代码看起来不太方便,现在我们进行一些处理:

  • \
template:'<div>\
                <h2>{{message}}</h2>\
                <ul>\
                    <li>张一山</li>\
                </ul>\
                <ul>\
                    <li>吴京</li>\
                </ul>\
                <ul>\
                    <li>李现</li>\
                </ul>\
                <ul>\
                    <li>肖战</li>\
                </ul>\
           </div>',

哈哈,这样写也不太方便

  • 用``
template:`<div>
                <h2>{{message}}</h2>
                <ul>
                    <li>张一山</li>
                </ul>
                <ul>
                    <li>吴京</li>
                </ul>
                <ul>
                    <li>李现</li>
                </ul>
                <ul>
                    <li>肖战</li>
                </ul>
        </div>`,
  • <template> 模板标签:在HTML下面写一个<template>标签,再把列表结构放进去。写好之后,我们可以通过id找到这个模板
<body>
<div id="app">
    ······
</div>
<template id="temp">
    <div>
        ······
    </div>
</template>
<script>
    var vm = new Vue({
        el:'#app',
        components:{
            'my-header':{
                template:'#temp',
                data:function () {
                    return{
                        message: 'hello my idol'
                    };
                }
            }
        }
    });
</script>
</body>
  • 还可以使用<scripr type="text/x-template">,但是一定要写type类型,不然会按js方式解析。
<script type="text/x-template" id="temp">
    <div>
        ······
    </div>
</script>
<script>
    ······
</script>
posted @ 2019-10-24 11:42  菲菲的超级粉丝  阅读(1684)  评论(0编辑  收藏  举报