vue的组件和插槽

前言

大概记录学习vue的组件和插槽

一、vue组件

1.什么是组件

 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可。

组件化和模块化的不同:

  • 模块化:是从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一

  • 组件化:是从UI界面的角度进行划分的;前端的组件化,方便UI组件的重用

 2.组建的四种创建方式

1.使用 Vue.extend 配合 Vue.component 方法:

var login = Vue.extend({
    template: '<h1>登录</h1>'  });  Vue.component('login', login); 

 2.直接使用 Vue.component 方法:

Vue.component('register', {
    template: '<h1>注册</h1>'  });

3.将模板字符串,定义到script标签中:

<script id="tmpl" type="x-template">
    <div><a href="#">登录</a> | <a href="#">注册</a></div> 
 </script>

 同时,需要使用 Vue.component 来定义组件:

Vue.component('account', {
    template: '#tmpl'  });

 4.将模板字符串,定义到template标签中:

< template id="tmpl">
    <div><a href="#">登录</a> | <a href="#">注册</a></div> 
 </ template >

同时,需要使用 Vue.component 来定义组件:

Vue.component('account', {
    template: '#tmpl'  });

注意:现在几乎都是使用第四种方法创建,前三种了解即可 

5. 组件中展示数据和响应事件

组件中 展示数据和在vue视图层中一样,数据用{ {}}包裹,通过@绑定事件,:绑定属性

 <template id="login">
    <div>
    {
   
   {msg}}
    <button @click="add">加加</button>
    </div>
  </template>

在组件实例中需要同样定义data和methods对象,但是 在组件中,data需要被定义为一个方法:

Vue.component('login',{
      template:'#login',
      data(){
        return {
          msg:0
        }
      },
      methods:{ 
        add(){
          this.msg++
        }
      }
    })

二、vue 插槽

1.什么是插槽?

插槽就是子组件中的提供给父组件使用的一个占位符,用<slot></slot> 表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。

1.插槽的使用:在子组件中放一个占位符

<template id="course">
        <h2><slot></slot>课程</h2>
</template>

2.在父组件中给这个占位符填充内容:

<div id="app">
			<course>免费</course>
			<course>精品</course>
			<course>限时折扣</course>
		</div>

但是此时有个问题,如果组件内有多个插槽,则只能填充第一个插槽,无法给具体的插槽填充不同的值,此时就需要具名插槽

3.具名插槽

具名插槽其实就是给插槽娶个名字。一个子组件可以放多个插槽,而且可以放在不同的地方,而父组件填充内容时,可以根据这个名字把内容填充到对应插槽中。

1. 子组件的代码,设置了两个插槽(header和footer):

<template id="course">
        <h2><slot name="header"></slot>课程</h2>
        <h2><slot name="footer"></slot>课程</h2>
</template>

2.父组件填充内容, 父组件通过 v-slot:[name] 的方式指定到对应的插槽中 

    <div id="app">
		<course>
            <template v-slot:header>
                顶部
            </template>
            <template v-slot:footer>
                底部
            </template>
        </course>
	</div>

猜你喜欢

转载自blog.csdn.net/weixin_53583255/article/details/126999146