elementUi el-tableが追加され、変更されたページは更新されません。this。$ setの簡単な使用法

プロジェクトシーン:

elementUIの
ここに画像の説明を挿入します
説明:+をクリックして対応する次の行に空白行を追加し、-をクリックして現在の行を削除します。とても簡単そうに見えますが、実際の状況は逆で、私の技術力が限られているのかもしれません。主に2つの問題が発生しました

問題の説明:

1.削除は非常に簡単です。追加すると、追加されたデータは更新されますが、ページは更新されません
。2。追加すると、プラス記号をクリックすると、追加されたデータは常に次のデータ行を繰り返します。
3. el-tableが更新されていないという投稿の中には、追加されたと書かれているものがあります:key、これは実際には役に立たないです。以下に、問題のあるコードと解決されたコードを示します。

原因分析:

1.ページは更新されません。el-tableは配列にバインドされます。配列の直接割り当てはObject.definePropertyで検出できないため、this。$ setメソッドを使用してデータ更新操作を強制します
。2。追加されたデータは常に続きます+次の行が繰り返され、ループが正しく書き込まれていない可能性があることを示します

解決:

htmlは何も言うことはありません

 <el-table
            :data="formdata.FAMILYJSON"
            style="width: 100%"
            align="center"
            :key="Math.random()"
          >
            <el-table-column label="姓名">
              <template slot-scope="scope"
                ><el-input
                  v-model="scope.row.NAME"
                  :maxlength="20"
                  :disabled="!editable"
                ></el-input
              ></template>
            </el-table-column>
            <el-table-column label="与本人关系">
              <template slot-scope="scope"
                ><el-select
                  v-model="scope.row.RELATION"
                  filterable
                  :clearable="editable"
                  :disabled="!editable"
                  :readonly="!editable"
                  placeholder="请选择与本人关系"
                >
                  <el-option
                    v-for="item in dicts.RELATIONTYPE"
                    :key="item.NODECODE"
                    :label="item.NODEDESC"
                    :value="item.NODECODE"
                  ></el-option> </el-select
              ></template>
            </el-table-column>
            <el-table-column label="国籍">
              <template slot-scope="scope"
                ><el-input
                  v-model="scope.row.COUNTRYCODE"
                  :maxlength="20"
                  :disabled="!editable"
                ></el-input
              ></template>
            </el-table-column>
            <el-table-column label="工作单位及职务">
              <template slot-scope="scope"
                ><el-input
                  v-model="scope.row.WORK"
                  :maxlength="20"
                  :disabled="!editable"
                ></el-input
              ></template>
            </el-table-column>
            <el-table-column label="现居住地">
              <template slot-scope="scope"
                ><el-input
                  v-model="scope.row.HOME"
                  :maxlength="20"
                  :disabled="!editable"
                ></el-input
              ></template>
            </el-table-column>
            <el-table-column label="操作">
              <template scope="scope">
                <el-button
                  size="mini"
                  icon="el-icon-plus"
                  circle
                  @click="addFAMILYJSON(scope.$index)"
                  :disabled="!editable"
                ></el-button>
                <el-button
                  size="mini"
                  icon="el-icon-minus"
                  circle
                  v-if="scope.$index != 0"
                  @click="removeFAMILYJSON(scope.$index)"
                  :disabled="!editable"
                ></el-button>
              </template>
            </el-table-column>
          </el-table>

jsコードからコメントアウトされたものは、私のエラーのデモンストレーションを表しています(^ v ^)

addFAMILYJSON(comeindex) {
    
    
      console.log(comeindex);
      //因为length的值为1的时候index为0
      if (comeindex + 1 == this.formdata.FAMILYJSON.length) {
    
    
        this.formdata.FAMILYJSON.push({
    
    
          NAME: '',
          RELATION: '',
          COUNTRYCODE: '',
          WORK: '',
          HOME: '',
        });
        console.log(this.formdata.FAMILYJSON);
      } else {
    
    
        this.medioList = this.formdata.FAMILYJSON;
        //这里不能用foreach,正常逻辑是将前边的值赋给后边,如果我们用foreach就把index的值赋给后边所有index+n了就会出现
        // 原值
        // FAMILYJSON: [
        //   { NAME: '1', RELATION: '1', COUNTRYCODE: '1', WORK: '1', HOME: '1' },
        //   { NAME: '2', RELATION: '2', COUNTRYCODE: '2', WORK: '2', HOME: '2' },
        //   { NAME: '3', RELATION: '3', COUNTRYCODE: '3', WORK: '3', HOME: '3' },
        // ]
        // 变成了
        // FAMILYJSON: [
        //   { NAME: '1', RELATION: '1', COUNTRYCODE: '1', WORK: '1', HOME: '1' },
        //   { NAME: '', RELATION: '', COUNTRYCODE: '', WORK: '', HOME: ''},
        //   { NAME: '2', RELATION: '2', COUNTRYCODE: '2', WORK: '2', HOME: '2' },
        //   { NAME: '2', RELATION: '2', COUNTRYCODE: '2', WORK: '2', HOME: '2' },
        // ]
        //  _.forEach(this.formdata.FAMILYJSON, (index, item) => {
    
    
        //   console.log(item, index);
        //   if (index == comeindex) {
    
    
        //     this.formdata.FAMILYJSON[index] = {
    
    
        //       NAME: '',
        //       RELATION: '',
        //       COUNTRYCODE: '',
        //       WORK: '',
        //       HOME: '',
        //     };
        //   } else if (index > comeindex) {
    
    
        //     this.formdata.FAMILYJSON[index + 1] = this.searchitem(index);
        //   }
        // });
        var length = this.formdata.FAMILYJSON.length;
        for (var index = length - 1; index >= comeindex; index--) {
    
    
          if (index == comeindex) {
    
    
            //这里不能用这种方式进行赋值操作,这种操作会导致页面不更新数据要实用this.$set
            // 调用方法:this.$set( target, key, value )

            //  target:要更改的数据源(可以是对象或者数组)

            //  key:要更改的具体数据

            //  value :重新赋的值

            // this.formdata.FAMILYJSON[index + 1] = {
    
    
            //   NAME: '',
            //   RELATION: '',
            //   COUNTRYCODE: '',
            //   WORK: '',
            //   HOME: '',
            // };
            this.$set(this.formdata.FAMILYJSON, index + 1, {
    
    
              NAME: '',
              RELATION: '',
              COUNTRYCODE: '',
              WORK: '',
              HOME: '',
            });
          } else if (index > comeindex) {
    
    
            this.$set(
              this.formdata.FAMILYJSON,
              index + 1,
              this.searchitem(index)
            );
            // this.formdata.FAMILYJSON[index + 1] = this.searchitem(index);
          }
        }
        console.log(this.formdata.FAMILYJSON);
      }
    },
    removeFAMILYJSON(index) {
    
    
      this.formdata.FAMILYJSON.splice(index, 1);
    },
    searchitem(index) {
    
    
      console.log(this.medioList[index]);
      return this.medioList[index];
    },

おすすめ

転載: blog.csdn.net/lbchenxy/article/details/108286094