vue插槽slot的理解与使用

一、个人理解及插槽的使用场景

刚开始看教程我的疑惑是为什么要用插槽,它的使用场景是什么,很多解释都是“父组件向子组件传递dom时会用到插槽”,这并不能很好的解决我的疑惑。既然你用了子组件,你为什么要给她传一些dom,直接去定义复用的子组件不就好了。后来想想觉得一个复用的组件在不同的地方只有些许变化,如果去重写子组件是很不明智的一件事,当然也可以将不同之处都写在子组件里,然后通过父组件传来的标识进行选择显示。其实质是对子组件的扩展,通过slot插槽向组件内部指定位置传递内容,即将<slot></slot>元素作为承载分发内容的出口;

二、用于理解的例子

目前还没接触到使用插槽解决实际问题很好的例子,只能这样去为了理解插槽而用,可能并没有很好的利用到插槽的好处。

在父组件定义想要传入子组件作为插槽的内容,App.vue

<template>
  <div id="app">
    <div>
      <input type="text" v-model="info">
      <button @click="handleClick">添加</button>
    </div>
    <todolist v-for="item in list" :key="item" :message="msg">
      <template v-slot:item="itemProps" >
        <!-- tips1:<span>即为插槽内容
        tips2:item是插槽的名字,为具名插槽,可对应插入到子组件中具体的插槽位置
           tips3:itemProps可以获取到子组件(即插槽 prop)传出来的状态(值),
         插槽 prop 的对象命名为 itemProps,可任意命名,itemProps变量存在于 <template> 作用域中
      -->
        <span :style="{fontSize: ‘20px‘, color: itemProps.checked ? ‘red‘: ‘blue‘}">{{item}}</span>
      </template>
    </todolist>
  </div>
</template>

<script>

  import todolist from ‘./components/todolist.vue‘;
export default {
  name: ‘App‘,
  components: {
      todolist
  },
  data(){
    return {
      msg: ‘4-2-05‘,
      info: ‘‘,
      list: [],
    }
  },
  methods: {
    handleClick() {
      // 获取到input输入的东西,然后加入到数组中
      this.list.push(this.info);
      this.info = ‘‘
    }
  },
}
</script>

<style>
</style>

在子组件利用<slot></slot>元素作为承载分发内容的出口,父组件的插槽内容将在其中显示,todolist.vue

<template>
  <div>
    {{message}}
  <li class="item">
    <input type="checkbox" v-model="checked">
    <slot name="item" v-bind="{checked}" ></slot>
    <!--插槽内容能够访问子组件中才有的数据是很有用的,又因为父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的
    所以得想办法获取到子组件的数据。-->
    <!--给子组件绑定一个动态参数,checked作为一个 <slot> 元素的特性绑定上去,绑定在 <slot> 元素上的特性被称为插槽 prop-->
  </li>
  </div>
</template>

<script>
  export default {
    props: [‘item‘,‘message‘],
    // 因为父组件在插槽内容里使用item, 即此句代码<span>{{item}}</span>
    // 相当于需要传递给子组件的内容,也就是通常的父子组件通信,所以在子组件需要通过props来获取
    data() {
      return {
        checked: false,
      }
    },
    created() {
      console.log(this.message);
    }
  }
</script>

<style scoped>
  .item {
    color: red;
  }
  li{
    list-style: none;
  }
</style>

三、具体知识点

1、具名插槽

上面的例子只使用了一个slot插槽,但有时我们在一个组件里可能会多处使用插槽,我们希望在不同的插槽处插入不同的内容,此时便需要进行区分,<slot> 元素有一个特殊的特性:name。这个特性可以用来定义插槽的名字,在向具名插槽提供内容的时候,我们可以在一个 <template> 元素上使用

v-slot 指令,并以 v-slot 的参数的形式写出插槽的名称,使其一一对应。

 <slot name="header"></slot>
 <slot name="content"></slot>
 <slot ></slot>
//一个不带 name 的 <slot> 出口会带有隐含的名字“default”。

2、作用域插槽

为了使父组件的插槽内容可以使用子组件的数据,可以在 <slot> 元素上绑定想要传递的数据,此特性被称为插槽 prop。同时在父级作用域中,给 v-slot 带一个值来定义我们提供的插槽 prop 的名字,便可获取到。但此内容只在 <template>作用域内可用。

四、自 2.6.0 起有所更新的语法变化

1、带有slot特性的具名插槽

