init
This commit is contained in:
Binary file not shown.
@@ -0,0 +1 @@
|
||||
x5<><35><0E>0D<><44>^:<06>V]ү<>$<24>U<17>@h(<28><><EFBFBD><0C><><EFBFBD>;<1D> 4<>GUs<55>'2(~<7E><><02>i<EFBFBD>9@<40><><EFBFBD>T<EFBFBD>s<EFBFBD><0E>e<0B>g<EFBFBD>8h<38>*<2A><><EFBFBD><EFBFBD>qUm<55><6D>t<EFBFBD>l<16><>4<EFBFBD><34>D<1F>^<5E>b<EFBFBD>4<EFBFBD><34><EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><01><>)<29>
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,224 @@
|
||||
import { OriginalTreeData, StringOrNumber } from "./tree.type";
|
||||
import { Nullable } from "../../types";
|
||||
import { Ref, ref } from "vue";
|
||||
import { check } from "prettier";
|
||||
|
||||
type CustomKey = string | number;
|
||||
type CustomString = (() => string) | string;
|
||||
|
||||
export interface TreeData {
|
||||
id: CustomKey;
|
||||
title: CustomString;
|
||||
children: TreeData[];
|
||||
parentKey: Nullable<StringOrNumber>;
|
||||
isRoot: boolean;
|
||||
isChecked: boolean;
|
||||
isDisabled: boolean;
|
||||
isLeaf: boolean;
|
||||
hasNextSibling: boolean;
|
||||
parentNode: Nullable<TreeData>;
|
||||
}
|
||||
|
||||
interface ReplaceFields {
|
||||
id: string;
|
||||
title: string;
|
||||
children: string;
|
||||
}
|
||||
|
||||
interface TreeConfig {
|
||||
checkStrictly: boolean | string;
|
||||
showCheckbox: boolean;
|
||||
checkedKeys: StringOrNumber[];
|
||||
expandKeys: StringOrNumber[];
|
||||
nodeMap: Map<StringOrNumber, TreeData>;
|
||||
originMap: Map<StringOrNumber, OriginalTreeData>;
|
||||
replaceFields: ReplaceFields;
|
||||
}
|
||||
|
||||
class Tree {
|
||||
protected config: TreeConfig;
|
||||
protected treeData: TreeData[];
|
||||
|
||||
constructor(
|
||||
config: TreeConfig,
|
||||
origin: OriginalTreeData | OriginalTreeData[]
|
||||
) {
|
||||
this.config = config;
|
||||
this.treeData = [];
|
||||
this.init(origin);
|
||||
}
|
||||
|
||||
init(origin: OriginalTreeData | OriginalTreeData[]): void {
|
||||
const tree = this.createTree(origin);
|
||||
this.treeData = tree;
|
||||
}
|
||||
|
||||
createTree(
|
||||
origin: OriginalTreeData | OriginalTreeData[],
|
||||
parentKey: StringOrNumber = ""
|
||||
): TreeData[] {
|
||||
let data;
|
||||
if (!Array.isArray(origin)) {
|
||||
data = Array.of(Object.assign({}, origin));
|
||||
} else {
|
||||
data = origin;
|
||||
}
|
||||
const nodeList: TreeData[] = [];
|
||||
const { children } = this.config.replaceFields;
|
||||
|
||||
const len = data.length;
|
||||
for (let i = 0; i < len; i++) {
|
||||
const node = this.getNode(data[i], parentKey, i < len - 1);
|
||||
const nodeChildren = Reflect.get(node, children);
|
||||
const nodeHasChildren = !!Reflect.get(node, children);
|
||||
|
||||
if (nodeHasChildren) {
|
||||
Reflect.set(node, children, this.createTree(nodeChildren, node.id));
|
||||
}
|
||||
|
||||
nodeList.push(node);
|
||||
}
|
||||
return nodeList;
|
||||
}
|
||||
|
||||
getNode(
|
||||
origin: OriginalTreeData,
|
||||
parentKey: StringOrNumber,
|
||||
hasNextSibling: boolean
|
||||
): TreeData {
|
||||
const {
|
||||
nodeMap,
|
||||
originMap,
|
||||
checkedKeys,
|
||||
expandKeys,
|
||||
checkStrictly,
|
||||
replaceFields: { children, id, title },
|
||||
} = this.config;
|
||||
|
||||
const nodeKey = Reflect.get(origin, id);
|
||||
const nodeTitle = Reflect.get(origin, title);
|
||||
const nodeChildren = Reflect.get(origin, children);
|
||||
const nodeDisabled = !!Reflect.get(origin, "disabled");
|
||||
const nodeIsLeaf = !!Reflect.get(origin, "spread");
|
||||
const parentNode = nodeMap.get(parentKey);
|
||||
|
||||
const node = Object.assign({}, origin, {
|
||||
id: nodeKey,
|
||||
title: nodeTitle,
|
||||
children: nodeChildren ? nodeChildren : [],
|
||||
parentKey: parentKey,
|
||||
isRoot: parentKey === "",
|
||||
isDisabled: false,
|
||||
isChecked: false,
|
||||
isLeaf: false,
|
||||
hasNextSibling: hasNextSibling,
|
||||
parentNode: parentNode || null,
|
||||
});
|
||||
|
||||
node.isDisabled = nodeDisabled;
|
||||
node.isChecked = checkedKeys.includes(nodeKey);
|
||||
node.isLeaf = parentNode ? parentNode.isLeaf : expandKeys.includes(nodeKey);
|
||||
node.isLeaf = nodeIsLeaf;
|
||||
|
||||
if (!nodeMap.has(nodeKey)) {
|
||||
nodeMap.set(nodeKey, node);
|
||||
}
|
||||
if (!originMap.has(nodeKey)) {
|
||||
originMap.set(nodeKey, origin);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
treeForeach(tree: any, func: Function) {
|
||||
tree.forEach((data: any) => {
|
||||
data.children && this.treeForeach(data.children, func);
|
||||
func(data);
|
||||
});
|
||||
}
|
||||
|
||||
setChildrenChecked(checked: boolean, nodes: TreeData[]) {
|
||||
var ableCount = 0;
|
||||
var checkCount = 0;
|
||||
const len = nodes.length;
|
||||
this.treeForeach(nodes, (node: any) => {
|
||||
if (!node.isDisabled) {
|
||||
ableCount = ableCount + 1;
|
||||
if (node.isChecked) {
|
||||
checkCount = checkCount + 1;
|
||||
}
|
||||
}
|
||||
});
|
||||
checkCount < ableCount ? (checked = true) : (checked = false);
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (
|
||||
!nodes[i].isDisabled ||
|
||||
(nodes[i].isDisabled && nodes[i].children.length > 0)
|
||||
) {
|
||||
nodes[i].isChecked = checked;
|
||||
}
|
||||
nodes[i].children &&
|
||||
nodes[i].children.length > 0 &&
|
||||
this.setChildrenChecked(checked, nodes[i].children);
|
||||
}
|
||||
}
|
||||
|
||||
setParentChecked(checked: boolean, parent: TreeData) {
|
||||
if (!parent) {
|
||||
return;
|
||||
}
|
||||
parent.isChecked = checked;
|
||||
const pChild = parent.children;
|
||||
const pChildChecked = pChild.some((c) => c.isChecked);
|
||||
if (pChildChecked) {
|
||||
parent.isChecked = true;
|
||||
}
|
||||
if (parent.parentNode) {
|
||||
this.setParentChecked(checked, parent.parentNode);
|
||||
}
|
||||
}
|
||||
|
||||
setCheckedKeys(
|
||||
checked: boolean,
|
||||
checkStrictly: boolean | string,
|
||||
node: TreeData
|
||||
) {
|
||||
node.isChecked = checked;
|
||||
if (!checkStrictly) {
|
||||
if (node.parentNode) {
|
||||
this.setParentChecked(checked, node.parentNode);
|
||||
}
|
||||
if (node.children) {
|
||||
this.setChildrenChecked(checked, node.children);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getData() {
|
||||
return this.treeData;
|
||||
}
|
||||
|
||||
getKeys() {
|
||||
const checkedKeys = [];
|
||||
const expandKeys = [];
|
||||
const iterator = this.config.nodeMap[Symbol.iterator]();
|
||||
let next = iterator.next();
|
||||
while (!next.done) {
|
||||
const [, node] = next.value;
|
||||
const id = Reflect.get(node, this.config.replaceFields.id);
|
||||
if (node.isChecked) {
|
||||
checkedKeys.push(id);
|
||||
}
|
||||
if (node.isLeaf) {
|
||||
expandKeys.push(id);
|
||||
}
|
||||
next = iterator.next();
|
||||
}
|
||||
return { checkedKeys, expandKeys };
|
||||
}
|
||||
|
||||
getOriginData(key: StringOrNumber): OriginalTreeData {
|
||||
return this.config.originMap.get(key)!;
|
||||
}
|
||||
}
|
||||
|
||||
export { Tree };
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -0,0 +1,11 @@
|
||||
::: title 常见问题
|
||||
:::
|
||||
|
||||
::: describe 以下整理了一些 Layui Vue 社区常见的问题和官方答复,在提问之前建议找找有没有类似的问题。
|
||||
:::
|
||||
|
||||
::: describe 若你想在 DOM 中直接书写 Vue 模板,Vue 则必须从 DOM 中获取模板字符串。因为浏览器的原生 HTML 解析行为,因此有一些需要注意的事项。
|
||||
:::
|
||||
|
||||
::: describe <a>https://staging-cn.vuejs.org/guide/essentials/component-basics.html#dom-template-parsing-caveats</a >
|
||||
:::
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
.layui-checkbox[size=lg]{height:18px;line-height:18px}.layui-checkbox[size=lg] .layui-form-checkbox[lay-skin=primary] .layui-icon{width:18px;height:18px;font-size:16px}.layui-checkbox[size=lg] .layui-form-checkbox[lay-skin=primary] .layui-checkbox-label{height:18px;line-height:18px;font-size:16px}.layui-checkbox[size=md]{height:16px;line-height:16px}.layui-checkbox[size=md] .layui-form-checkbox[lay-skin=primary] .layui-icon{width:16px;height:16px;font-size:14px}.layui-checkbox[size=md] .layui-form-checkbox[lay-skin=primary] .layui-checkbox-label{height:16px;line-height:16px;font-size:14px}.layui-checkbox[size=sm]{height:14px;line-height:14px}.layui-checkbox[size=sm] .layui-form-checkbox[lay-skin=primary] .layui-icon{width:14px;height:14px;font-size:12px}.layui-checkbox[size=sm] .layui-form-checkbox[lay-skin=primary] .layui-checkbox-label{height:14px;line-height:14px;font-size:12px}.layui-checkbox[size=xs]{height:12px;line-height:12px}.layui-checkbox[size=xs] .layui-form-checkbox[lay-skin=primary] .layui-icon{width:12px;height:12px;font-size:10px}.layui-checkbox[size=xs] .layui-form-checkbox[lay-skin=primary] .layui-checkbox-label{height:12px;line-height:12px;font-size:10px}.layui-checkbox input[type=checkbox]{display:none}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:var(--global-neutral-color-6);color:#fff;overflow:hidden}.layui-form-checkbox:hover span{background-color:var(--global-neutral-color-8)}.layui-form-checkbox i{top:0;right:0;width:29px;height:28px;position:absolute;border:1px solid var(--global-neutral-color-6);border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:var(--global-neutral-color-8);color:var(--global-neutral-color-8)}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid var(--global-neutral-color-6);font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:var(--global-checked-color);color:#fff}.layui-form-checked,.layui-form-checked:hover{border-color:var(--global-checked-color)}.layui-form-checked i,.layui-form-checked:hover i{color:var(--global-checked-color)}.layui-form-checked span,.layui-form-checked:hover span{background-color:var(--global-checked-color)}.layui-form-checked[lay-skin=primary] i{border-color:var(--global-checked-color);background-color:var(--global-checked-color);color:#fff}.layui-form-checked[lay-skin=primary] span{background:0 0!important}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:var(--global-neutral-color-8)!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:var(--global-neutral-color-6)}.layui-checkbox-disabled,.layui-checkbox-disabled i{border-color:var(--global-neutral-color-3)!important}.layui-checkbox-disabled span{background-color:var(--global-neutral-color-3)!important}.layui-checkbox-disabled em{color:var(--global-neutral-color-6)!important}.layui-checkbox-disabled:hover i{color:#fff!important}.layui-checkbox-disabled .layui-icon-ok,.layui-checkbox-disabled .layui-icon-subtraction{background-color:var(--global-neutral-color-3)!important;border-color:var(--global-neutral-color-3)!important}
|
||||
Reference in New Issue
Block a user