style(prettier): reset code style with prettier
This commit is contained in:
@@ -7,7 +7,7 @@ export default {
|
||||
import LayIcon from '../icon'
|
||||
import { TreeNode } from '/@src/module/tree/tree.type'
|
||||
|
||||
interface TreeEntityProps{
|
||||
interface TreeEntityProps {
|
||||
node: TreeNode
|
||||
onlyIconControl: boolean
|
||||
}
|
||||
@@ -26,13 +26,14 @@ const emit = defineEmits<EmitEvent>()
|
||||
const renderLineShort = (node: TreeNode): boolean => {
|
||||
return (
|
||||
// 没有下一个节点
|
||||
node._nextSibling === null &&
|
||||
node._parentNode &&
|
||||
// 外层最后一个
|
||||
(node._parentNode._nextSibling === null ||
|
||||
//上一层父级有延伸线
|
||||
(node._parentNode._nextSibling && !node._parentNode._nextSibling.children))
|
||||
) as boolean
|
||||
(node._nextSibling === null &&
|
||||
node._parentNode &&
|
||||
// 外层最后一个
|
||||
(node._parentNode._nextSibling === null ||
|
||||
//上一层父级有延伸线
|
||||
(node._parentNode._nextSibling &&
|
||||
!node._parentNode._nextSibling.children))) as boolean
|
||||
)
|
||||
}
|
||||
/**
|
||||
* 展开收起 icon样式
|
||||
@@ -46,7 +47,7 @@ const nodeIconType = (node: TreeNode): string => {
|
||||
* 发射至外层
|
||||
* @param node
|
||||
*/
|
||||
function handleNodeClick (node: TreeNode) {
|
||||
function handleNodeClick(node: TreeNode) {
|
||||
emit('node-click', node)
|
||||
}
|
||||
|
||||
@@ -54,10 +55,9 @@ function handleNodeClick (node: TreeNode) {
|
||||
* 递归事件
|
||||
* @param node
|
||||
*/
|
||||
function innerClick (node: TreeNode) {
|
||||
function innerClick(node: TreeNode) {
|
||||
emit('node-click', node)
|
||||
}
|
||||
|
||||
</script>
|
||||
<template>
|
||||
<template v-if="node.children && node.children.length > 0">
|
||||
@@ -69,25 +69,31 @@ function innerClick (node: TreeNode) {
|
||||
}"
|
||||
>
|
||||
<div class="layui-tree-entry">
|
||||
<div class="layui-tree-main" @click.prevent.stop="!onlyIconControl && handleNodeClick(node)">
|
||||
<div
|
||||
class="layui-tree-main"
|
||||
@click.prevent.stop="!onlyIconControl && handleNodeClick(node)"
|
||||
>
|
||||
<span class="layui-tree-iconClick layui-tree-icon">
|
||||
<LayIcon :type="nodeIconType(node)" @click.prevent.stop="handleNodeClick(node)"></LayIcon>
|
||||
<LayIcon
|
||||
:type="nodeIconType(node)"
|
||||
@click.prevent.stop="handleNodeClick(node)"
|
||||
/>
|
||||
</span>
|
||||
<span class="layui-tree-txt">{{ node.title }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-show="node.spread"
|
||||
class="layui-tree-pack layui-tree-showLine"
|
||||
style="display: block"
|
||||
v-show="node.spread"
|
||||
>
|
||||
<LayTreeEntity
|
||||
v-for="(item, index) in node.children"
|
||||
:key="index"
|
||||
:node="item"
|
||||
:only-icon-control="onlyIconControl"
|
||||
@node-click="innerClick"
|
||||
:onlyIconControl="onlyIconControl"
|
||||
></LayTreeEntity>
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -99,9 +105,15 @@ function innerClick (node: TreeNode) {
|
||||
}"
|
||||
>
|
||||
<div class="layui-tree-entry">
|
||||
<div class="layui-tree-main" @click.prevent.stop="!onlyIconControl && handleNodeClick(node)">
|
||||
<div
|
||||
class="layui-tree-main"
|
||||
@click.prevent.stop="!onlyIconControl && handleNodeClick(node)"
|
||||
>
|
||||
<span class="layui-tree-iconClick">
|
||||
<LayIcon type="layui-icon-file" @click.prevent.stop="handleNodeClick(node)"></LayIcon>
|
||||
<LayIcon
|
||||
type="layui-icon-file"
|
||||
@click.prevent.stop="handleNodeClick(node)"
|
||||
/>
|
||||
</span>
|
||||
<span class="layui-tree-txt">{{ node.title }}</span>
|
||||
</div>
|
||||
|
||||
@@ -30,39 +30,43 @@ interface TreeData {
|
||||
* 点击节点弹出新窗口对应的 url。需开启 isJump 参数
|
||||
* 废弃,通过 on-click事件用户控制
|
||||
*/
|
||||
href: string | URL
|
||||
href?: string | URL
|
||||
/**
|
||||
* 节点是否初始展开,默认 false
|
||||
* 废弃:设置 v-model:spreadKeys
|
||||
*/
|
||||
spread: boolean
|
||||
spread?: boolean
|
||||
/**
|
||||
* 节点是否初始为选中状态(如果开启复选框的话),默认 false
|
||||
* 废弃:设置 v-model:checkedKeys
|
||||
*/
|
||||
checked: boolean
|
||||
checked?: boolean
|
||||
/**
|
||||
* 节点是否为禁用状态。默认 false
|
||||
*/
|
||||
disabled: boolean
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
export declare interface TreeProps {
|
||||
interface TreeProps {
|
||||
/**
|
||||
* 指定唯一的id
|
||||
*/
|
||||
// eslint-disable-next-line vue/require-default-prop
|
||||
key?: string
|
||||
/**
|
||||
* 选中的节点
|
||||
*/
|
||||
// eslint-disable-next-line vue/require-default-prop
|
||||
checkedKeys?: (string | number)[]
|
||||
/**
|
||||
* 展开的节点
|
||||
*/
|
||||
// eslint-disable-next-line vue/require-default-prop
|
||||
spreadKeys?: (string | number)[]
|
||||
/**
|
||||
* 数据源
|
||||
*/
|
||||
// eslint-disable-next-line vue/require-default-prop
|
||||
data?: TreeData[]
|
||||
/**
|
||||
* 是否显示复选框 默认 false
|
||||
@@ -95,6 +99,7 @@ export declare interface TreeProps {
|
||||
/**
|
||||
* 自定义各类默认文本,目前支持以下设定:
|
||||
*/
|
||||
// eslint-disable-next-line vue/require-default-prop
|
||||
text?: {
|
||||
/**
|
||||
* 节点默认名称
|
||||
@@ -107,7 +112,6 @@ export declare interface TreeProps {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
interface EmitData {
|
||||
/**
|
||||
* 当前点击的节点数据
|
||||
@@ -158,18 +162,16 @@ const props = withDefaults(defineProps<TreeProps>(), {
|
||||
|
||||
const emit = defineEmits<TreeEmits>()
|
||||
|
||||
const {
|
||||
innerTreeData,
|
||||
updateInnerTreeData,
|
||||
treeWrapperClass
|
||||
} = useTreeData(props, emit)
|
||||
const { innerTreeData, updateInnerTreeData, treeWrapperClass } = useTreeData(
|
||||
props,
|
||||
emit
|
||||
)
|
||||
|
||||
function handleNodeClick(node: TreeNode) {
|
||||
updateInnerTreeData(innerTreeData.value, node)
|
||||
const emitNode = getEmitNode(props.data!, node)
|
||||
emit('node-click', { data: emitNode! })
|
||||
}
|
||||
|
||||
</script>
|
||||
<script lang="ts">
|
||||
export default {
|
||||
@@ -179,12 +181,12 @@ export default {
|
||||
<template>
|
||||
<div :class="treeWrapperClass">
|
||||
<TreeEntity
|
||||
v-for="(node) in innerTreeData"
|
||||
:key="node.id"
|
||||
v-for="(node, index) in innerTreeData"
|
||||
:key="node.id || index"
|
||||
:node="node"
|
||||
:onlyIconControl="onlyIconControl"
|
||||
:only-icon-control="onlyIconControl"
|
||||
@node-click="handleNodeClick"
|
||||
></TreeEntity>
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped></style>
|
||||
|
||||
@@ -3,7 +3,14 @@
|
||||
* @see https://github.com/vuejs/vue-next/issues/4294
|
||||
* 暂时 在index.vue内部单独实现一份
|
||||
*/
|
||||
import { ComputedRef, CSSProperties, Ref, UnwrapRef, VNode, VNodeChild, WritableComputedRef } from 'vue'
|
||||
import {
|
||||
ComputedRef,
|
||||
Ref,
|
||||
UnwrapRef,
|
||||
VNode,
|
||||
VNodeChild,
|
||||
WritableComputedRef,
|
||||
} from 'vue'
|
||||
import { Nullable, Recordable } from '/@src/module/type'
|
||||
|
||||
type EditAction = 'add' | 'update' | 'del'
|
||||
@@ -31,21 +38,21 @@ export declare interface TreeData {
|
||||
* 点击节点弹出新窗口对应的 url。需开启 isJump 参数
|
||||
* 废弃,通过 on-click事件用户控制
|
||||
*/
|
||||
href: string | URL
|
||||
href?: string | URL
|
||||
/**
|
||||
* 节点是否初始展开,默认 false
|
||||
* 废弃:设置 v-model:spreadKeys
|
||||
*/
|
||||
spread: boolean
|
||||
spread?: boolean
|
||||
/**
|
||||
* 节点是否初始为选中状态(如果开启复选框的话),默认 false
|
||||
* 废弃:设置 v-model:checkedKeys
|
||||
*/
|
||||
checked: boolean
|
||||
checked?: boolean
|
||||
/**
|
||||
* 节点是否为禁用状态。默认 false
|
||||
*/
|
||||
disabled: boolean
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
export declare interface TreeProps {
|
||||
|
||||
@@ -6,7 +6,10 @@ import { Nullable } from '/@src/module/type'
|
||||
* @param data
|
||||
* @param parentId
|
||||
*/
|
||||
export const generatorTreeData = (data: TreeData[] | TreeNode[], parentId: TreeNode['parentId'] = ''): TreeNode[] => {
|
||||
export const generatorTreeData = (
|
||||
data: TreeData[] | TreeNode[],
|
||||
parentId: TreeNode['parentId'] = ''
|
||||
): TreeNode[] => {
|
||||
const innerTreeData: TreeNode[] = []
|
||||
const len = data.length
|
||||
for (let i = 0; i < len; i++) {
|
||||
@@ -14,7 +17,7 @@ export const generatorTreeData = (data: TreeData[] | TreeNode[], parentId: TreeN
|
||||
const inner = {
|
||||
...item,
|
||||
parentId: parentId,
|
||||
spread: item.spread || false
|
||||
spread: item.spread || false,
|
||||
}
|
||||
if (item.children && item.children.length > 0) {
|
||||
inner.children = generatorTreeData(item.children, item.id)
|
||||
@@ -31,7 +34,7 @@ export const generatorTreeData = (data: TreeData[] | TreeNode[], parentId: TreeN
|
||||
export const setNextSiblings = (data: TreeNode[]): void => {
|
||||
const len = data.length
|
||||
for (let i = 0; i < len; i++) {
|
||||
data[i]._nextSibling = (i + 1) < len ? data[i+1] : null
|
||||
data[i]._nextSibling = i + 1 < len ? data[i + 1] : null
|
||||
if (data[i].children && data[i].children.length > 0) {
|
||||
setNextSiblings(data[i].children)
|
||||
}
|
||||
@@ -43,7 +46,10 @@ export const setNextSiblings = (data: TreeNode[]): void => {
|
||||
* @param data
|
||||
* @param parentNode
|
||||
*/
|
||||
export const setParentNode = (data: TreeNode[], parentNode?: TreeNode): void => {
|
||||
export const setParentNode = (
|
||||
data: TreeNode[],
|
||||
parentNode?: TreeNode
|
||||
): void => {
|
||||
const len = data.length
|
||||
for (let i = 0; i < len; i++) {
|
||||
data[i]._parentNode = parentNode ? parentNode : null
|
||||
@@ -71,7 +77,7 @@ export const initialTreeData = (data: TreeData[]): TreeNode[] => {
|
||||
* @param data
|
||||
*/
|
||||
export const getTreeSpreadKeys = (data: TreeData[]): (string | number)[] => {
|
||||
let keys: (string | number) [] = []
|
||||
let keys: (string | number)[] = []
|
||||
const len = data.length
|
||||
for (let i = 0; i < len; i++) {
|
||||
const id: number | string = data[i].id
|
||||
@@ -90,7 +96,10 @@ export const getTreeSpreadKeys = (data: TreeData[]): (string | number)[] => {
|
||||
* @param data
|
||||
* @param node
|
||||
*/
|
||||
export const getEmitNode = (data: TreeData[], node: TreeNode): Nullable<TreeData> => {
|
||||
export const getEmitNode = (
|
||||
data: TreeData[],
|
||||
node: TreeNode
|
||||
): Nullable<TreeData> => {
|
||||
let item: Nullable<TreeData> = null
|
||||
const len = data.length
|
||||
for (let i = 0; i < len; i++) {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import { TreeData, UseTreeData } from '/@src/module/tree/tree.type'
|
||||
import { computed, ref, unref, watch } from 'vue'
|
||||
import { getTreeSpreadKeys, initialTreeData } from '/@src/module/tree/treeHelper'
|
||||
import {
|
||||
getTreeSpreadKeys,
|
||||
initialTreeData,
|
||||
} from '/@src/module/tree/treeHelper'
|
||||
import { Recordable } from '/@src/module/type'
|
||||
|
||||
export const useTreeData: UseTreeData = (props, emit) => {
|
||||
@@ -14,21 +17,25 @@ export const useTreeData: UseTreeData = (props, emit) => {
|
||||
},
|
||||
set: (value: (string | number)[]) => {
|
||||
emit('update:spreadKeys', value)
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
/**
|
||||
* 渲染的data
|
||||
*/
|
||||
const innerTreeData = ref<TreeData[]>([])
|
||||
watch(() => props.data, (treeData) => {
|
||||
if (treeData) {
|
||||
innerTreeData.value = initialTreeData(treeData)
|
||||
}
|
||||
}, { immediate: true, deep: true })
|
||||
watch(
|
||||
() => props.data,
|
||||
(treeData) => {
|
||||
if (treeData) {
|
||||
innerTreeData.value = initialTreeData(treeData)
|
||||
}
|
||||
},
|
||||
{ immediate: true, deep: true }
|
||||
)
|
||||
|
||||
function updateInnerTreeData(treeData: TreeData[], node: TreeData): void {
|
||||
for(let i = 0; i <treeData.length; i++) {
|
||||
for (let i = 0; i < treeData.length; i++) {
|
||||
if (treeData[i].id === node.id) {
|
||||
treeData[i].spread = !treeData[i].spread
|
||||
break
|
||||
@@ -55,6 +62,6 @@ export const useTreeData: UseTreeData = (props, emit) => {
|
||||
spreadKeys,
|
||||
innerTreeData,
|
||||
updateInnerTreeData,
|
||||
treeWrapperClass
|
||||
treeWrapperClass,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user