作用域插槽slot-scope

一般用于组件封装,将使用props传入组件的数据再次调出来或者单纯调用组件中的数据。也可用于为组件某个部分自定义样式以及为某次使用组件自定义样式。

直接拿elementui的el-table举例:

复制代码
<template>
    <el-table v-loading="loading" :data="form" @selection-change="handleSelectionChange" id="outTable" v-show="false">
        <el-table-column label="日期" align="center" prop="xmccbgrq" width="180">
          <template slot-scope="scope">
            <span>{{}}</span>
          </template>
        </el-table-column>
        <el-table-column label="项目状态" align="center" prop="xmzt" :formatter="xmztFormat" />
    </el-table>
</template>


<script>
export default {
    data(){
        return{
            isOpen:[
                {
                    name:'关',
                    data:0 
                },
                {
                    name:'关',
                    data:1 
                }
            ].
            form:[
            

            ]
        }
    }
}
</script>

可以看到子组件中使用了template标签,还能拿到参数。

自己封装方法如下(用的vue3,vue2的话v-slot:default=""改成slot-scope然后3和2语法换一换就行了):

子组件:

复制代码
<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'
</script>

<template>
  <div>
    <a href="https://vitejs.dev" target="_blank">
      <img src="/vite.svg" class="logo" alt="Vite logo" />
    </a>
    <a href="https://vuejs.org/" target="_blank">
      <img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
    </a>
  </div>
  <HelloWorld msg="我是传递的值">
    <template v-slot:default="scope">
      <div style="font-size: 50px;color: pink">
        {{scope.rows}}
      </div>
    </template>
  </HelloWorld>
</template>

<style scoped>
.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;
}
.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
  filter: drop-shadow(0 0 2em #42b883aa);
}
</style>

父组件:

复制代码
<script setup lang="ts">
import { ref } from 'vue'

defineProps<{ msg: string }>()

const count = ref(0)
</script>

<template>
  <h1>{{ msg }}</h1>

  <div class="card">
    <button type="button" @click="count++">count is {{ count }}</button>
    <p>
      Edit
      <code>components/HelloWorld.vue</code> to test HMR
      <slot :rows="msg"></slot>
    </p>
  </div>

  <p>
    Check out
    <a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
      >create-vue</a
    >, the official Vue + Vite starter
  </p>
  <p>
    Install
    <a href="https://github.com/vuejs/language-tools" target="_blank">Volar</a>
    in your IDE for a better DX
  </p>
  <p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
</template>

<style scoped>
.read-the-docs {
  color: #888;
}
</style>

效果:

这里只是基础用法,具体封装传递参数还要根据需求来。

相关推荐
2501_946230983 小时前
Cordova&OpenHarmony通知中心实现
android·javascript
南山安3 小时前
JavaScript 函数柯里化:从入门到实战,一文搞定(面试可用)
javascript·面试·函数式编程
谢尔登3 小时前
Monorepo 架构
前端·arcgis·架构
啃火龙果的兔子3 小时前
JavaScript 中的 Symbol 特性详解
开发语言·javascript·ecmascript
栀秋6663 小时前
你会先找行还是直接拍平?两种二分策略你Pick哪个?
前端·javascript·算法
漂流瓶jz3 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·css
xhxxx4 小时前
传统工具调用太痛苦?LangChain 一键打通 LLM 与真实世界
前端·langchain·llm
南山安4 小时前
LangChain学习:Memory实战——让你的大模型记住你
前端·javascript·langchain
武昌库里写JAVA4 小时前
iview-CRUD模板
vue.js·spring boot·sql·layui·课程设计
BD_Marathon5 小时前
Promise基础语法
开发语言·前端·javascript