Sejinda 2022-05-26 11:45 采纳率: 90%
浏览 558
已结题

关于Vue中对data中的数据进行修改,页面没有响应的问题

问题描述
在子组件调用父组件的方法实现勾选的功能时,只是实现了子组件的页面更新,而父组件不更新,而加了
this.$forceUpdate()就能更新了,为什么不加就不生效呢?
修改了父组件的data后,进而影响了子组件的模板更新

问题相关代码,请勿粘贴截图
export default {
  name: "App",
  components: {
    MyFooter,
    MyHeader,
    MyList,
  },
  // 数据在哪里对数据的操作就在哪里
  data() {
    return {
      todos: [
        { id: "001", title: "吃饭", done: true },
        { id: "002", title: "睡觉", done: false },
        { id: "003", title: "学习", done: true },
      ],
    };
  },
  methods: {
   
    // 勾选or取消勾选一个todo
    handleCheck(id) {
      this.todos.forEach((todo) => {
        if (id === todo.id) {
          todo.done = !todo.done;
          //this.$forceUpdate()
        }
      });
     
    },
  },
};

运行结果及报错内容

通过change事件点击,done不变化

img

我的解答思路和尝试过的方法

this.$forceUpdate()

我想要达到的结果
  • 写回答

1条回答 默认 最新

  • LiuJie_Boom 2022-05-26 12:25
    关注
    
    <template>
      <div id="app">
        <MyList :todos="todos" @handleCheck="handleCheck"></MyList>
        <div v-for="item in todos" :key="item.id" @click="handleCheck(item.id)">
          父组件---{{ item.title }}{{item.done}}
        </div>
      </div>
    </template>
    
    <script>
    import MyList from "./components/MyList.vue";
    
    export default {
      name: "App",
      components: {
        MyList,
      },
      // 数据在哪里对数据的操作就在哪里
      data() {
        return {
          todos: [
            { id: "001", title: "吃饭", done: true },
            { id: "002", title: "睡觉", done: false },
            { id: "003", title: "学习", done: true },
          ],
        };
      },
      methods: {
        // 勾选or取消勾选一个todo
        handleCheck(id) {
          console.log(id);
          this.todos.forEach((todo) => {
            if (id === todo.id) {
              todo.done = !todo.done;
              // this.$forceUpdate();
            }
          });
          console.log(this.todos);
        },
      },
      updated() {
        console.log("父组件更新");
      },
      watch: {
        todos: {
          deep: true,
          handler() {
            console.log("监视")
          },
        },
      },
    };
    </script>
    
    <style>
    </style>
    
    
    
    <template>
      <div>
        <div v-for="item in todos" :key="item.id" @click="btn(item.id)">
          {{ item.title }}{{item.done}}
        </div>
      </div>
    </template>
    
    <script>
    export default {
      name: "MyList",
      props: {
        todos: Array,
      },
      methods: {
        btn(id){
          this.$emit("handleCheck",id)
        }
      },
      updated(){
        console.log("子组件更新");
      }
    };
    </script>
    
    <style scoped>
    </style>
    
    
    
    

    你说的data改了,子组件更新了,但是父组件没有更新,是因为父组件的模板里面没有用到todos数据,因此todos发现修改,父组件是不会更新的,数据驱动视图,视图没有用到这个数据,这个数据改变是无法驱动视图的。你像我一样在父组件中用一下todos数据,你就会发现父组件会触发更新了。

    img

    望采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月3日
  • 已采纳回答 5月26日
  • 创建了问题 5月26日

悬赏问题

  • ¥15 如何用python处理excel的数据(极值标准化)
  • ¥15 三向应力状态求剪应力
  • ¥15 jupyter notebook如何添加libGL.so.1库
  • ¥20 easyPoi能否实现下拉多选或者复选框
  • ¥15 网桥在转发帧时,会变帧的源地址和目的地址吗?
  • ¥15 用Multisim设计汽车尾灯控制电路
  • ¥100 求用matlab求解上述微分方程的程序代码
  • ¥15 MAC安装佳能LBP2900驱动的网盘提取码
  • ¥400 微信停车小程序谁懂的来
  • ¥15 ATAC测序到底用什么peak文件做Diffbind差异分析