字段联动示例

本页面通过实际案例展示如何使用 Kinlink API 实现各种表单字段联动效果。

基础字段联动

展示最基本的字段联动场景,包括显示/隐藏字段、设置必填等操作。

JavaScript
// 基础字段联动示例
(function() {
  kinlink.events.on(kinlink.FormEvents.FORM_LOADED, () => {
    const form = kinlink.formApi;
    // 初始化时隐藏相关字段
    form.hideField('其他部门名称');
    form.hideField('额外审批人');
  });

  kinlink.events.on(kinlink.FormEvents.FIELD_CHANGE, (data) => {
    const { fieldName, value } = data;
    const form = kinlink.formApi;

    // 部门选择联动
    if (fieldName === '部门') {
      if (value === '其他') {
        form.showField('其他部门名称');
        form.setFieldRequired('其他部门名称', true);
      } else {
        form.hideField('其他部门名称');
        form.setFieldRequired('其他部门名称', false);
      }
    }

    // 金额与审批人联动
    if (fieldName === '申请金额') {
      const amount = parseFloat(value);
      if (amount > 10000) {
        form.showField('额外审批人');
        form.setFieldRequired('额外审批人', true);
        form.showMessage('warning', '金额超过1万元,需要额外审批', 5);
      } else {
        form.hideField('额外审批人');
        form.setFieldRequired('额外审批人', false);
      }
    }
  });
})();

级联选择

实现城市和区域的级联选择效果,动态更新选项内容。

JavaScript
// 级联选择示例
(function() {
  // 模拟数据
  const cityData = {
    '北京': ['朝阳区', '海淀区', '东城区', '西城区'],
    '上海': ['浦东新区', '静安区', '黄浦区', '徐汇区'],
    '广州': ['天河区', '越秀区', '海珠区', '白云区']
  };

  kinlink.events.on(kinlink.FormEvents.FIELD_CHANGE, (data) => {
    const { fieldName, value } = data;
    const form = kinlink.formApi;

    if (fieldName === '城市') {
      const districts = cityData[value] || [];
      
      // 更新区域选项
      form.setFieldOptions('区域', districts.map(district => ({
        label: district,
        value: district
      })));
      
      // 清空已选区域
      form.setFieldValue('区域', undefined);
      
      // 根据是否有区域选项控制字段状态
      if (districts.length > 0) {
        form.showField('区域');
        form.setFieldRequired('区域', true);
      } else {
        form.hideField('区域');
        form.setFieldRequired('区域', false);
      }
    }
  });
})();

自动计算

根据多个字段的值自动计算结果,并根据计算结果更新界面。

JavaScript
// 自动计算示例
(function() {
  function calculateTotal(quantity, price, discount) {
    quantity = parseFloat(quantity) || 0;
    price = parseFloat(price) || 0;
    discount = parseFloat(discount) || 0;
    
    const subtotal = quantity * price;
    const discountAmount = subtotal * (discount / 100);
    return (subtotal - discountAmount).toFixed(2);
  }

  kinlink.events.on(kinlink.FormEvents.FIELD_CHANGE, (data) => {
    const { fieldName } = data;
    const form = kinlink.formApi;

    // 当数量、单价或折扣变化时重新计算总价
    if (['数量', '单价', '折扣'].includes(fieldName)) {
      const quantity = form.getFieldValue('数量');
      const price = form.getFieldValue('单价');
      const discount = form.getFieldValue('折扣');
      
      const total = calculateTotal(quantity, price, discount);
      form.setFieldValue('总价', total);
      
      // 设置高额订单提示
      if (parseFloat(total) > 10000) {
        form.setFieldLabelStyle('总价', { color: '#ff4d4f' });
        form.showMessage('warning', '这是一个高额订单');
      } else {
        form.setFieldLabelStyle('总价', { color: '#000000' });
      }
    }
  });
})();

应用场景

  • 条件显示/隐藏
  • 动态必填控制
  • 选项联动更新
  • 自动计算与提示

实现要点

  • 合理使用事件监听
  • 处理异常情况
  • 优化性能
  • 提供用户反馈

最佳实践

  • 使用 IIFE 封装代码,避免全局变量污染
  • 在 FORM_LOADED 事件中进行初始化
  • 注意处理字段值为空的情况
  • 提供适当的用户提示和反馈

相关资源