elementui のテーブルコンポーネント行が展開され、その行の情報が表示されます (echarts プレート)

こんにちは、こんにちは、お久しぶりです。最近仕事で何か問題に遭遇しましたか? 最近、友人からタスクを頼まれました。エルテーブルで特定の行をクリックすると、その行のすべての情報がこの行の下に表示されます。どうすればよいですか? それを解決した後、公式ドキュメントほど単純ではなく、展開された行にEchartsのグラフを描画し、データをフォームに表示するだけでなければならないと彼は言いました。

そこで考えたのですが、まず第一に、el-table のいくつかの属性について話したいと思います。

row-key 属性: row-key は、この行のデータを識別するためのキーを指定します。これは、テーブルのレンダリングを最適化するために使用されます。

Expand-row-keys 属性:この属性を使用して、テーブルの現在の展開行を設定できます。これを使用するには、row-key 属性を設定する必要があります。この属性は、行を展開するためのキーの配列です。

Expand-change メソッド: このイベントは、ユーザーが行を展開または閉じるとトリガーされます。これは後で使用されます。この時点で展開された項目の配列が空の場合、現時点ではどの項目も展開されていないことを意味します。それ以外の場合は、展開された ID 項目を表示し、ID によってどの項目が展開されているかを確認します。

type="expand" : 設定すると expand 、展開可能なボタンとして表示されます。

さて、コードのテンプレート部分です。

<template>
  <div>
    <el-table
      :data="tableData"
      style="width: 100%"
      @row-click="rowClick"
      :row-key="getRowKeys"
      :expand-row-keys="expands"
      @expand-change="expandChange"
      ref="tableList"
    >
      <el-table-column type="expand">
        <template slot-scope="props">
          <div class="echarts" :id="props.row.id"></div>
        </template>
      </el-table-column>
      <el-table-column label="第一年工资" prop="salary1"></el-table-column>
      <el-table-column label="第二年工资" prop="salary2"></el-table-column>
      <el-table-column label="第三年工资" prop="salary3"></el-table-column>
      <el-table-column label="第四年工资" prop="salary4"></el-table-column>
      <el-table-column label="第五年工资" prop="salary5"></el-table-column>
    </el-table>
  </div>
</template>

次に、スクリプトのデータ部分があります。見てみましょう。

 

data() {
    return {
      tableData: [
        {
          id: "12987122",
          salary1: 9,
          salary2: 14,
          salary3: 18,
          salary4: 22,
          salary5: 25,
        },
        {
          id: "12987123",
          salary1: 7,
          salary2: 12,
          salary3: 16,
          salary4: 24,
          salary5: 30,
        },
        {
          id: "12987124",
          salary1: 17,
          salary2: 19,
          salary3: 22,
          salary4: 30,
          salary5: 40,
        },
        {
          id: "12987125",
          salary1: 18,
          salary2: 24,
          salary3: 30,
          salary4: 36,
          salary5: 50,
        },
      ],
      expands: [],
    };
  },

これがテーブルであり、各行がデータのセット (1 ~ 5 年の給与データを含む) であることを理解するのは難しくありません。ここで、この行をクリックすると下の echarts グラフを展開したいのですが、どうすればよいでしょうか? 最初はこう思ったのですが、各項目のチャートを初期化して以下に表示させれば切り替えで実現できます。それで試してみたところ、すぐに顔を平手打ちしました。最初に展開しないとdom要素が取得できないためです。

したがって、変更する方法は 1 つだけです。最初のコード: メソッド部分

methods: {
    initChart(id) {
      //找到这个id对应tableData中第几个
      let index = this.tableData.map((item) => item.id).indexOf(id);
      // console.log("index:", index);
      //声明的dataArr数组,里面存的是这一行的salary1-salary5的数据
      let dataArr = [];
      dataArr.push(this.tableData[index].salary1);
      dataArr.push(this.tableData[index].salary2);
      dataArr.push(this.tableData[index].salary3);
      dataArr.push(this.tableData[index].salary4);
      dataArr.push(this.tableData[index].salary5);
      //也可以循环
      //console.log("dataArr:", dataArr);以第一个为例,就是[9,14,18,22,25]  用于后面echarts数据画图
      //echarts画图
      let mychart = this.$echarts.init(document.getElementById(id));
      let option;
      option = {
        xAxis: {
          type: "category",
          data: ["第一年", "第二年", "第三年", "第四年", "第五年"],
        },
        yAxis: {
          type: "value",
        },
        series: [
          {
            name: "显示数据",
            data: dataArr,
            type: "line",
            smooth: true,
            animationDuration: 2800,
            animationEasing: "cubicInOut",
          },
        ],
      };
      mychart.setOption(option);
    },
    rowClick(row) {
      //点击行时展开收起
      this.$refs.tableList.toggleRowExpansion(row);
    },
    expandChange(row, expandedRows) {
      //查看此时的row和expandedRows
      console.log("row:", row); //对象,包括id~salary5的所有值
      console.log("expandedRows:", expandedRows); //展开的数组,由于后面的设置,这里长度最大为1.为1时说明刚刚展开了一个。为空说明刚刚取消展开了。
      if (expandedRows.length) {
        //说明此时是展开的
        //找到这个row的id
        let id = row.id;
        //让所有项收起来,这是做成手风琴accordion的形式
        this.expands = [];
        //让刚刚展开的项放到expands数组中
        if (row) {
          this.expands.push(row.id);
        }
        //在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM
        this.$nextTick(() => {
          //这个id对应上边的row.id
          this.initChart(id);
        });
      } else {
        //此时是收起
        //收起所有
        this.expands = [];
      }
    },
    getRowKeys(row) {
      //行数据的key,用于优化table的渲染
      return row.id;
    },
  },

それは一目瞭然ではないでしょうか。この時点で echart を描画するときは $nextTick を使用することを忘れないでください。その動作を覚えておいてください。次の DOM 更新サイクルが終了した後に遅延コールバックを実行します。データを変更した直後にこのメソッドを使用して、更新された DOM を取得します。

行の展開と折りたたみを変更した場合に再度整理します。@expand-change : このときの関数の第二引数expandedRowsの長さを決定します。長さが0でない場合は、先ほど展開したことを意味しますので、展開されている場合は、一旦アイテムを全てしまってから、展開したアイテムを展開してください。クリックして展開した項目のみを保持します (Accordion の場合と同様)。次に、展開された項目の row.id を使用して echarts グラフを描画します。これははるかに明確ですか?

 

 上の 2 つの画像はその例です。ぜひ試してみてください。コメント欄で議論してください。さようなら、また次回!

Supongo que te gusta

Origin blog.csdn.net/weixin_68067009/article/details/126890529
Recomendado
Clasificación