Skip to content

Commit 7e63441

Browse files
committed
fix(render): props key kebab-case transform to camelCase
1 parent 2593ca1 commit 7e63441

File tree

4 files changed

+52
-21
lines changed

4 files changed

+52
-21
lines changed

eslint.config.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export default antfu(
2626

2727
rules: {
2828
"ts/no-unsafe-function-type": "off",
29+
"ts/prefer-literal-enum-member": "off",
2930
},
3031
},
3132
);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { describe, expect, test } from "vitest";
2+
import {defineComponent, nextTick} from 'vue'
3+
import { mount } from "@vue/test-utils";
4+
5+
import LayRender from "../render";
6+
7+
const CustomComponent = defineComponent({
8+
setup(props, ctx) {
9+
return () => (
10+
<div class='custom-class'>
11+
<LayRender slots={ctx.slots} render='default' row-index={1}></LayRender>
12+
</div>
13+
)
14+
},
15+
})
16+
17+
describe("LayRender.vue", () => {
18+
test("作用域slot,参数名应保持为camelize形式", async () => {
19+
const wrapper = mount({
20+
setup() {
21+
return () => (
22+
<CustomComponent
23+
v-slots={{
24+
default: ({rowIndex}: {rowIndex: number}) => rowIndex + 1
25+
}}
26+
></CustomComponent>
27+
);
28+
},
29+
});
30+
31+
const dom = wrapper.find('.custom-class')
32+
expect(dom.text()).toBe('2');
33+
});
34+
});

packages/component/component/_components/render.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { PropType, Slots, VNodeTypes } from "vue";
22

3+
import { normalizeProps } from "@layui/component/utils";
34
import { defineComponent } from "vue";
45

56
type RenderFunc = (props: Record<string, unknown>) => VNodeTypes;
@@ -20,9 +21,9 @@ export default defineComponent({
2021
setup(props, ctx) {
2122
return () => {
2223
if (typeof props.render === "string") {
23-
return (props.slots)?.[props.render]?.(ctx.attrs);
24+
return (props.slots)?.[props.render]?.(normalizeProps(ctx.attrs));
2425
}
25-
return (props.render as RenderFunc)(ctx.attrs);
26+
return (props.render as RenderFunc)(normalizeProps(ctx.attrs));
2627
};
2728
},
2829
});

packages/component/utils/vueUtil.ts

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,17 @@ export enum ShapeFlags {
2222
COMPONENT_KEPT_ALIVE = 1 << 9,
2323
}
2424

25-
export const isElement = (vn: VNode) => {
25+
export function isElement(vn: VNode) {
2626
return Boolean(vn && vn.shapeFlag & ShapeFlags.ELEMENT);
27-
};
27+
}
2828

29-
export const isComponent = (
30-
vn: VNode,
31-
type?: VNodeTypes
32-
): type is Component => {
29+
export function isComponent(vn: VNode, type?: VNodeTypes): type is Component {
3330
return Boolean(vn && vn.shapeFlag & ShapeFlags.COMPONENT);
34-
};
31+
}
3532

36-
export const isArrayChildren = (
37-
vn: VNode,
38-
children: VNode["children"]
39-
): children is VNode[] => {
33+
export function isArrayChildren(vn: VNode, children: VNode["children"]): children is VNode[] {
4034
return Boolean(vn && vn.shapeFlag & ShapeFlags.ARRAY_CHILDREN);
41-
};
35+
}
4236

4337
/**
4438
* 同时支持驼峰命名和破折号命名的插槽,示例:back-icon 和 backIcon
@@ -51,37 +45,38 @@ export function convertSlotName(vm: ComponentInternalInstance, name: string) {
5145
return vm.slots[camelCaseName]
5246
? camelCaseName
5347
: vm.slots[kebabCaseName]
54-
? kebabCaseName
55-
: name;
48+
? kebabCaseName
49+
: name;
5650
}
5751

5852
export function kebabCase(key: string) {
5953
const result = key.replace(/([A-Z])/g, " $1").trim();
6054
return result.split(" ").join("-").toLowerCase();
6155
}
6256

63-
export const flattedVNode = (children: VNode[]) => {
57+
export function flattedVNode(children: VNode[]) {
6458
const vNodes = isArray(children) ? children : [children];
6559
const result: VNode[] = [];
6660

6761
vNodes.forEach((vNode) => {
6862
if (isArrayChildren(vNode, vNode.children)) {
6963
result.push(...flattedVNode(vNode.children));
70-
} else {
64+
}
65+
else {
7166
result.push(vNode);
7267
}
7368
});
7469

7570
return result;
76-
};
71+
}
7772

7873
/**
7974
* 将props对象的key从kebab-case转换为camelCase
8075
* @param props props集合
8176
*/
82-
export const normalizeProps = <T extends Record<string, any>>(props: T): T => {
77+
export function normalizeProps<T extends Record<string, any>>(props: T): T {
8378
return Object.keys(props).reduce((pre, next) => {
8479
pre[camelize(next) as keyof T] = props[next];
8580
return pre;
8681
}, {} as T);
87-
};
82+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy