2

什么是组件

组件,其实很好理解,就是造轮子。比如,这里是一个任务列表:

<div id="tasklist">
    <ul>
        <li>做作业</li>
        <li>写报告</li>
        <li>读书</li>
        <li>打扫</li>
    </ul>
</div>

我们完全可以将其封装成组件,然后写成以下这种形式:

<task-list>
    <task>打扫房间</task>
    <task>做作业</task>
    <task>写报告</task>
    <task>读书</task>
</task-list>

这样做,可读性是不是提高了很多?而且也更利于复用。接下来我们来一步步实现任务列表组件

任务列表组件实现

Vue 注册组件,采用的是 Vue.component() 的方法,传入标签名与可选项。我们先来定义 task

<div id="root">
    <task>做作业</task>
    <task>写报告</task>
    <task>读书</task>
    <task>打扫</task>
    <task></task>
</div>

<script>
    Vue.component('task',{
        template:'<li><slot>默认内容</slot></li>'
    })

    new Vue({
        el: '#root'
    });    
</script>

template 用于定义组件的 HTML 视图。其中,<slot> 作为原始元素的插槽,自定义的内容将会取代 <slot>。如果没有自定义内容,就会显示默认的内容。

浏览器显示:

做作业
写报告
读书
打扫
默认内容

现在,我们来定义 task-list 组件:

<div id="root">
    <task-list></task-list>
</div>

<script>

    Vue.component('task-list',{
        template:`
            <div>
                <task>做作业</task>
                <task>写报告</task>
                <task>读书</task>
                <task>打扫</task>
            </div>
        `
    })

    Vue.component('task',{
        template:’<li><slot></slot></li>’
    })

    new Vue({
        el: '#root'
    });    
</script>

首先,创建了一个 task-list 组件,并且在组件中调用了 task 组件。组件模板必须包括一个共同的根元素,因此定义了一个根元素 div

这样做不过是做了最简单的封装,我们希望任务列表以变量的方式传递进去,完全没问题。组件其实跟 Vue 实例类似,也可以使用 methodscomputed 等。

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/vue/2.2.6/vue.js"></script>
    
</head>
<body>
    <div id="root">
        <task-list>
        </task-list>
    </div>

    <script>

        Vue.component('task-list',{
            template:`
                <div>
                    <task v-for="task in tasks">{{task.description}}</task>
                </div>
            `,
            data () {
                return {
                    tasks : [
                        {description:"编程",uncompleted:true},
                        {description:"锻炼",uncompleted:false},
                        {description:"阅读",uncompleted:true},
                        {description:"睡觉",uncompleted:false}
                    ]
                }        
            }
        });

        Vue.component('task',{
            template:'<li><slot></slot></li>'
        });

        new Vue({
            el: '#root'
        });    
    </script>
</body>
</html>

特别要注意的是,组件中的 data 需要使用函数形式。这是因为,假如使用 data 属性并且在视图中如果定义多个 <task-list></task-list>,那么它们之间就会共享该属性,造成相互影响。

本节只是初步了解组件,接下来会创建更为实用的组件。


心智极客
1k 声望645 粉丝