Vue+tsx使用slot没有被替换的问题

本文主要介绍了Vue+tsx使用slot没有被替换的问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Vue+tsx使用slot没有被替换的问题,久久派带你了解更多相关信息。

目录
  • 前言
  • 发现问题
  • 解决
  • 后记

前言

最近自己准备写一个 UI 组件,想对 vue2.x3.x 可以更深层次的掌握

在架构时,准备全部使用 tsx 书写组件

但遇到了 tsx 中使用 slot 的问题

发现问题

先写了一个基础的 card 组件:

card.tsx:

import Component from \'vue-class-component\'import VanUIComponent from \'@packs/common/VanUIComponent\'import { VNode } from \'vue\'import { Prop } from \'vue-property-decorator\'import { CardShadowEnum } from \'@packs/config/card\'@Componentexport default class Card extends VanUIComponent {  @Prop({    type: String,    default: undefined  }) public headerPadding !: string | undefined  @Prop({    type: String,    default: \'\'  }) public title !: string  @Prop({    type: String,    default: CardShadowEnum.Hover  }) public shadow !: CardShadowEnum  public static componentName = \'v-card\'  public get wrapperClassName(): string {    const list: string[] = [\'v-card__wrapper\']    list.push(`shadow-${ this.shadow }`)    return list.join(\' \')  }  public render(): VNode {    return (      <p class={ this.wrapperClassName }>        <p class=\"v-card__header\" style={ { padding: this.headerPadding } }>          {            this.$slots.title ? <slot name=\"title\" /> : <p>{ this.title }</p>          }        </p>        <p class=\"v-card__body\">          <slot name=\"default\" />        </p>        <p class=\"v-card__footer\"></p>      </p>    )  }}

examples 中使用这个 v-card 的时候:

<template>  <v-card>    <template #title>1111</template>  </v-card></template><script lang=\"ts\">import Vue from \'vue\'import Component from \'vue-class-component\'@Componentexport default class Components extends Vue {}</script><style lang=\"scss\" scoped>.components__wrapper {  padding: 20px;}</style>

我发现渲染后,浏览器不替换 slot 标签:

Vue+tsx使用slot没有被替换的问题

我在百度、Google寻找了一天也没有解释,在官方文档中仔仔细细阅读后,也没有类似的提示,以及 jsx 编译器的文档中也没有写明,只是声明了如何使用命名 slot

解决

第二天,我一直在纠结这个,也查了 element-uiant-design-vueUI 组件库中如何书写,也没有找到对应的使用 jsx 使用 slot 的。

不甘放弃的我更换了搜索文字,于是终于找到解决方案,并将代码改为:

...  public render(): VNode {    return (      <p class={ this.wrapperClassName }>        <p class=\"v-card__header\" style={ { padding: this.headerPadding } }>          {            this.$slots.title ?? <p>{ this.title }</p>          }        </p>        <p class=\"v-card__body\">          <slot name=\"default\" />        </p>        <p class=\"v-card__footer\"></p>      </p>    )  }...

再查看浏览器渲染:

Vue+tsx使用slot没有被替换的问题

问题解决

后记

在使用 jsx / tsx 时,如果 js 语法本身可以解决的,或本身注册在 this 上的方法,优先使用 js 去做,例如 v-if / v-else 可以使用 双目运算符 替代。实在没有可用的简便方法,再使用 vue 的指令做,例如 v-show

到此这篇关于Vue+tsx使用slot没有被替换的问题的文章就介绍到这了,更多相关Vue+tsx slot没有被替换内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/10914.html

(0)
nan
上一篇 2021-08-08
下一篇 2021-08-09

相关推荐

  • 银行存折上的数字怎么看(办理存折的优缺点都有哪些)

    摘要:按存期分为活期存折和定期存折。顾名思义,活期存折就是用于存活期的,可随时支取;定期存折有一个存期,按照银行现行的标准一般分为3M,6M,1Y,2Y,3Y,5Y,存期越长,利率越高。

    2023-04-17
    0
  • 7~9个月宝宝辅食注意哪些(七到九个月宝宝辅食)

    [导读]7~9个月宝宝辅食注意哪些?可吃辅食米粉、土豆泥、桃子、麦片粥、胡萝卜、磨牙饼干、南瓜、红薯、山药。进食方式用杯子喝。用手拿东西。吃压成糊状的食物。拿瓶子喝。吃辅食技能发展开始用手指捏食物,喜欢小块的食物。开始…7~9个月宝宝辅食注意哪

    2022-01-13 热点头条
    0
  • 全运会乌龙?陕西英文名真是Shaanxi

    陕西的英文名是Shaanxi,还是Shanxi?第14届全运会正在陕西举行,一些正在关注陕西全运会的细心网友们发现,全运会开幕式和一些比赛中,陕西…

    2021-09-20
    0
  • 局域网控制上网软件排行(免费的局域网管理软件推荐)

    1、每个项目根据现场的网络环境不同,需要定义不同的IP地址,通过此工具可以快速配置。而且有助于做项目实施资料。2、以前连接过的wifi密码自带记忆功能,通过检索对应的WiFi名字,明文展示密码:3、最常用的,通过快速扫描工具,扫描局域网内已经

    2021-12-31
    0
  • 桑葚怎么洗(桑葚怎么洗了吃)

    清水洗桑葚,还不如不洗,学会这样做,脏东西自己跑出来每年的春天,可不仅仅有特有的野菜上市,还有一种水果也是春天里特有的,错过了今年就没得吃了,这种水果就是桑葚。一见到桑葚,小时候的记忆就涌现到脑海里了,在我们老家,好多年前有许多家里都是养蚕宝宝的,

    2022-01-04 热点头条
    0
  • 银行风控是什么(哪些行为容易被风控)

    我们在申请银行金融产品以后,比如说贷款或者是信用卡,如果不按规定使用,是有可能会被银行风控的,但不少人

    2021-09-25
    0

发表回复

登录后才能评论