Skip to content

Commit 91f2168

Browse files
authored
chore: Add slot renderNodeKey. (#196)
1 parent 268d386 commit 91f2168

File tree

5 files changed

+32
-2
lines changed

5 files changed

+32
-2
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ plugins: [
126126
| selectOnClickNode | Trigger select when click node | boolean | true |
127127
| highlightSelectedNode | Support highlighting selected nodes | boolean | true |
128128
| collapsedOnClickBrackets | Support click brackets to collapse | boolean | true |
129+
| renderNodeKey | render node key, or use slot #renderNodeKey | ({ node, defaultKey }) => vNode | - |
129130
| renderNodeValue | render node value, or use slot #renderNodeValue | ({ node, defaultValue }) => vNode | - |
130131
| editable | Support editable | boolean | false |
131132
| editableTrigger | Trigger | `click` \| `dblclick` | `click` |
@@ -143,6 +144,7 @@ plugins: [
143144

144145
| Slot Name | Description | Parameters |
145146
| --------------- | ----------------- | ---------------------- |
147+
| renderNodeKey | render node key | { node, defaultKey } |
146148
| renderNodeValue | render node value | { node, defaultValue } |
147149

148150
## Contributors

README.zh_CN.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
| selectOnClickNode | 支持点击节点的时候触发选择 | boolean | true |
3131
| highlightSelectedNode | 支持高亮已选择节点 | boolean | true |
3232
| collapsedOnClickBrackets | 支持点击括号折叠 | boolean | true |
33+
| renderNodeKey | 渲染节点键,也可使用 #renderNodeKey | ({ node, defaultKey }) => vNode | - |
3334
| renderNodeValue | 自定义渲染节点值,也可使用 #renderNodeValue | ({ node, defaultValue }) => vNode | - |
3435
| editable | 支持可编辑 | boolean | false |
3536
| editableTrigger | 触发编辑的时机 | `click` \| `dblclick` | `click` |
@@ -47,4 +48,5 @@
4748

4849
| 插槽名 | 描述 | 参数 |
4950
| --------------- | ---------- | ---------------------- |
51+
| renderNodeKey | 渲染节点键 | { node, defaultKey } |
5052
| renderNodeValue | 渲染节点值 | { node, defaultValue } |

example/Basic.vue

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646

4747
<h3>Slots:</h3>
4848
<div class="options">
49+
<div>
50+
<label>renderNodeKey</label>
51+
<input v-model="state.useRenderNodeKeySlot" type="checkbox" />
52+
</div>
4953
<div>
5054
<label>renderNodeValue</label>
5155
<input v-model="state.useRenderNodeValueSlot" type="checkbox" />
@@ -66,6 +70,13 @@
6670
:show-icon="state.showIcon"
6771
style="position: relative"
6872
>
73+
<template v-if="state.useRenderNodeKeySlot" #renderNodeKey="{ node, defaultKey }">
74+
<template v-if="node.key === 'title'">
75+
<a>"{{ node.key }}":</a>
76+
</template>
77+
<template v-else>{{ defaultKey }}:</template>
78+
</template>
79+
6980
<template v-if="state.useRenderNodeValueSlot" #renderNodeValue="{ node, defaultValue }">
7081
<template v-if="typeof node.content === 'string' && node.content.startsWith('http://')">
7182
<a :href="node.content" target="_blank">{{ node.content }}</a>
@@ -121,6 +132,7 @@ export default defineComponent({
121132
showLineNumber: false,
122133
showDoubleQuotes: true,
123134
collapsedOnClickBrackets: true,
135+
useRenderNodeKeySlot: false,
124136
useRenderNodeValueSlot: false,
125137
deep: 4,
126138
setPathCollapsible: false,

src/components/Tree/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export default defineComponent({
6767
},
6868
},
6969

70-
slots: ['renderNodeValue'],
70+
slots: ['renderNodeKey', 'renderNodeValue'],
7171

7272
emits: [
7373
'nodeClick',
@@ -248,6 +248,7 @@ export default defineComponent({
248248
});
249249

250250
return () => {
251+
const renderNodeKey = props.renderNodeKey ?? slots.renderNodeKey;
251252
const renderNodeValue = props.renderNodeValue ?? slots.renderNodeValue;
252253

253254
const nodeContent =
@@ -270,6 +271,7 @@ export default defineComponent({
270271
editable={props.editable}
271272
editableTrigger={props.editableTrigger}
272273
showIcon={props.showIcon}
274+
renderNodeKey={renderNodeKey}
273275
renderNodeValue={renderNodeValue}
274276
onNodeClick={handleNodeClick}
275277
onBracketsClick={handleBracketsClick}

src/components/TreeNode/index.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ export const treeNodePropsPass = {
2121
type: Boolean,
2222
default: true,
2323
},
24+
// Custom render for key.
25+
renderNodeKey: Function as PropType<
26+
(opt: { node: NodeDataType; defaultKey: string | JSX.Element }) => unknown
27+
>,
2428
// Custom render for value.
2529
renderNodeValue: Function as PropType<
2630
(opt: { node: NodeDataType; defaultValue: string | JSX.Element }) => unknown
@@ -113,6 +117,14 @@ export default defineComponent({
113117
props.showDoubleQuotes ? `"${props.node.key}"` : props.node.key,
114118
);
115119

120+
const renderKey = () => {
121+
const render = props.renderNodeKey;
122+
123+
return render
124+
? render({ node: props.node, defaultKey: prettyKey.value || '' })
125+
: <span class="vjs-key">{`${prettyKey.value}: `}</span>;
126+
};
127+
116128
const isMultiple = computed(() => props.selectableType === 'multiple');
117129

118130
const isSingle = computed(() => props.selectableType === 'single');
@@ -223,7 +235,7 @@ export default defineComponent({
223235
{props.showIcon && <Carets nodeType={node.type} onClick={handleIconClick} />}
224236
</div>
225237

226-
{node.key && <span class="vjs-key">{`${prettyKey.value}: `}</span>}
238+
{node.key && renderKey()}
227239

228240
<span>
229241
{node.type !== 'content' && node.content ? (

0 commit comments

Comments
 (0)