zoukankan      html  css  js  c++  java
  • Vue——组件与复用

    组件(Component)是Vue.js最核心的功能。

    组件与Vue类似需要注册之后才可以使用。
    注册有全局注册和局部注册两种方式。全局注册后在任何Vue实例中都可以使用。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="vue.min.js"></script>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    </head>
    <body>
        <div id="app">
            <my-component></my-component>  <!--组件当作一个新的标签来使用-->
        </div>
        <script>
            // 全局组件
            // 注册
            Vue.component ('my-component',{
                template: '<div>组件测试001</div>'  //template的DOM结构必须被一个元素包裹着,否则无法显示
            });
            var app = new Vue({
                el: "#app",
    
            })
        </script>
    </body>
    </html>

    需要注意的是:template的DOM结构必须被一个元素包含,否则无法渲染。

    在Vue实例中,使用components选项可以局部注册组件,注册后的组件只有在该实例作用域下有效。
    同时组件中也可以使用components选项来注册组件。

    除了template选项外,组件中还可以像Vue实例那样使用其它选项,比如data、computed、methods等
    在使用data的时候,必须是以函数的形式,将数据return出来。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="vue.min.js"></script>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    </head>
    <body>
        <div id="app">
            <my-component></my-component>
        </div>
        <script>
            Vue.component('my-component',{
                template: '<div>{{ message }}</div>',
                data: function () {
                    return {
                        message: '组件中可以使用data、computed、methods等,但是使用data时,data必须是函数,然后将数据return出去'
                    }
                }
            });
            var app = new Vue({
                el: "#app",
            })
        </script>
    </body>
    </html>


    如果return出的对象引用了外部的一个对象,那么这个对象就是共享的,任何一处修改都会同步。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="vue.min.js"></script>
    </head>
    <body>
        <div id="app">
            <my-component></my-component>
            <my-component></my-component>
            <my-component></my-component>
        </div>
        <script>
            var data = {
              counter: 0
            };  // data属于全局变量,如果改变了所有组件都会跟着一起改变
    
    
            Vue.component('my-component',{
                template: '<button @click="counter++">{{ counter }}</button>',
                data: function () {
                    return data;  //  在组件中不自定义data,直接引用data.counter那么就是常量,永远为0,这属于两个不同的作用域
                }
            });
    
            var app = new Vue({
                el: "#app",  //为啥不能将data定义到app这个对象里面来,因为感觉有点多此一举
            });
    
        </script>
    </body>
    </html>

    效果:

    有一个修改所有的之都会与之修改。
    正确的做法如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="vue.min.js"></script>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    </head>
    <body>
        <div id="app">
            <my-component></my-component>
            <my-component></my-component>
            <my-component></my-component>
        </div>
        <script>
            Vue.component('my-component',{
                template: '<button @click="counter++">{{ counter }}</button>',
                data: function () {
                    return {
                        counter: 0
                    };  //每个组件都有一个自己的域
                }
            });
    
            var app = new Vue({
                el: "#app",
            })
        </script>
    </body>
    </html>

    效果:

    还有一点需要注意的是:
    Vue组件的模板在某些情况下会受到HTML元素的限制,比如table标签内只允许出现tr、td、th
    可以使用特殊的is属性来进行挂载。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="vue.min.js"></script>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    </head>
    <body>
        <!--<div id="app">-->
            <!--<table>-->
                <!--<my-component></my-component>-->
            <!--</table>-->
        <!--</div>-->
        <!--<div id="app"><div>组件测试001</div><table></table></div>-->
        <!--其实并没有渲染进去-->
        <div id="app">
            <table is="my-component"></table>
        </div>
        <!--<div id="app"><div>组件测试001</div></div>-->
        <!--tbody在渲染时会替换组件的内容-->
        <!--常见的限制性元素:<ul> <ol> <select>-->
        <script>
            Vue.component ('my-component',{
                template: '<div>组件测试001</div>'
            });
            var app = new Vue({
                el: "#app",
    
            })
        </script>
    </body>
    </html>
  • 相关阅读:
    数据卷Volume
    使用 Elastic Stack 分析地理空间数据 (二)
    使用 Elastic Stack 分析地理空间数据 (一)
    如何在 Docker 之上使用 Elastic Stack 和 Kafka 可视化公共交通
    Kubernetes网络模型
    举例:Network Policies
    配置Pod的 /etc/hosts
    k8s上安装安装 Ingress Controller &卸载
    logstash安装插件修改使用的gem源
    示例:Ingress通过互联网访问应用
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/12688084.html
Copyright © 2011-2022 走看看