vue3<script setup>中插槽的使用

在 Vue 3 中,<script setup> 语法糖极大地简化了组件的编写方式,使得代码更加简洁。在使用 <script setup> 时,插槽(Slots)的使用方式和在常规 <script> 中类似,但可能需要稍微注意一些细节,尤其是在类型化模板编译(如果你使用 TypeScript)时。

基本使用

在 <template> 中定义插槽,然后在父组件中通过 <template v-slot:name> 或简写为 #name 来填充这些插槽。

子组件(ChildComponent.vue):

<script setup>  
// 这里可以定义组件的逻辑,但插槽的声明主要在模板中  
</script>  
  
<template>  
  <div>  
    <header>  
      <!-- 默认插槽 -->  
      <slot></slot>  
    </header>  
    <main>  
      <!-- 具名插槽 -->  
      <slot name="content"></slot>  
    </main>  
  </div>  
</template>

父组件中使用:

<template>  
  <ChildComponent>  
    <!-- 默认插槽 -->  
    <template>  
      <p>这是默认插槽的内容</p>  
    </template>  
  
    <!-- 具名插槽 -->  
    <template #content>  
      <p>这是名为 'content' 的插槽的内容</p>  
    </template>  
  </ChildComponent>  
</template>  
  
<script>  
import ChildComponent from './ChildComponent.vue';  
  
export default {  
  components: {  
    ChildComponent  
  }  
}  
</script>

插槽的作用域

还可以定义作用域插槽,使得子组件可以向插槽传递数据。

子组件(ChildComponent.vue):

<script setup>  
import { ref } from 'vue';  
  
const data = ref('来自子组件的数据');  
</script>  
  
<template>  
  <div>  
    <!-- 作用域插槽 -->  
    <slot name="scoped" :userData="data"></slot>  
  </div>  
</template>

父组件中使用:

<template>  
  <ChildComponent>  
    <template #scoped="{ userData }">  
      <p>{{ userData }}</p>  
    </template>  
  </ChildComponent>  
</template>  
  
<script>  
import ChildComponent from './ChildComponent.vue';  
  
export default {  
  components: {  
    ChildComponent  
  }  
}  
</script>

TypeScript 中的类型支持

如果在 Vue 3 中使用 TypeScript,并希望为插槽提供类型支持,可以通过定义组件的 defineExpose 和在父组件中显式声明插槽的类型来实现。然而,对于插槽内容的类型,Vue 官方并没有直接提供类型定义接口,通常需要通过类型断言或额外的类型定义来支持。

插槽 Slots | Vue.js (vuejs.org)

Vue3+TypeScript项目使用Ant Design Vue框架,你可以通过在点击查看详情按钮时,将对应行的数据保存到变量,并在弹窗显示与表格经过匹配字典数据后的内容保持一致。 首先,你需要在表格的某一列添加一个按钮,并绑定一个点击事件处理函数。在点击事件处理函数,你可以获取当前行的数据,并将其保存到一个变量。 然后,你可以使用Ant Design Vue提供的`Modal`组件来创建弹窗。在弹窗,你可以展示与表格行内容经过字典数据匹配后的详情信息。 下面是一个简单的示例代码: ```html <template> <div> <a-table :columns="columns" :data-source="data"></a-table> <a-modal v-model:visible="showPopup" title="详情"> <!-- 弹窗内容 --> <p>姓名:{{ matchedData.name }}</p> <p>年龄:{{ matchedData.age }}</p> <!-- 其他详情内容 --> </a-modal> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; import { Modal } from 'ant-design-vue'; const showPopup = ref(false); const matchedData = ref({}); const data = ref([ { id: 1, name: '张三', age: 20 }, { id: 2, name: '李四', age: 25 }, // 其他数据行 ]); const columns = [ { title: '姓名', dataIndex: 'name', key: 'name', }, { title: '年龄', dataIndex: 'age', key: 'age', }, { title: '操作', key: 'action', slots: { customRender: 'actions' }, }, ]; const openDetailModal = (row) => { matchedData.value = matchDataWithDictionary(row); // 调用匹配字典数据的函数 showPopup.value = true; }; const matchDataWithDictionary = (row) => { // 根据实际需求,编写匹配字典数据的逻辑 // 返回经过匹配后的数据 return { name: row.name, // 假设字典数据匹配后的姓名值 age: row.age, // 假设字典数据匹配后的年龄值 // 其他字段 }; }; </script> ``` 在上述示例,我们使用Ant Design Vue提供的`Modal`组件来创建弹窗。通过`v-model:visible`来控制弹窗的显示和隐藏。 在表格的每一行,我们使用了`slots`属性来自定义操作列的内容,即查看详情按钮。通过`customRender`插槽来渲染自定义内容,并绑定了一个点击事件处理函数`openDetailModal`。在点击事件处理函数,我们将当前行的数据保存到`matchedData`变量,并将`showPopup`变量的值设为`true`,以打开弹窗。 在弹窗,我们展示了与表格行内容经过字典数据匹配后的详情信息,包括姓名和年龄等内容。你可以根据实际需求修改弹窗内容,并在`matchDataWithDictionary`函数编写字典数据匹配的逻辑。 请注意,示例的数据和字典数据匹配逻辑仅作为示例,你需要根据实际情况修改数据结构、字典数据匹配逻辑,并为弹窗组件添加适当的样式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值