//@ts-nocheck import { defineComponent, computed } from "vue"; import { xU } from "../ventoseUtils"; import { $t } from "../State_UI"; /*$t 可能会变,所以每次render用新的数据*/ const BTN_PRESET_MAP = { query: () => ({ icon: , text: $t("查询").label }), refresh: () => ({ icon: , text: $t("刷新").label }), cancel: () => ({ text: $t("取消").label }), save: () => ({ icon: , text: $t("保存").label }), upload: () => ({ icon: , text: $t("上传").label }), delete: configs => { configs.type = "danger"; configs.ghost = true; return { icon: , text: $t("删除").label }; } }; export type t_buttonOptions = { text?: any; onClick?: () => Promise; }; export default defineComponent({ name: "xButton", props: { payload: { type: Object, default() { return {}; } }, configs: { type: Object, default() { return {}; } } }, beforeMount() { if (!this.configs) { debugger; return; } /* 预置 */ const presetFn = BTN_PRESET_MAP[this.configs.preset]; if (presetFn) { const preset = presetFn(this.configs); this.configs.text = ( <> {preset.icon} {preset.text} ); } }, data() { return { loading: true }; }, setup(props) { let Cpt_isShow = true; if (props.configs.isShow !== undefined) { if (xU.isFunction(props.configs.isShow)) { Cpt_isShow = computed(props.configs.isShow); } if (xU.isBoolean(props.configs.isShow)) { Cpt_isShow = props.configs.isShow; } } return { Cpt_isShow }; }, computed: { isClickHandlerOnAttrs() { return !!this.$attrs?.onClick; }, type() { if (["query", "save"].includes(this.configs.preset)) { return "primary"; } return this.configs.type; }, title() { /*disabled是String则为弹窗提示*/ if (xU.isString(this.disabled) && this.disabled.length > 0) { return this.disabled; } if (xU.isString(this.configs.title) && this.configs.title.length > 0) { return this.configs.title; } return false; }, disabled() { if (xU.isBoolean(this.configs.disabled)) { return this.configs.disabled; } if (xU.isFunction(this.configs.disabled)) { return this.configs.disabled(this); } return false; }, text() { /* text作为render */ if (xU.isFunction(this.configs.text)) { return this.configs.text(this) || ""; } /* text 作为 string */ return this.configs.text || ""; } }, watch: { configs: { immediate: true, handler(configs) { this.loading = !!configs.loading; } } }, created() {}, methods: { async handleButtonClick() { if (xU.isFunction(this?.configs?.onClick)) { this.loading = true; try { await this?.configs?.onClick.call(this.configs, this); } catch (e) { console.error(e); } finally { this.loading = false; } } } }, render() { if (!this.Cpt_isShow) { return null; } const propsWillDeleteFromProperty = [ "text", "loading", "disabled", "title", "onClick" ]; const _properties = xU.omit(this.configs, propsWillDeleteFromProperty); /* 直接在dom上的onClick优先级更高, */ if (!this.isClickHandlerOnAttrs) { _properties.onClick = this.handleButtonClick; } if (this.title) { _properties.title = this.title; } return ( { const vDomDefautl = this.$slots.default && this.$slots.default(); return ( <> {this.text} {vDomDefautl} ); } }} /> ); } });