Vue03——组件

Vue组件

什么是组件?
简单说组件是我们自己定义的可供我们重复调用标签或者代码块,以减少重复代码的出现,提高网页的性能。

组件分为:

  • 全局组件
  • 局部组件

使用方式:定义组件 → 注册组件

定义组件

  • 定义一个名为Hello的组件
//1.定义组件
    let Hello = Vue.extend({
        template:"<h1>我是h1标签。。</h1>"
    })

注册组件

  • 注册组件时需要声明你注册的组件名,和你引用的是你定义哪个组件
  • 这里注册一个名为“my-header” 引用Hello的组件
  • 【注】需要注意的是,注册的组件名默认不能和HTML内的标签同名,如果同名要用is方法,后面说is
//2.全局注册组件
    Vue.component("my-header",Hello)

全局组件和局部组件的区别在于注册位置的不同

  • 局部组件注册,在Vue实例里注册
//1 创建组件
    var Hello = Vue.extend({
        template:"<p>我是局部组件!</p>"
    })

    new Vue({
        el:"#app",
        //2.局部组件
        components:{
            'my-header':Hello
        }
    });

全局组件创建过程

1、Vue.extend({templat:""})
2、Vue.component(组件名称,组件)

可以简写为

Vue.component("my-header",{
        template:"<h3>我是h3标签...</h3>"
    })
组件注册完成后就可以在body中使用了
<body>
    <div id="app">
        <my-header></my-header>
        <aaa></aaa>
    </div>
    
    <div id="app2">
    </div>
</body>
<script src="./base/vue.js"></script>

<script>
    //局部组件
    // var Header = Vue.extend({
    //     template:"<h3>我是h3标签...</h3>"
    // })
    var vm = new Vue({
        el: "#app",
        //局部组件注册
        components:{
            "my-header":{
                template:"<h3>我是h3标签...</h3>"
            },
            "aaa":{
                template:"<span>我是span元素!</span>"
            }
        }
    })

    new Vue({
        el:"#app2"
    })
</script>
组件嵌套

在vue中,项目结构都是这样的:一个根实例,
里面有大量的组件,组件都可以形成嵌套关系
在vue中,组件嵌套只能形成父子关系,
对于全局组件来说,父子关系只是存在于嵌套的时候
子组件只能在父组件的模板里面进行调用!!!

new Vue({
        el:"#app",
        components:{
            father:{ //父组件
                template:"<div>father组件! <son></son></div>",
                components:{
                    son:{ //子组件
                        template:"<div>son组件!</div>"
                    }
                }
            }
        }
    });
解析规则:
  • 因为Vue在解析模板的时候会根据某些html规则,例如表格中只能放 tr td等规则,如果放入组件不会被解析,会强制放到table的外层,这时候应该在tr中加入一个 is方法,可以将组件强制放到table中

这里将一个div放到table中,默认情况下div会跑到table的外层

<body>
    <div id="app">
        <p>这是个table!</p>
            <table>  
                <tr><hello></hello></tr>
            </table>       
    </div>
</body>
<script src="./base/vue.js"></script>
<script>
    // 因为vue在解析模板的时候会根据某些html的规则,
    //例如,在table里只能放tr,td,th..,如果放入组件不会解析
    //放入tr标签使用is方式,代表tr标签引入的是一个组件
    Vue.component("hello",{
        template:"<div>我是hello!</div>"
    })
    new Vue({
        el:'#app'
    })
</script>

结构图
但是在表格中插入div并没有任何意义,如果要强制插入可以采用is方法,将tr强制替换成div

<div id="app">
        <p>这是个table!</p>
            <table>  
                <tr is="hello"></tr>
            </table>       
    </div>

在这里插入图片描述

创建组件时,模板的外层必须有且只能有一个根元素

例如: (这是错误写法)

Vue.component("hello",{
        template:"<div>我是hello!</div><p>我是p</p>"
    })

正确写法:

Vue.component("hello",{
        template:"<div><div>我是hello!</div><p>我是p</p></div>"
    })

外层必须有且只有一个根元素!!

当然我们写组件为了方便,在vue中写起来hin不方便。我们可以在body下将模板写在< template >标签下,必须只能用id作为标记

