!107 fix(page-header): backIcon 插槽在html 文件中无效

Merge pull request !107 from forget skyrim/N/A
This commit is contained in:
就眠儀式
2022-12-07 01:37:38 +00:00
committed by Gitee
2 changed files with 30 additions and 4 deletions

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="lay-page-header"> <div class="lay-page-header">
<div class="lay-page-header__left" @click="emits('back')"> <div class="lay-page-header__left" @click="emits('back')">
<slot name="backIcon" <slot :name="backIconSlotName"
><i class="layui-icon" :class="[backIcon]"></i ><i class="layui-icon" :class="[backIcon]"></i
></slot> ></slot>
<div class="lay-page-header__title">{{ backText }}</div> <div class="lay-page-header__title">{{ backText }}</div>
@@ -19,7 +19,8 @@ export default {
}; };
</script> </script>
<script lang="ts" setup> <script lang="ts" setup>
import { useSlots } from "vue"; import { convertSlotName } from "../../utils";
import { getCurrentInstance, useSlots } from "vue";
import "./index.less"; import "./index.less";
export interface PageHeaderProps { export interface PageHeaderProps {
@@ -34,6 +35,7 @@ const props = withDefaults(defineProps<PageHeaderProps>(), {
}); });
const emits = defineEmits(["back"]); const emits = defineEmits(["back"]);
const slots = useSlots(); const slots = useSlots();
const instance = getCurrentInstance()!;
const backIconSlotName = convertSlotName(instance, "backIcon");
</script> </script>

View File

@@ -1,4 +1,4 @@
import { Component, VNode, VNodeTypes } from "vue"; import { Component, ComponentInternalInstance, VNode, VNodeTypes } from "vue";
export enum ShapeFlags { export enum ShapeFlags {
ELEMENT = 1, ELEMENT = 1,
@@ -31,3 +31,27 @@ export const isArrayChildren = (
): children is VNode[] => { ): children is VNode[] => {
return Boolean(vn && vn.shapeFlag & ShapeFlags.ARRAY_CHILDREN); return Boolean(vn && vn.shapeFlag & ShapeFlags.ARRAY_CHILDREN);
}; };
/**
* 同时支持驼峰命名和破折号命名的插槽示例back-icon 和 backIcon
* @param vm 组件实例
* @param name 插槽名
*/
export function convertSlotName(vm: ComponentInternalInstance, name: string) {
const camelCaseName = camelCase(name);
const kebabCaseName = kebabCase(name);
return vm.slots[camelCaseName]
? camelCaseName
: vm.slots[kebabCaseName]
? kebabCaseName
: name
}
export function camelCase(str: string) {
return str.replace(/-(\w)/g, (_, c) => (c ? c.toUpperCase() : ''))
}
export function kebabCase(key: string) {
const result = key.replace(/([A-Z])/g, ' $1').trim();
return result.split(' ').join('-').toLowerCase()
}