Vue.js 组件与复用

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>组件与复用</title>
</head>
<body>

    <!--自动识别最新稳定版本的Vue.js-->
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>

    <div id="app">
        <my-component></my-component>
    </div>

    <script>
        Vue.component('my-component',{
            template:'<div>这里是组件的内容</div>'
        });

        var app = new Vue({
            el:'#app'
        })
    </script>

</body>
</html>

组件与复用.png
template 的 DOM 结构必须被一个元素包含,如果直接写成“这里是组件内容”,不带“<div> </div>” 是无法渲染的。
在Vue 实例中,使用components 选择可以局部注册组件,注册后的组件只有在该实例作用域中有效。组件中也可以使用components 选项来注册组件,使组件可以嵌套。例如:
<div id="app2">
        <my-component2></my-component2>
    </div>

 <script>
        var Child = {
            template:'<div>局部注册组件的内容</div>'
        }

        var app = new Vue({
            el:'#app2',
            components:{
                'my-component2':Child
            }
        })
    </script>

局部注册组件的内容.png
Vue 组件的模板在某些情况下会受到HTML的限制,比如<table>内规定只允许是<tr> 、 <td>、<th> 等这些表格元素,所以在<table>内直接使用组件是无效的。这种情况下,可以使用特殊的 is 属性来挂载组件,如下:
<div id="app3">
        <table>
            <tbody is="my-component3"></tbody>
        </table>
</div>

    <script>
        Vue.component('my-component3',{
            template:'<div>这里是组件的内容</div>'
        });

        var app = new Vue({
            el:'#app3'
        })
    </script>

tbody 在渲染时,会被替换为组件的内容。<ul>、<ol>、<select>。
IS属性.png
除了template选项外,组件中还可以像 Vue 实例那样使用其它的选项比如data、computed、methods 等。但是在使用 data 时,和实例稍有区别,data 必须是函数,然后将数据return 出去,例如:
    <div id="app4">
        <my-component4></my-component4>
    </div>
    
    <script>
        Vue.component('my-component4',{
            template:'<div>{{ message }}</div>',
            data:function(){
                return{
                    message:'组件内容4'
                }
            }
        });

        var app = new Vue({
            el:'#app4'
        })
    </script>

    
组件内容4.png
JavaScript 对象是引用关系,所以如果 return 出的对象引用外部的一个对象,那这个对象就是共享的,任何一个修改都会同步。比如下的示例:
    <div id="app5">
        <my-component5></my-component5>
        <my-component5></my-component5>
        <my-component5></my-component5>
    </div>

    <script>
        var data = {
            counter:0
        };

        Vue.component('my-component5',{
            template:'<button @click="counter++">{{ counter }}</button>',
            data:function(){
                return data;
            }
        });

        var app = new Vue({
            el:'#app5'
        })

    </script>


data.png
组件使用了3次,但是点击任意一个<button>,3个的数字都会加1,那是因为组件的data引用的是外部的对象,这肯定不是我们期望的效果,所以给组件返回一个新的data对象来独立,例如:
   <script>

        Vue.component('my-component5',{
            template:'<button @click="counter++">{{ counter }}</button>',
            data:function(){
                //return data;
                return {
                    counter:0
                }
            }
        });

        var app = new Vue({
            el:'#app5'
        })

    </script>

1.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 组件(Component)是Vue.js最核心的功能,也是整个架构设计最精彩的地方,当然也是最难掌握的。...
    六个周阅读 10,936评论 0 32
  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 8,673评论 0 25
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 6,666评论 0 6
  • 前言 记录平时学到的知识,标题写的大气一点,也算是给自己一点鼓励,希望在技术这条路可以远走越远,路越走越宽~ 文中...
    徐国军_plus阅读 5,583评论 3 28
  • 此文基于官方文档,里面部分例子有改动,加上了一些自己的理解 什么是组件? 组件(Component)是 Vue.j...
    陆志均阅读 9,245评论 5 14