Vue 封装组件以及插槽的使用

Vue 封装组件插槽的使用

封装组件

Vue 开发中,不可避免的需要封装一些常用的组件,比如 form 组件、 dialog 组件等等。

封装组件的步骤如下:

  1. 创建一个 Vue 组件文件,文件名以 xxx.vue 命名,比如 my-form.vue
  2. 在组件的 template 标签中,使用 slot 插槽来定义组件的结构;
  3. 在组件的 script 标签中,定义组件的 propsdata
  4. 在组件的 script 标签中,定义组件的 methods
  5. 在组件的 script 标签中,定义组件的 created 钩子函数,在这里调用 propsdata 的初始化方法;
  6. 在组件的 script 标签中,定义组件的 template 标签,在这里使用 slot 插槽来渲染组件的结构;

组件的使用

在使用组件时,需要在父组件的 template 标签中,使用 <my-form> 标签来引用组件,并通过 props 传递数据。

<template>
  <div>
    <h1>父组件</h1>
    <my-form :form-data="formData"></my-form>
  </div>
</template>

<script>
import myForm from './my-form.vue'

export default {
  name: 'Parent',
  components: {
    myForm
  },
  data() {
    return {
      formData: {
        name: '张三',
        age: 20
      }
    }
  }
}
</script>

my-form.vue 组件中,通过 slot 插槽来定义组件的结构,并在 script 标签中定义组件的 propsdata

<template>
  <div>
    <h2>子组件</h2>
    <form>
      <label>
        姓名:
        <input type="text" v-model="name">
      </label>
      <label>
        年龄:
        <input type="number" v-model="age">
      </label>
      <button type="button" @click="handleSubmit">提交</button>
    </form>
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: 'myForm',
  props: {
    formData: {
      type: Object,
      default: () => ({})
    }
  },
  data() {
    return {
      name: this.formData.name,
      age: this.formData.age
    }
  },
  methods: {
    handleSubmit() {
      console.log(this.name, this.age)
    }
  }
}
</script>

组件的插槽

## 插槽:在组件的 template 标签中,使用 <slot> 标签来定义组件的结构,并在父组件中通过 slot 插槽来渲染组件的结构。

插槽的作用:

  • 组件的结构可以由父组件来自定义,这样可以实现组件的复用;
  • 父组件可以向子组件传递数据,子组件可以根据数据来渲染组件的结构;

插槽的使用:

  • 在父组件的 template 标签中,使用 <slot> 标签来定义组件的结构;
  • 在子组件的 template 标签中,使用 <slot> 标签来渲染父组件传递过来的结构;

### 插槽的分类

  • 默认插槽:没有指定名称的插槽,只能有一个;
  • 具名插槽:指定名称的插槽,可以有多个;

具名插槽的使用:

  1. 在父组件的 template 标签中,使用 <slot> 标签来定义组件的结构;
  2. 在子组件的 template 标签中,使用 <slot> 标签来渲染父组件传递过来的结构;
  3. 在父组件的 script 标签中,定义 slot 名称;
  4. 在子组件的 script 标签中,使用 slot 名称来渲染父组件传递过来的结构;

#### 在子组件的定义,使用具名插槽

<template>
  <div>
    <h2>子组件</h2>
    <form>
      <label>
        姓名:
        <input type="text" v-model="name">
      </label>
      <label>
        年龄:
        <input type="number" v-model="age">
      </label>
      <button type="button" @click="handleSubmit">提交</button>
      <slot name="footer"></slot>
    </form>
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: 'myForm',
  props: {
    formData: {
      type: Object,
      default: () => ({})
    }
  },
  data() {
    return {
      name: this.formData.name,
      age: this.formData.age
    }
  },
  methods: {
    handleSubmit() {
      console.log(this.name, this.age)
    }
  }
}
</script>

#### 在父组件的使用

<template>
  <div>
    <h1>父组件</h1>
    <my-form :form-data="formData">
      <template slot="footer">
        <p>父组件自定义的脚部</p>
      </template>
    </my-form>
  </div>
</template>


<script>
import myForm from './my-form.vue'

export default {
  name: 'Parent',
  components: {
    myForm
  },
  data() {
    return {
      formData: {
        name: '张三',
        age: 20
      }
    }
  }
}
</script>
当我们封装一个 Vue 组件时,可以使用插槽(slot)来让组件使用者可以在组件内部插入内容。使用插槽可以让我们的组件更加灵活和可复用。 在组件内部,我们可以使用 `slot` 标签来声明一个插槽。例如: ```html <template> <div class="my-component"> <h2>这是组件的标题</h2> <slot></slot> </div> </template> ``` 上面的代码中,我们在组件的模板中使用了 `slot` 标签,这个标签表示这个组件需要一个插槽使用这个组件的时候,我们可以在组件标签内部插入任意的内容,这些内容会被插入到 `slot` 标签的位置上。 例如,我们可以这样使用这个组件: ```html <template> <div> <MyComponent> <p>这里是插入到组件中的内容</p> </MyComponent> </div> </template> ``` 这样,`<p>这里是插入到组件中的内容</p>` 就会被插入到组件的模板中的 `slot` 标签的位置上。 如果我们需要多个插槽,可以给 `slot` 标签添加一个 `name` 属性来区分不同的插槽。例如: ```html <template> <div class="my-component"> <h2>这是组件的标题</h2> <slot name="header"></slot> <div class="content"> <slot></slot> </div> <slot name="footer"></slot> </div> </template> ``` 上面的代码中,我们声明了三个插槽,分别是名为 `header`、`default` 和 `footer` 的插槽使用这个组件时,我们可以这样插入内容: ```html <template> <div> <MyComponent> <template v-slot:header> <h3>这是头部插槽的内容</h3> </template> <p>这里是默认插槽的内容</p> <template v-slot:footer> <p>这是底部插槽的内容</p> </template> </MyComponent> </div> </template> ``` 上面的代码中,我们使用了带 `v-slot` 的 `<template>` 标签来指定要插入哪个插槽,例如 `v-slot:header` 表示要插入到名为 `header` 的插槽中。在 `<template>` 标签内部,我们可以插入任意的内容,这些内容会被插入到对应的插槽位置上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值