Skip to content

增加子表/行

介绍

基于 vant 进行插件化前置函数开发

代码演示

代码展示

Js

import dayjs from "dayjs";
import { Toast } from "vant";
const version = "0.0.1";
function install(Vue) {
  // 2022-09-23 13:14:28 by lee
  Vue.prototype.$bus = new Vue();
  Vue.prototype.$showLoading = (opt = {}) => {
    return Toast.loading({
      ...{
        message: "加载中...",
        duration: 0, // 持续展示 toast
        forbidClick: true,
        type: "loading"
      },
      ...opt
    });
  };
  Vue.prototype.$hideLoading = instance => {
    if (instance) {
      instance.clear();
    } else {
      Toast.clear();
    }
  };
  Vue.prototype.$tip = (cb, obj) => {
    obj = obj || {
      duration: 1000
    };
    let duration = obj.duration || 1000;
    Vue.prototype.$toast({
      ...{
        message: "保存成功!",
        type: "success",
        duration
      },
      ...obj
    });
    setTimeout(() => {
      cb && cb();
    }, duration);
  };
  Vue.prototype.$day = dayjs;
  Vue.prototype.$formatDay = (time, unit = "YYYY-MM-DD HH:mm:ss") => {
    if (!time) {
      return "";
    }
    return Vue.prototype.$day(time).format(unit);
  };
  Vue.prototype.$typeof = o => Object.prototype.toString.call(o).slice(8, -1);
  // 判断两个数组是否有重合 应用场景, 个人权限中 有 符合 业务权限的 项 。返回true 可以直接开放权限
  Vue.prototype.$contains = (...args) => {
    let allArr = [];
    [...args].map(v => (allArr = [...allArr, ...v]));
    return [...new Set(allArr)].length < allArr.length;
  };
  // 板块高度自动计算 by lee 需要注意的是v-show导致元素高度为0 ,建议使用 v-if + keepAlive 的形式
  Vue.directive("layout", {
    inserted: (elm, binding) => {
      let otherH = 0,
        unit = binding?.value?.unit || "%",
        exclude = binding?.value?.exclude || [],
        include =
          binding?.value?.include ||
          [...elm.parentElement.children].filter(item => item !== elm); //元素集合
      include = include.filter(item => !exclude.includes(item));
      include.map(item => (otherH += item.offsetHeight));
      elm.style.height = `calc( 100${unit} - ${otherH}px )`;
    }
  });
  // 调整van-cell必填项星号位置 by lee
  Vue.directive("required", (elm, binding) => {
    // 是cell 或者 field 组件
    if (![undefined, true].includes(binding?.value?.enable)) return;
    if (["van-cell", "van-field"].includes(...[...elm.classList])) {
      let position = binding?.value?.position || "right";
      if (position === "left") {
        elm.setAttribute("data-require", "van-cell--required");
        elm.classList.add("van-cell--required"); // 可以使用组件自带 require (prop)
      } else if (position === "right") {
        // elm.classList.add('van-cell--required-end'); //组件刷新class会丢失
        elm.setAttribute("data-require", "van-cell--required-end");
      }
    }
  });
  // 通过指令给表单添加只读样式
  Vue.directive("readonly", (elm, { value }) => {
    let readonlyClass = value?.class || "readonly-form";
    if (![undefined, true].includes(value?.enable)) {
      if ([...elm.classList].includes(readonlyClass)) {
        elm.classList.remove(readonlyClass);
      }
      return;
    } else {
      elm.classList.add(readonlyClass);
    }
  });
}

export default {
  install,
  version
};

Released under the MIT License.