首页 > 其他分享 >关于vue3中Scope slot实战中使用

关于vue3中Scope slot实战中使用

时间:2023-04-20 21:44:06浏览次数:64  
标签:slot 插槽 slotProps MyComponent vue3 组件 Scope 模板

今天学了啥-23/03/28   vue提供slot机制让组件可以接收模板片段,来渲染模板片段。比如最常见的button组件,基本是如下这样使用。

<FancyButton>
  Click me! <!-- 插槽内容 -->
</FancyButton>
FancyButton 组件则是这样:
<button class="fancy-btn">
  <slot></slot> <!-- 插槽出口 -->
</button>
不过我的重点不是这个基本的slot,我的重点是scope slot,首先安装vue中对slot的定义,slot是无法访问到子组件的状态。 因为插槽内容是在父组件渲染的,插槽内容的数据也是由父组件定义的。
<FancyButton>{{ message }}</FancyButton>
插槽内容无法访问子组件的数据。Vue 模板中的表达式只能访问其定义时所处的作用域,这和 JavaScript 的词法作用域规则是一致的。父组件模板中的表达式只能访问父组件的作用域;子组件模板中的表达式只能访问子组件的作用域。 比如上面代码中message它是在父组件定义,message的数据也是由父组件提供。它是在父组件渲染,虽然它插入了fancyButton组件中但是无法访问fancybutton组件定义的数据。   但是有时候在项目中会遇到这种问题,插槽内容需要访问子组件的数据。 比如已经写好的组件ComponentA和componentB组件,现在我们要扩展componentA组件功能,要在ComponentA中使用ComponentB功能,但是B组件只是在某个功能才需要渲染,如果把componentB直接引入ComponentA,必须时刻使用v-if来控制渲染,有点麻烦。 所以我想到使用scope slot功能,scope slot机制可以让插槽组件访问子组件数据。 用vue3的scope slots文档 的例子,
<!--MyComponent-->
<script>
export default {
  data() {
    return {
      greetingMessage: 'hello'
    }
  }
}
</script>

<template>
  <div>
          <slot :text="greetingMessage" :count="1"></slot>
        </div>
</template>
MyComponent组件内部定义了数据和插槽。
<script>
import MyComponent from './MyComponent.vue'
  
export default {
  components: {
    MyComponent
  }
}
</script>

<template>
        <MyComponent v-slot="slotProps">
          {{ slotProps.text }} {{ slotProps.count }}
  </MyComponent>
</template>
像对组件传递 props 那样,向插槽内容传递 attributes,定义slotProps变量。 此时MyComponent v-slot的slotProps 可以接受到MyComponent组件定义的text和count数据,实际上此时slotProps={text:'hello',count:1} 。那么MyComponent 插槽模板就能接收到数据从而渲染。 你可以把MyComponent例子类别为如下函数:

MyComponent({
  // 类比默认插槽,将其想成一个函数
  default: (slotProps) => {
    return `${slotProps.text} ${slotProps.count}`
  }
})

function MyComponent(slots) {
  const greetingMessage = 'hello'
  return `<div>${
    // 在插槽函数调用时传入 props
    slots.default({ text: greetingMessage, count: 1 })
  }</div>`
}
MyComponent 它的参数slots只接受函数(模板片段),函数内部有定义好的变量,一旦传入参数就会生成新的模板字符串。 slotProps 数据是MyComponent 组件内部提供,实际上这个例子基本不可能,最常见的是数据通过props传递过来的。所以我们要改造下MyComponent 让它更接近实际碰到的样子。  
<!--MyComponent-->
<script  lang="ts" setup>
import {ref} from 'vue'

const info = ref<any>()
const showInfo =(data:any)=>{
  info.value = data
}

defineExpose({

showInfo
})
</script>

<template>
  <div>
          <slot v-bind="info"></slot>
        </div>
</template>
Parent
<script setup>
import MyComponent from './MyComponent.vue'
import {ref} from 'vue'  
const componentRef =ref()
componentRef.value.showInfo({text:'hello',count:1})

</script>

<template>
        <MyComponent v-slot="slotProps" ref="componentRef">
          {{ slotProps.text }} {{ slotProps.count }}
  </MyComponent>
