vue的插槽跟自定义指定

137 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

大家好,我是大帅子,今天给大家讲一下vue的插槽跟自定义指定,下面我们直接开始吧


插槽

作用

vue提供组件插槽能力, 允许开发者在封装组件时,把不确定的部分定义为插槽

用法

  1. 先在组件内用slot占位
  2. 使用组件时, 传入具体标签插入
<slot>默认内容</slot>
<template>
     <h4>大帅子最帅</h4>
 </template>

具名插槽

v-slot可以简化成#使用

当一个组件内有2处以上需要外部传入标签的地方,我们需要加入name

<slot name="title"></slot>
<template v-slot:title>
     <h4>大帅子最帅</h4>
 </template>

作用域插槽

口诀:

  1. 子组件, 在slot上绑定属性和子组件内的值
  2. 使用组件, 传入自定义标签, 用template和v-slot="自定义变量名"
  3. scope变量名自动绑定slot上所有属性和值

使用组件插槽技术时, 需要用到子组件内变量

<template>
  <div>
     <slot :row="defaultObj">{{ defaultObj.defaultOne }}</slot>
  </div>
</template>

<script>
// 目标: 作用域插槽
// 场景: 使用插槽, 使用组件内的变量
// 1. slot标签, 自定义属性和内变量关联
// 2. 使用组件, template配合v-slot="变量名"
// 变量名会收集slot身上属性和值形成对象
export default {
  data() {
    return {
      isShow: false,
      defaultObj: {
        defaultOne: "大帅子",
        defaultTwo: "小帅子"
      }
    }
  }
}
</script>
<template>
  <div>
   
      <Pannel>
        <!-- 需求: 插槽时, 使用组件内变量 -->
        <!-- scope变量: {row: defaultObj} -->
        <template v-slot="scope">
          <p>{{ scope.row.defaultTwo }}</p>
        </template>
      </Pannel>
  
  </div>
</template>

<script>
import Pannel from "../components/Pannel";
export default {
  components: {
    Pannel,
  },
};
</script>

自定义指令

这里我们分为全局自定义指令跟局部自定义指令

局部自定义指令

<template>
  <div>
    <input v-focus type="text" />
  </div>
</template>

<script>
export default {
      name: "Dsz04",

      data() {
        return {};
      },

      directives: {
        focus: {
          inserted(el) {
            el.focus();
          }
       }
}
</script>

全局自定义指令

  1. main.js里面
// 全局自定义指定 , 自定义指令其实很简单,
// 1. 创建
// 2. 使用

// Vue.directive()
// 参数一 : 指令名
// 参数二 : 对象, 指令的钩子函数在对象中
// el : 会拿到绑定的标签

 Vue.directive('focus', {
   inserted(el) {
     console.log(el, 55);
     el.focus()
   }
 })

2.全局都可以使用

<template>
  <div>
    <input v-focus type="text" />
  </div>
</template>

<script>
export default {
    name: "Dsz04",
    data() {
      return {};
    },
}
</script>

好了,这边已经给大家介绍到这里,以上是我自己的理解,希望可以帮到大家, 欢迎留言我这边一定会第一时间给大家解答,喜欢的可以点赞收藏,
🐣---->🦅        还需努力!大家一起进步!!!