vue中组件的数据已经发生更新,但是页面未发生更新

问题描述

父组件通过请求拿到数据后,在父组件中对数据进行处理,处理完成后通过props传递给子组件进行渲染,此时在子组件中修改数据后,通过vue Devtools查看数据以及修改完成,但是页面并没有刷新。
在这里插入图片描述

问题代码

父组件代码

// 父组件
<template>
  <div>
    <dataUpdate :multipleTable="data"></dataUpdate>
  </div>
</template>

<script>
import dataUpdate from "./dataUpdate";
export default {
  name: "",
  data() {
    return {
      data: [{
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-08',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-06',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-07',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }]
    }
  },
  components: {
    dataUpdate,
  },
  methods: {
    initData() {
      this.data.map((item,index) => {
        item.checked = true;
      })
    }
  },
  created() {
    this.initData();
  }
}
</script>

子组件代码

// 子组件
<template>
  <el-table
      ref="multipleTable"
      :data="multipleTable"
      tooltip-effect="dark"
      style="width: 100%">
    <el-table-column width="55">
      <template slot="header">
        <span>选择</span>
      </template>
      <template slot-scope="scope">
        <el-checkbox v-model="scope.row.checked"></el-checkbox>
      </template>
    </el-table-column>
    <el-table-column
        label="日期"
        width="120">
      <template slot-scope="scope">{{ scope.row.date }}</template>
    </el-table-column>
    <el-table-column
        prop="name"
        label="姓名"
        width="120">
    </el-table-column>
    <el-table-column
        prop="address"
        label="地址"
        show-overflow-tooltip>
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  props: {
    multipleTable: {
      type: Array,
      required: true,
    }
  },
}
</script>

问题解决方式

1,通过this.$set修改数据

通过该方式可以实现数据刷新页面也刷新,但是当数据较多时,页面会出现卡顿的现象。

2,使用强制刷新

使用this.$forceUpdate()方法进行强制刷新。

3,更换数据的处理方式。

vue的数据是双向绑定的,在组件中vue通过观察者模式对数据进行监听,但是在此问题中我们对数据通过属性追加的形式进行了修改,因此vue对追加的属性的监听会出现纰漏,所以会出现组件数据更新了但是页面并没有刷新的问题。

数据修改方式

更换数据修改方式后,子组件的数据更新页面也会及时刷新。

// 父组件
<template>
  <div>
    <dataUpdate :multipleTable="updataData"></dataUpdate>
  </div>
</template>

<script>
import dataUpdate from "./dataUpdate";
export default {
  name: "",
  data() {
    return {
      data: [{
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-08',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-06',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-07',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }],
      updataData: [],
    }
  },
  components: {
    dataUpdate,
  },
  methods: {
    initData() {
      this.data.map((item,index) => {
        // item.checked = true;
        this.updataData.push({
          date:item.date,
          name:item.name,
          address:item.address,
          checked:true,
        })
      })
    }
  },
  created() {
    this.initData();
  }
}
</script>
Logo

前往低代码交流专区

更多推荐