<body>
    <div id="app">
        <m-header></m-header>
    </div>
  
    <!--定义组件的模板  并且模板外面只能有一个根元素-->
    <template id="header">
        <div>
            <h3>我是header!</h3>
            <p>ppppp1</p>
            <a>asasda阿萨德</a>
        </div>
    </template>
</body>
<script src="./base/vue.js"></script>
<script>
    // 可以在body里创建template模板标签在组件里指定template,
    //必须只能用id作为标记
    //模板内容外层必须有且只能有一个根元素
   
    Vue.component("m-header",{
        template:"#header"
    })
    var vm = new Vue({
        el:"#app",
    })
</script>
做个案例,点击按钮来切换组件 (通过is实现)
<body>
    <div id="app">
        <button @click="comp=(comp==='my-a'?'my-b':'my-a')">切换组件</button>
        <component :is="comp"></component>
    </div>
</body>
<script src="./base/vue.js"></script>
<script>
    //通过 :is 这个属性可以实现组件之间的切换
    Vue.component("my-a",{
        template:"<h1>我是my-a组件!</h1>"
    })
    Vue.component("my-b",{
        template:"<h1>我是my-b组件!</h1>"
    })
    new Vue({
        el:"#app",
        data:{
            comp:"my-a"
        }
    })
</script>

《个人笔记》

组件Vue.js 最重要的概念之一。组件可以让我们将 UI 拆分为独立、可复用的部件,使得代码更加清晰、易于维护。在 Vue.js 组件可以分为全局组件和局部组件,其全局组件可在任何地方使用,而局部组件只能在其父组件使用。 定义组件时,需要使用 Vue.component() 方法,该方法需要传入两个参数:组件名称和组件配置对象。组件名称应该采用 kebab-case(短横线分隔命名)格式,以便在 HTML 使用。 示例代码如下: ```javascript // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>' }) ``` 在上述代码,我们定义了一个名为 button-counter 的组件,该组件包含一个计数器,每次点击按钮计数器加一。 在 HTML 使用组件时,需要使用组件名称作为自定义标签来调用组件。示例代码如下: ```html <div id="app"> <button-counter></button-counter> </div> ``` 在上述代码,我们调用了 button-counter 组件,并将其渲染到了 id 为 app 的 div 元素。 除了组件的 data 和 template 属性外,还可以使用 props 属性来传递组件之间的数据。使用 props 时,需要在组件的配置对象定义 props 属性,并在 HTML 使用 v-bind 指令来传递数据。 示例代码如下: ```javascript // 定义一个名为 todo-item 的新组件 Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app', data: { groceryList: [ { id: 0, text: '蔬菜' }, { id: 1, text: '水果' }, { id: 2, text: '奶酪' } ] } }) ``` 在上述代码,我们定义了一个名为 todo-item 的组件,并使用 props 属性定义了一个名为 todo 的 prop。在 HTML ,我们使用 v-bind 指令将 groceryList 数组的每个对象传递给了 todo-item 组件。示例代码如下: ```html <div id="app"> <ul> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"></todo-item> </ul> </div> ``` 在上述代码,我们使用 v-for 指令遍历 groceryList 数组,并使用 v-bind 指令将数组的每个对象传递给了 todo-item 组件。注意,我们还需要使用 v-bind:key 指令来为每个列表项指定一个唯一的 key 值。 插槽是 Vue.js 另一个重要的概念。插槽可以让父组件在子组件插入任意的 HTML 内容,使得组件更加灵活、可复用。 在子组件,使用 <slot> 标签来定义插槽。在父组件,使用子组件的自定义标签来调用组件,并在标签内部插入 HTML 内容。示例代码如下: ```javascript // 定义一个名为 alert-box 的新组件 Vue.component('alert-box', { template: ` <div class="alert-box"> <strong>Error!</strong> <slot></slot> </div> ` }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app' }) ``` 在上述代码,我们定义了一个名为 alert-box 的组件,并在组件定义了一个插槽。在 HTML ,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。示例代码如下: ```html <div id="app"> <alert-box> <p>Something bad happened.</p> </alert-box> </div> ``` 在上述代码,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。该 HTML 内容会被插入到 alert-box 组件的插槽
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值