Vue2でant-tableを使用したカスタムテーブルの作成とクリックイベントの設定

まず、通常のコンポーネントのインポートから始めます。

<a-table
    :columns="columns"
    :data-source="dataList"
    bordered
    size="middle"
    :scroll="{y: 800}"
    :pagination="false"
  />
  

次に、クリックイベントを追加する方法を説明します。以下に示すコードは、クリックイベントを含むセルのレンダリング方法です。

customRender: (text, row, index) => {
    const self = this;
    const child = self.$createElement("a", {
      domProps: {
        innerHTML: text,
      },
      on: {
        click: function () {
          self.customHandleDetail(row.name, "A01");
        },
      },
    });
    const obj = {
      children: child,
      attrs: {},
    };
    return obj;
  }
  

ここでは、columnsの設定を中心に説明します。dataListはAPIから取得したフラットなデータです。クリックイベントcustomHandleDetail()はカスタムで定義されたもので、必要に応じてパラメータを変更できます。

columns: [
    {
      title: "名称5",
      align: "center",
      children: [
        {
          title: "0人",
          dataIndex: "B01",
          key: "B01",
          width: 50,
          align: "center",
          customRender: (text, row, index) => {
            const self = this;
            const child = self.$createElement("a", {
              domProps: {
                innerHTML: text,
              },
              on: {
                click: function () {
                  self.customHandleDetail(row.name, "B01");
                },
              },
            });
            const obj = {
              children: child,
              attrs: {},
            };
            return obj;
          },
        },
        {
          title: "1-2人",
          dataIndex: "B02",
          key: "B02",
          width: 50,
          align: "center",
          customRender: (text, row, index) => {
            const self = this;
            const child = self.$createElement("a", {
              domProps: {
                innerHTML: text,
              },
              on: {
                click: function () {
                  self.customHandleDetail(row.name, "B02");
                },
              },
            });
            const obj = {
              children: child,
              attrs: {},
            };
            return obj;
          },
        },
        {
          title: "3-5人",
          dataIndex: "B03",
          key: "B03",
          width: 50,
          align: "center",
          customRender: (text, row, index) => {
            const self = this;
            const child = self.$createElement("a", {
              domProps: {
                innerHTML: text,
              },
              on: {
                click: function () {
                  self.customHandleDetail(row.name, "B03");
                },
              },
            });
            const obj = {
              children: child,
              attrs: {},
            };
            return obj;
          },
        },
        {
          title: "6-9人",
          dataIndex: "B04",
          key: "B04",
          width: 50,
          align: "center",
          customRender: (text, row, index) => {
            const self = this;
            const child = self.$createElement("a", {
              domProps: {
                innerHTML: text,
              },
              on: {
                click: function () {
                  self.customHandleDetail(row.name, "B04");
                },
              },
            });
            const obj = {
              children: child,
              attrs: {},
            };
            return obj;
          },
        },
        {
          title: "10人以上",
          dataIndex: "B05",
          key: "B05",
          width: 50,
          align: "center",
          customRender: (text, row, index) => {
            const self = this;
            const child = self.$createElement("a", {
              domProps: {
                innerHTML: text,
              },
              on: {
                click: function () {
                  self.customHandleDetail(row.name, "B05");
                },
              },
            });
            const obj = {
              children: child,
              attrs: {},
            };
            return obj;
          },
        },
      ],
    },
    {
      title: "名称6",
      dataIndex: "C01",
      key: "C01",
      width: 50,
      align: "center",
      customRender: (text, record) => {
        const dynamicContents = [];
        const fieldNames = ["C011", "C012", "C013", "C014", "C015", "C016"];
        fieldNames.forEach(fieldName => {
          if (record[fieldName]) {
            dynamicContents.push(<p>{record[fieldName]}</p>);
          }
        });
        const hasDynamicContents = dynamicContents.length > 0;
        if (!hasDynamicContents) {
          return <div class="center-content">{text}</div>;
        }
        return (
          <div class="center-content">
            {dynamicContents.map((content, index) => (
              <div key={index}>
                {content}
                {index < dynamicContents.length - 1 && <hr class="center-content" />}
              </div>
            ))}
          </div>
        );
      },
    },
    {
      title: "テスト1",
      dataIndex: "E15",
      width: 50,
      key: "E15",
      align: "center",
      customRender: (text, row, index) => {
        const self = this;
        const child = self.$createElement("a", {
          domProps: {
            innerHTML: text,
          },
          on: {
            click: function () {
              self.customHandleDetail(row.name, "E15");
            },
          },
        });
        const obj = {
          children: child,
          attrs: {},
        };
        return obj;
      },
    },
    {
      title: "名称10",
      align: "center",
      children: [
        {
          title: "テスト1",
          dataIndex: "F01",
          key: "F01",
          width: 50,
          align: "center",
          customRender: (text, row, index) => {
            const self = this;
            const child = self.$createElement("a", {
              domProps: {
                innerHTML: text,
              },
              on: {
                click: function () {
                  self.customHandleDetail(row.name, "F01");
                },
              },
            });
            const obj = {
              children: child,
              attrs: {},
            };
            return obj;
          },
        },
        {
          title: "テスト1",
          dataIndex: "F02",
          key: "F02",
          width: 50,
          align: "center",
          customRender: (text, row, index) => {
            const self = this;
            const child = self.$createElement("a", {
              domProps: {
                innerHTML: text,
              },
              on: {
                click: function () {
                  self.customHandleDetail(row.name, "F02");
                },
              },
            });
            const obj = {
              children: child,
              attrs: {},
            };
            return obj;
          },
        },
      ],
    },
  ]
  

タグ: Vue2 ant-table カスタムテーブル クリックイベント フラットデータ処理

5月31日 10:30 投稿