# 单选按钮组件

本组件主要实现表单中单选按钮的功能,单选按钮的列表可根据静态数据或者数据资源来配置。当单击单选按钮时可触发数据改变交互事件来向其他组件传递数据。

# 目录结构

form-radio              // 组件文件加名
	config.json         // 属性配置文件
	index.js	        // 组件解析文件
	thumbnail.png       // 组件图片
	script.js           // 依赖的脚本文件
    style.css           // 样式文件

# config.json

{
  "name": "form-radio",
  "type": "test",
  "title": "单选按钮组件",
  "width": 300,
  "height": 300,
  "dependencies": ["style.css", "script.js"], // 配置依赖
  "option": {
    "name": {
      // name用于单选按钮的标签名称
      "type": "text",
      "name": "标签名称",
      "placeholder": "请输入",
      "default": "选项按钮"
    }
  },
  "data": {
    "static": [
      {
        "label": "类型一", // 用于显示
        "value": "1" // 实际值
      },
      {
        "label": "类型二",
        "value": "2"
      }
    ],
    "matchs": {
      "label": {
        "name": "显示标签",
        "template": "{0}",
        "field": [
          {
            "fieldName": "label",
            "fieldAlias": "label"
          }
        ]
      },
      "value": {
        "name": "值",
        "template": "{0}",
        "field": [
          {
            "fieldName": "value",
            "fieldAlias": "value"
          }
        ]
      }
    },
    "rowLimit": 100
  },
  "interact": {
    "events": "数据改变事件",
    "filters": true
  }
}

# index.js

define(function() {
  "use strict";
  return {
    // 渲染主方法
    render: function(widget) {
      // 容器
      const container = this.$container();
      // 设置容器样式
      container.style.color = "#fff";
      container.style.fontSize = "38px";
      this.update(widget);
      // 组件渲染完成
      this.$emit("finish", true);
    },
    // 当widget属性改变时调用update方法更新DOM
    update: function(widget) {
      const that = this;
      const container = that.$container();
      // 生成选项按钮DOM结构
      container.className += " widget-form-radio";
      container.innerHTML = this.createDom(widget);
      const input = container.getElementsByTagName("input");
      for (let i = 0; i < input.length; i++) {
        // input绑定onchange事件
        input[i].onchange = function() {
          const eventValue = {};
          const fieldName = widget.interact.events[0].filters[0].field;
          eventValue[fieldName] = this.value;
          // 触发event-vars事件,传递绑定字段实际值
          that.$emit("event-vars", eventValue);
        };
      }
    },
    // 生成选项按钮DOM结构
    createDom: function(widget) {
      let html = '<label class="red">' + widget.option.name + "</label>";
      // 根据配置的数据生成input
      if (widget.data.objectData) {
        widget.data.objectData.forEach((item, i) => {
          // input的value为数据匹配中value的值
          const labelField = widget.data.dataAnalysis.label.field[0];
          // 显示为数据匹配中label的值
          const valueField = widget.data.dataAnalysis.value.field[0];
          if (labelField && valueField) {
            html +=
              '<br/><input type="radio" name="radio" value="' +
              item[valueField.fieldName] +
              '"><span>' +
              item[labelField.fieldName] +
              "</span>";
          }
        });
      }
      return html;
    },
  };
});

# script.js

(function() {
  console.log("test");
})();

# style.css

.widget-form-radio .red {
  color: red;
}
.widget-form-radio input[type="radio"] {
  width: 20px;
  height: 20px;
  margin: 0 15px;
}
Last Updated: 8/17/2022, 9:54:22 AM