|
@@ -0,0 +1,73 @@
|
|
|
+import { css } from "@linaria/core";
|
|
|
+import { Cascader } from "ant-design-vue";
|
|
|
+import { computed, defineComponent } from "vue";
|
|
|
+import { any, string } from "vue-types";
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ props: {
|
|
|
+ data: any().isRequired,
|
|
|
+ value: any().isRequired,
|
|
|
+ },
|
|
|
+ emits: ["change"],
|
|
|
+ setup(props, { emit }) {
|
|
|
+ const selected = computed(() => {
|
|
|
+ return getCheckedArr(props.data, props.value, []) || [];
|
|
|
+ });
|
|
|
+
|
|
|
+ function getCheckedArr(list: any, value: any, pre: any): any {
|
|
|
+ if (!list || !list.length) return;
|
|
|
+ list = [...list];
|
|
|
+ const item = list.pop();
|
|
|
+ if (!item) return;
|
|
|
+ if (item.id == value) {
|
|
|
+ return [...pre, item];
|
|
|
+ } else {
|
|
|
+ return (
|
|
|
+ getCheckedArr(item.children, value, [...pre, item]) ||
|
|
|
+ getCheckedArr(list, value, pre)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return () => (
|
|
|
+ <Cascader
|
|
|
+ class={rootStyle}
|
|
|
+ options={props.data}
|
|
|
+ value={selected.value}
|
|
|
+ placeholder={"筛选"}
|
|
|
+ expand-trigger="hover"
|
|
|
+ multiple={true}
|
|
|
+ // changeOnSelect={true}
|
|
|
+ fieldNames={{ label: "name", value: "id", children: "children" }}
|
|
|
+ onChange={(values) => {
|
|
|
+ console.log(values);
|
|
|
+ emit("change", values);
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {{
|
|
|
+ displayRender: () => {
|
|
|
+ const value = selected.value[selected.value.length - 1]?.name;
|
|
|
+ return value ? value : "";
|
|
|
+ },
|
|
|
+ }}
|
|
|
+ </Cascader>
|
|
|
+ );
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const rootStyle = css`
|
|
|
+ /* .ant-cascader-input.ant-input {
|
|
|
+ outline: none;
|
|
|
+ box-shadow: none;
|
|
|
+ border: 1px solid transparent;
|
|
|
+ padding-top: 2px;
|
|
|
+ padding-bottom: 2px;
|
|
|
+ }
|
|
|
+ .ant-cascader-picker-label {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #4c4c4c;
|
|
|
+ }
|
|
|
+ .ant-cascader-picker-clear,
|
|
|
+ .ant-cascader-picker-arrow {
|
|
|
+ right: 10px;
|
|
|
+ } */
|
|
|
+`;
|