riku
2025-04-27 233a467167e2b363098cc7fa63e7f26d1d15507b
components/form/index.js
@@ -1,4 +1,9 @@
import { cascaderNote } from './form-util.js';
Component({
  options: {
    multipleSlots: true, // 在组件定义时的选项中启用多slot支持
  },
  properties: {
    /**
     * 表单输入框采用T-design框架下的Input组件
@@ -10,7 +15,7 @@
     * value: 真实值,
     * status: 输入框状态。可选项:success/warning/error,
     * tips: 输入框下方提示文本,会根据不同的 status 呈现不同的样式,
     * inputType: 输入类型 (text: 输入框;switch:切换按钮; picker: 下拉框选项; cascader: 级联选择),
     * inputType: 输入类型 (text: 输入框; switch: 切换按钮; picker: 下拉框选项; cascader: 级联选择),
     * options: 当输入类型为picker或cascader时,提供可选项,
     * cascaderTitles: 当输入类型为cascader时,提供每个选项的标题,
     */
@@ -20,6 +25,26 @@
      observer(v) {
        this.setData({ formArray: v });
      },
    },
    // 确认文本
    submitText: {
      type: String,
      value: '保存',
    },
    // 取消文本
    cancelText: {
      type: String,
      value: '取消',
    },
    // 是否执行校验
    validated: {
      type: Boolean,
      value: false,
    },
    // 是否可编辑
    editable: {
      type: Boolean,
      value: true,
    },
  },
@@ -55,10 +80,8 @@
      this.setData({
        [`formArray[${index}].visible`]: false,
        [`formArray[${index}]._value`]: value,
        [`formArray[${index}].value`]: {
          label: label[0],
          value: value[0],
        },
        [`formArray[${index}]._label`]: label[0],
        [`formArray[${index}].value`]: value[0],
      });
    },
    onPickerCancel(e) {
@@ -75,9 +98,9 @@
    onCascaderChange(e) {
      const { index } = e.currentTarget.dataset;
      const { selectedOptions, value } = e.detail;
      const note = this._note(selectedOptions);
      const note = cascaderNote(selectedOptions);
      const v = selectedOptions.map(v => {
        return { label: v.label, value: v.value };
        return v.value;
      });
      this.setData({
        [`formArray[${index}].visible`]: false,
@@ -90,14 +113,26 @@
    // 保存
    onSubmit() {
      const formObj = {};
      let fail = false;
      this.data.formArray.forEach(e => {
        if (e.required && !e.value) {
          fail = true;
          this.setData({ validated: true });
          return;
        }
        if (e.inputType == 'picker') {
          formObj[e.name] = e.value ? e.value.value : e.value;
          formObj[e.name] = e.value;
        } else if (e.inputType == 'cascader') {
          e.referItems.forEach((r, i) => {
            formObj[r] = e.value[i];
          });
        } else {
          formObj[e.name] = e.value;
        }
      });
      this.triggerEvent('submit', formObj);
      if (!fail) {
        this.triggerEvent('submit', formObj);
      }
    },
    // 取消
    onCancel() {