• vue2.6版本数据(数据结构数组对象)更新视图不更新的问题


    vue 版本"vue": "2.6.10",

    场景

    接口读取的差评标签,点击一下选中的状态,再次点击取消

    数据需后端读取需要自己处理数据一下默认每个比如 checkout:false属性, 选中的时候更改true来控制标签是否选中

    标签

    标签接口mock数据data.js

    // 接口mock数据
    export const reason = {
      code: '1',
      message: '成功',
      path: '',
      data: [
        {
          labelList: [
            {
              id: '13',
              reason: '与大纲不符'
            },
            {
              id: '14',
              reason: '难度不适合'
            },
            {
              id: '15',
              reason: '结构不清晰'
            },
            {
              id: '16',
              reason: '课件不详细'
            },
            {
              id: '17',
              reason: '课件不详细'
            }
            // {
            //   id: '18',
            //   reason: '课件不详细'
            // }
          ]
        }
      ],
      traceId: '',
      timestamp: '1621507061877',
      ok: false
    }

    评论组件A.vue

    ...
    <template>
    ....<div v-show="levelStar < 4 && levelStar !== 0 " class="negative-comment">
          <span
            v-for="(item, index) in reasonList"
            :key="item.id"
            class="comment-label"
            :class="{ reasonActive: item.checked }"
            @click="handleReason(index, item)"
          >
            {{ item.reason }}
          </span>
        </div>
    .....
    ...
    <script>
    ....
    
    import { reason } from './data.js'
    data() {
    ...
    reasonList: [],
    ....
    mounted() {
        const listData = reason.data[0]
        let labelListData = listData.labelList.slice(0)
        // 数据处理默认 checked: false
        labelListData.map((item) => {
          this.reasonList.push({ checked: false, ...item })
        })
      },
    .....
     handleReason(index, item) {
          let curItem = this.reasonList[index]
         // 一开始数据这样处理,但是有bug,当来回点一个标签,数据更新了
    但是视图是没有更新的的
          this.reasonList = {
             ...item,
             item.checked: !item.checked
          }
          this.activeIndex = index
          this.isSelectTag = this.reasonList.filter((item) => {
            return item.checked
          })
        },
    .....

     解决问题

    想起来关于官网数组更改不更新的的问题,翻开官网看了看

    .....
     handleReason(index, item) {
          let curItem = this.reasonList[index]
          curItem.checked = !curItem.checked
           // 第一个参数数组,第二个索引, 第三个当前对象的的值属性前面处理一下目前最新的值
          this.$set(this.reasonList, index, curItem)
          console.log('click===', this.reasonList)
          this.activeIndex = index
          this.isSelectTag = this.reasonList.filter((item) => {
            return item.checked
          })
        },
    .......

    第二个标签来回点击,实时更新了

     其他小问题测试

     关于这个问题我自己用了数组测试

    当不点击的时候只在mount改变的数组的时候视图还是可以更新的

     ....
    
    <p v-for="(item, index) in arrData" :key="index"> {{ item }}</p>
    ......
    
    
    
    .....
    data() {
    .....
    arrData: [1, 1, 1],
    .......
    mounted() {
      
        this.arrData[0] = 8
        this.arrData[this.arrData.length] = 9
        this.arrData.unshift(2)
      },
    

     手动实践一遍和以前理解不太一样,视图还是更新的

     

    <p v-for="(item, index) in arrData" :key="index"> {{ item }}</p>
    <p> {{ this.objdata }} </p>
    ....
    
    data(){
     objdata: {
            a: 1,
            b: 2
          }
    ......
    ..
    
     mounted() {
        this.arrData[0] = 8 // 更改
        this.arrData[this.arrData.length] = 9 // 新增
        this.arrData.unshift(2) // 添加新数组
        this.objdata.c = 3
      },
    ...

    以前看的文章更改数组和添加对象不会实时更新, 看来特定的场景下,至于为什么我要去研究一下,明白再来更新

    顺便打印了一下更改data的值生命周期 data的a=1。 mounted的生命周期更改a的值

    没有更改之前

    更改之后

     mounted() {
        this.arrData[0] = 8 // 更改
        this.arrData[this.arrData.length] = 9 // 新增
        this.arrData.unshift(2) // 添加新数组
        this.objdata.c = 3
        console.log('a的默认值值', this.a)
        this.a = 55
        console.log('更改的a的值', this.a)
      },

    watch的生命周期数据更改的时候才会执行

    发现有的时候很多的时候天天用但是很多小细节没注意,或者一直认为的和实际操作实现理解有偏差,有的也经常忘记,这里记录一下吧

    -----------有什么问题欢迎留言讨论-----

  • 相关阅读:
    我要把铁路修到威斯特摩兰
    1新建空白jasperreport模板
    oracle权限
    swagger配置
    lombok插件基本使用
    oracle与sqlserver的区别
    yaml语法学习
    第一个SpringBoot
    spring多环境切换
    JSR303数据校验
  • 原文地址:https://www.cnblogs.com/pikachuworld/p/15910784.html
Copyright © 2020-2023  润新知