zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    [bzoj3172] [Tjoi2013]单词
    [luogu2664] 树上游戏
    [bzoj3307] 雨天的尾巴
    [bzoj3141] [HNOI2013]旅行
    [bzoj4515] [SDOI2016]游戏
    [bzoj3165] [HEOI2013]Segment
    Spring MVC-从零开始-view-直接返回页面不传data
    Spring MVC-从零开始-view-ViewResolver
    Spring MVC-从零开始-@RequestMapping结合@PathVariable (从URL路径中取值,作用于函数参数)
    Spring MVC-从零开始-@RequestMapping 注解headers 属性
  • 原文地址:https://www.cnblogs.com/hefeifei/p/11731290.html
Copyright © 2011-2022 走看看