63 | * ```
64 | */
65 | export default {
66 | bind(el, binding, vnode) {
67 | nodeList.push(el);
68 | const id = seed++;
69 | el[ctx] = {
70 | id,
71 | documentHandler: createDocumentHandler(el, binding, vnode),
72 | methodName: binding.expression,
73 | bindingFn: binding.value
74 | };
75 | },
76 |
77 | update(el, binding, vnode) {
78 | el[ctx].documentHandler = createDocumentHandler(el, binding, vnode);
79 | el[ctx].methodName = binding.expression;
80 | el[ctx].bindingFn = binding.value;
81 | },
82 |
83 | unbind(el) {
84 | let len = nodeList.length;
85 |
86 | for (let i = 0; i < len; i++) {
87 | if (nodeList[i][ctx].id === el[ctx].id) {
88 | nodeList.splice(i, 1);
89 | break;
90 | }
91 | }
92 | delete el[ctx];
93 | }
94 | };
95 |
--------------------------------------------------------------------------------
/src/main/main.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
25 |
26 |
63 |
64 |
65 |
66 |
67 |
449 |
450 |
504 |
--------------------------------------------------------------------------------
/src/main/utils.js:
--------------------------------------------------------------------------------
1 | export function deepClone(source) {
2 | if (!source && typeof source !== "object") {
3 | throw new Error("error arguments", "shallowClone");
4 | }
5 | const targetObj = source.constructor === Array ? [] : {};
6 | Object.keys(source).forEach(keys => {
7 | if (source[keys] && typeof source[keys] === "object") {
8 | targetObj[keys] = source[keys].constructor === Array ? [] : {};
9 | targetObj[keys] = deepClone(source[keys]);
10 | } else {
11 | targetObj[keys] = source[keys];
12 | }
13 | });
14 | return targetObj;
15 | }
16 |
17 | export function hasArrayChild(obj, childrenKey) {
18 | return obj[childrenKey] && Array.isArray(obj[childrenKey]);
19 | }
20 |
21 | let id = 0;
22 |
23 | export function getId() {
24 | return ++id;
25 | }
26 |
27 | export function fireEvent(element, event) {
28 | if (document.createEventObject) {
29 | // IE浏览器支持fireEvent方法
30 | var evt = document.createEventObject();
31 | return element.fireEvent("on" + event, evt);
32 | } else {
33 | // 其他标准浏览器使用dispatchEvent方法
34 | var evt = document.createEvent("HTMLEvents");
35 | evt.initEvent(event, true, true);
36 | return !element.dispatchEvent(evt);
37 | }
38 | }
39 |
40 | export function isPromise(obj) {
41 | return !!obj && (typeof obj === "object" || typeof obj === "function") && typeof obj.then === "function";
42 | }
43 |
44 | // 所有选项
45 | export const props = {
46 | value: {
47 | type: Array,
48 | default() {
49 | return [];
50 | }
51 | },
52 | placeholder: {
53 | type: String,
54 | default: "请选择"
55 | },
56 | disabled: {
57 | type: Boolean,
58 | default: false
59 | },
60 | options: {
61 | type: Array,
62 | default() {
63 | return [];
64 | }
65 | },
66 | size: {
67 | type: String,
68 | default: ""
69 | },
70 | selectChildren: {
71 | type: Boolean,
72 | default: false
73 | },
74 | noDataText: {
75 | type: String,
76 | default: "无数据"
77 | },
78 | collapseTags: {
79 | type: Boolean,
80 | default: false
81 | },
82 | separator: {
83 | type: String,
84 | default: "/"
85 | },
86 | showAllLevels: {
87 | type: Boolean,
88 | default: false
89 | },
90 | outputLevelValue: {
91 | type: Boolean,
92 | default: false
93 | },
94 | // 显示加载指示器
95 | showLoadingIndicator: {
96 | type: Boolean,
97 | default: true
98 | },
99 | // 允许加载子项
100 | allowLoadChildren: {
101 | type: Boolean,
102 | default: false
103 | },
104 | // 加载方法
105 | loadChildrenMethod: {
106 | type: Function,
107 | default: null,
108 | return: Promise
109 | },
110 | // key
111 | labelKey: {
112 | type: String,
113 | default: "label"
114 | },
115 | valueKey: {
116 | type: String,
117 | default: "value"
118 | },
119 | childrenKey: {
120 | type: String,
121 | default: "children"
122 | },
123 | popperClass: {
124 | type: String,
125 | default: ""
126 | },
127 | clearable: {
128 | type: Boolean,
129 | default: false
130 | },
131 | panelWidth: {
132 | type: [Number, String],
133 | default: 160
134 | }
135 | };
136 |
--------------------------------------------------------------------------------
/vue.config.js:
--------------------------------------------------------------------------------
1 | let config = {
2 | publicPath: process.env.NODE_ENV === "production" ? "/ele-multi-cascader/" : "/",
3 |
4 | configureWebpack: {
5 | output: {
6 | libraryExport: "default"
7 | }
8 | },
9 |
10 | css: {
11 | extract: false
12 | }
13 | };
14 |
15 | // if (process.env.NODE_ENV === "production") {
16 | // config.configureWebpack.externals = {
17 | // cascaderjs: {
18 | // commonjs: "multi-cascaderjs",
19 | // commonjs2: "multi-cascaderjs",
20 | // amd: "multi-cascaderjs",
21 | // cmd: "multi-cascaderjs",
22 | // root: "Multi-cascaderjs"
23 | // }
24 | // };
25 | // }
26 |
27 | module.exports = config;
28 |
--------------------------------------------------------------------------------