2、带有slot-scope特性的作用域插槽

五、突发奇想的调换

因为看到一个别人写的关于slot的帖子,他应该是写错了插槽在子父组件的内容,这也就相当于从子组件传一个插槽内容给父组件。仔细想想这思路有问题,既然都引用了子组件,父组件便可以访问到子组件的所有内容,现在却非要通过插槽来传递,多此一举。

然后我就试了一下将插槽内容卸载子组件里,果然出现了报错,如下:
  - <template v-slot> can only appear at the root level inside the receiving the component(slot的只能出现在接受组件的根级别)

也就是只能在父组件使用。

原文地址:https://www.cnblogs.com/songForU/p/10641751.html

时间: 2024-08-30 12:58:11

vue插槽slot的理解与使用的相关文章

vue 插槽slot

本文是对官网内容的整理 https://cn.vuejs.org/v2/guide/components.html#编译作用域 在使用组件时,我们常常要像这样组合它们: <app> <app-header></app-header> <app-footer></app-footer> </app> 注意两点: <app> 组件不知道它会收到什么内容.这是由使用 <app> 的父组件决定的. <app>

Vue 之 slot(插槽)

前言: vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项在使用频率.使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生“算了吧,回头再学,反正已经可以写基础组件了”的想法,于是就关闭了vue的说明文档. 实际上,插槽的概念很简单,下面通过分三部分来讲.这三部分也是按照vue说明文档的顺序来写的. 进入这三部分之前,先让还没接触过插槽的同学对什么是插槽有一个简单的概念:插槽,也就是slot,是组件的一块HTML模板,这块模板

vue 插槽理解

插槽,顾名思义留一个坑在组件中,然后动态的去填坑,例如: //Child.vue 子组件 <template> <div> <slot></slot> </div> </template> <script> </script> <style lang=""> </style> //Parent.vue 引入子组件的文件 <template> <div

Vue插槽、ref和$refs用法

1.vue插槽 1.插槽的作用:以局部组件为例 插槽就是Vue实现的一套内容分发的API,将<slot></slot>元素作为承载分发内容的出口.插槽内可以是任意内容. (1)不带插槽的情况: <div id="app"> <vue> <h2>我是里面的内容</h2></vue> </div> <script> var Child = { template: '<div&g

VUE 插槽

插槽就是在组件标签内 预留位置 例如: <component>ddd</component> 默认情况下内部的内容会被忽略,  在组件模板中加入 插槽 <slot></slot> ddd 就不会被忽略 slot 上可以 v-bind 绑定变量,传递到父组件上 原文地址:https://www.cnblogs.com/chillaxyw/p/10447867.html

vue中mixins的理解及应用

vue中mixins的理解及应用 vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用.最开始我一度认为这个和组件好像没啥区别..后来发现错了.下面我们来看看mixins和普通情况下引入组件有什么区别? mixins 混合 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式. 混合对象可以包含任意组件选项. 当组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项. mixins理解 组件在引用之后相当于在父组件内开辟了一块单独的空间,来根据父组

具名插槽 slot (二)

slot 是父组件与子组件的通信方式可以将父组件的内容显示在子组件当中或者说可以将 让你封装的组件变的更加的灵活,强壮! 在子组件中  通过为多个slot进行命名.来接受父组件中的不同内容的数据  这就是命名插槽 插槽slot与slot之间不能有html元素 但是html可以把插槽包裹起来 所以插槽可以动态向子组件传递值 子组件 <template> <div> <h1>我是组件</h1> <h2>我是组件中显示的内容</h2> &l

vue中的插槽slot理解

本篇文章参考赛冷思的个人博客 1.函数默认传参 在我们写js函数我们的可能会给他们一个默认的参数,写法是 function show(age,name){ var age = age || 20; var name = name || 张三; console.log(age,name); } show(); // 20,张三 show(18,"命名") // 18,明明 如果用户不传入参数,那么会输出默认值,如果用户传入,会输出传入的值,这种写法很灵活 vue中的组件,也可以有默认的模

Vue.js slot插槽

1.个人理解的插槽 之所以使用组件,就是因为组件可以将复杂的页面分割成多个部分,每个 部分就是一个组件(也是一个vue文件).要使用这个组件,只需要引入组件文件,并在模版中写入组件标签即可,引入了这个子组件,就相当于引入了这个组件的html模版,例如: // App.vue <template> <div id="app"> <Child /> </div> </template> // Child组件 <templat