zoukankan      html  css  js  c++  java
  • 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 特殊属 性挂载的组件可以达到效果。
    
    
     注意:如果我们使用的是字符串模板,是不受限制的。
  • 相关阅读:
    F
    Common Subsequence
    Neighbor House
    Robberies(背包)
    Stock Exchange(LIS最长上升子序列问题)
    Compromise(LCS)
    POJ-3356 AGTC (最短编辑距离问题)
    Monkey and Banana(LIS最长上升子序列)
    网络编程之网络协议
    面向对象高级
  • 原文地址:https://www.cnblogs.com/tszr/p/15395660.html
Copyright © 2011-2022 走看看