14. vue的插槽

vue的插槽

插槽这个概念相对就比较抽象,但抽象的概念用生活中常见的事物去做类比,也就变得没那么抽象了!

举一个生活中的例子:比如装修房子的时候我们会在很多地方预留出一些插孔,可能要插电冰箱,插电式,插充电器等,反正就是你觉得预留在这个位置的插座一定有用,这个预留的插座就类似我们今天要说的插槽,插槽就是你在模板中提前通过一个占位符(slot)来预言一块固定的区域将来会被某些元素替换掉,但是这个位置我得先预留出来。

在veu 2.6.0 中,具名插槽作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slotslot-scope 这两个目前已被废弃但未被移除且仍在文档中的 attribute。

插槽的基本使用

  1. 在组件中定义一个标签即可
  2. 如果插槽内具有共性的东西较多,可在插槽内设置默认值,当没有在插槽传入值时显示默认值
  3. 如果有多个值,同时放入到组件中进行替换时,一起作为替换元素

定义一个默认插槽

插槽的定义位置在组件中,所以首先我们得创建一个组件,再在这个组件中定义插槽,再使用!

老规矩,翠花上代码:

<div id="app">
	<mainview>mainview>
div>
    

<template id="view">
	<div>
		<slot>
			<button type="button">插槽默认值button>
        slot>
    div>
template>
    
    <script type="text/javascript">
      var app = new Vue({
      
        el: "#app",
        components:{
      
          // view注册为一个局部组件
          mainview: {
      
            template: "#view"
          }
        }
      })
    script>

14. vue的插槽_第1张图片

运行这段代码我们会看到组件为我们渲染除了slot插槽里的默认内容,当然我们也可以不用设置默认内容,那么它将不会显示任何东西,那如何覆盖默认内容呢?只需要在组件中插入你需要显示的内容即可,如下:

<mainview>
	<button type="button" style="color: #42B983;">
		修改插槽
	button>
mainview>

修改之后,我们可以看到渲染的内容已经变成了我们在 mainview 中定义的内容!

这就是插槽 一个基本使用,还是比较好理解的。但一般在实际项目中不会像 demo 一样简单直接。

通常情况下,一个页面设计非常复杂,需要在一个页面的不同位置放入不同的插槽内容。那么在这种情况下,我们就需要给插槽 指定一个具体的名称 name,使其具有具体匹配的特性,在 Vue 中把这种具有具体名称 name 的插槽叫做具名插槽

具名插槽

现在,假设我们要做一个博客页面,这个页面分为三个部分头部header, 内容main,底部footer,这三个模块我们都通过插槽来实现!

老规矩,翠花上代码:

<div id="app">
	
	<base-layout>
		<template v-slot:header>
          <h1>这是头部header插槽内容h1>
        template>
        
        <template v-slot:default>
          <p>这是默认插槽的内容p>
        template>
        
        <template v-slot:footer>
          <p style="color: red;">这是footer插槽内容p>
        template>
        
      base-layout>
div>
    
    
    <template id="layout">
      <div>
        <header>
          
          <slot name="header">slot>
        header>
        <main>
          <slot>slot>
        main>
        <footer>
          <slot name="footer">slot>
        footer>
      div>
    template>
    
    <script type="text/javascript">
      var app = new Vue({
      
        el: "#app",
        components:{
      
          // 局部注册组件
          BaseLayout: {
      
            template: "#layout"
          }
        }
      })
    script>

以上案例中layout组建中定义了三个插槽,其中header和footer通过slot的name属性制定了插槽的名称,main用一个默认插槽填充,其中header和footer两个具名插槽会精确地匹配 name传入相应的插槽,任何没有被包裹在带有 v-slot