VUE学习笔记--什么是组件

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="components-demo">
    <button-counter></button-counter>
    <button-counter></button-counter>
</div>
<script>
    // 定义一个名为 button-counter 的新组件
    Vue.component('button-counter', {
        data: function () {
            return {
                count: 0
            }
        },
        template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
    })
    new Vue({ el: '#components-demo' })
</script>
</body>
</html>
这些类似于<button-counter>没见过的标签就是组件,每个标签代表一个组件,这样我们 就可以将组件进行任意次数的复用。 
使用组件的好处:
提高开发效率  
方便重复使用 
简化调试步骤 
提升整个项目的课维护性 
便于协同开发

组件系统让我们可以用独立可复用的小组件来构建大型应用,
几乎任意类型的应用的界面都可以抽象为一个组件树
全局注册
全局注册有三种方式。 
要注册一个全局组件,我们可以使用 Vue.component(tagName,options),代码如下:
Vue.component('my-component', {
        // 选项
 })

示例代码如下:
<div id="app">
    <my-component></my-component>
</div>
<script>
    Vue.component('my-component', {
        template: '<h1>注册</h1>'
    });
    var vm=new Vue({
        el:'#app'
    })
</script>
组件的基本使用

使用 Vue.extend 配合 Vue.component 方法,代码如下

<div id="app">
    <my-list></my-list>
</div>
<script>
    var list=Vue.extend({
        template:'<h1>this is a list</h1>',
    });
    Vue.component("my-list",list);
    //根实例
    new Vue({
        el:"#app",
    })
</script>
将模板字符串,定义到 script 标签中,示例代码如下:
<div id="app">
    <account></account>
</div>
<template id="tmpl">
    <div><a href="#">登录</a> | <a href="#">注册</a></div>
</template>
<script>
    Vue.component('account', {
        template: '#tmpl'
    });
    new Vue({
        el:"#app",
    })
</script>
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <account></account>
</div>
<template id="tmpl">
    <div><a href="#">登录</a> | <a href="#">注册</a></div>
</template>
<script>
    Vue.component('account', {
        template: '#tmpl'
    });
    new Vue({
        el:"#app",
    })
</script>
</body>
</html>
局部注册
如果不需要全局注册,或者是让组件使用在其它组件内,可以用选项对象的 components 属性实现局部注册,示例代码如下:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <account></account>
</div>
<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {},
        components: { // 定义子组件
            account: { // account 组件
                template: '<div><h1>这是Account组</h1><login></login></div>',                            // 在这里使用定义的子组件
                components: { // 定义子组件的子组件
                    login: { // login 组件
                        template: "<h3>这是登录组件</h3>"
                    }
                }
            }
        }
    });
</script>
</body>
</html>
可以使用“flag”标识符结合“v-if”和“v-else”切换组件

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="button" value="toggle" @click="flag=!flag">
    <account v-if="flag"></account>
    <login v-else="flag"></login>
</div>
<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
        el: '#app',
        data: {
            flag: true
        },
        methods: {},
        components: { // 定义子组件
            account: { // account 组件
                template: '<div><h1>这是Account组件</h1></div>', // 在这里使用定义的子组件
            },
            login: { // login 组件
                template: "<h3>这是登录组件</h3>"
            }
        }
    });
</script>
</body>
</html>
DOM模板解析说明
在自定义组件中使用这些受限制的元素时会导致一些问题
<table> 
      <my-row>...</my-row>
 </table>

自定义组件被认为是无效的内容,因此在渲染的时候会导致错误。这时要使用特殊的 is 属性来挂载组件,如下:

<table> 
    <tr is="my-row"></tr> 
</table>
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
    <table border="1" cellpadding="5" cellspacing="0">
        <my-row></my-row>
        <tr is="my-row"></tr>
    </table>
</div>
<script type="text/javascript">
    new Vue({
        el:'#app',
        components:{
            myRow:{
                template:'<tr><td>123456</td></tr>'
            }
        }
    });
</script>
</body>
</html>
直接引用<my-row>组件标签并没有被<table>标签包裹,而用 is 特殊属 性挂载的组件可以达到效果。


 注意:如果我们使用的是字符串模板,是不受限制的。
原文地址:https://www.cnblogs.com/tszr/p/15395660.html