</template>
在parent组件中使用showInfo将数据传入,Component就能绑定传入的数据。从而进行渲染。

标签:slot,插槽,slotProps,MyComponent,vue3,组件,Scope,模板
From: https://www.cnblogs.com/aliceKurapika/p/17338459.html

相关文章

  • vue全家桶进阶之路46:Vue3 Axios拦截器和globalProperties全局设置
    在Vue.js3中,使用Axios与Vue.js2.x中类似,但是需要进行一些修改和更新,下面是Vue.js3中Axios的定义和使用方式:首先,你需要安装Axios和Vue.js3.x,可以使用npm或yarn等包管理工具安装:npminstallaxiosvue@next然后,在你的Vue.js3应用程序中,你可以使用以下代码来导入和使用Axio......
  • Vue3 日历组件的实现
    Vue3日历组件的实现以下是一个基于Vue3实现的简单日历组件的代码示例。这个日历组件包含了前一个月、当前月、下一个月的日期,并且可以支持选择日期、切换月份等功能。<template><divclass="calendar"><divclass="header"><buttonclass="prev"@click="pre......
  • Vue3 watch 监听对象数组中对象的特定属性
    Vue3watch监听对象数组中对象的特定属性在Vue3中,可以使用watch函数来监听对象数组中对象的特定属性。可以通过在回调函数中遍历数组来检查对象的特定属性是否发生变化,并在变化发生时执行相应的操作。一、监听对象的特定属性例如,假设有一个名为items的对象数组,其中每个......
  • Vue独立组件开发: prop event slot
    本文是介绍独立组件开发的系列文章的第一篇。Vuejs无疑是当下最火热的前端框架,而它最精髓的,正是它的组件与组件化。写一个Vue项目,就是在写一个个的组件,掌握了Vue组件的各种开发模式与技巧,再复杂的业务场景也可轻松拿捏。组件的分类Vue组件分成三类:页面组件由 vue-router 产......
  • Vue3+TS+Node打造个人博客(后端架构)
    在使用Express搭建后端服务时,主要关注的几个点是:路由中间件和控制器SQL处理响应返回体数据结构错误码Web安全环境变量/配置路由和控制器路由基本上是按模块或功能去划分的。首先是按模块去划分一级路由,各个模块的子功能相当于是用二级路由处理。简单举个例子,/article......
  • vue全家桶进阶之路43:Vue3 Element Plus el-form表单组件
    在ElementPlus中,el-form是一个表单组件,用于创建表单以便用户填写和提交数据。它提供了许多内置的验证规则和验证方法,使表单验证更加容易。使用el-form组件,您可以将表单控件组织在一起,并对表单进行验证,以确保提交的数据符合预期的格式和要求。该组件具有以下特性:支持内置......
  • vue3微信公众号商城项目实战系列(12)项目发布到服务器上
    本篇介绍如何将vue3项目打包发布到服务器上,然后在微信公众号上打开。vue3发布之前需要对项目进行编译,编译时会在项目根目录下创建dist文件夹,编译后的文件会存放在这里。 在编译之前,我们在public目录下建一个config.js的文件,里面放如下的代码:constconfig={baseUr......
  • Vue3 toRef与toRefs
    视频直接用ref是创建新的对象10.toRef作用:创建一个ref对象,其value值指向另一个对象中的某个属性。语法:constname=toRef(person,'name')应用:要将响应式对象中的某个属性单独提供给外部使用时。扩展:toRefs与toRef功能一致,但可以批量创建多个ref对象,语法......
  • Vue3 自定义hook
    视频9.自定义hook函数什么是hook?——本质是一个函数,把setup函数中使用的CompositionAPI进行了封装。类似于vue2.x中的mixin。自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂。componentsDemo.vue<template> <h2>当前求和为:{{sum}}</h2> <button@clic......
  • vue2升vue3后部分异常解决
    element-ui升为element-plus首先建议参考element-plus官方站点:https://element-plus.org/zh-CN/部分组件标签直接变更如el-submenu变更为el-sub-menu浏览器提示ElementPlusError:[ElOnlyChild]novalidchildnodefound哪个页面有该提示就搜"slot=",然后到element......