当前位置: 首页 > news >正文

父组件中循环生成多个子组件时,有且只有最后一个子组件的watch对象生效问题及解决办法

提示:父组件中循环生成多个子组件时,有且只有最后一个子组件的watch对象生效问题及解决办法

文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、问题
  • 二、解决方法——使用function函数代替箭头函数()=>{}
  • 总结

前言

‌‌‌‌‌问题:子组件用that解决watch无法获取this,this为undefined问题,循环生成多个子组件,只有最后一个子组件的watch触发了多次;
原因:that是声明在打包的js文件中,每个子组件都会覆盖that为当前组件的this,最后that指向最后一个组件的this;

一、问题

打印watch中this,和selectCount,是五个重复的组件count:5,5,5,5,5
在这里插入图片描述

在这里插入图片描述

1、selectCom.vue

<template>
    <div class="select_com">
      <div class="select_com_content" ref="printImgContent">
          <el-select v-model="model" placeholder="请选择">
              <el-option v-for="item in options" :key="item.value" :label="item.name" :value="item.value">
              </el-option>
          </el-select>
      </div>
    </div>
  </template>
  <script>
  let that;
    export default {
      name: 'preview',
      props:{
        type:{
            type:String,
            default:'car',
        },
        selectCount:{
            type:Number,
            default:0,
        },
      },
      data () {
        return {
            model:'',
            optionsData:{
                car:[
                    {
                        name:'丰田',
                        value:'1',
                    },
                    {
                        name:'大众',
                        value:'2',
                    },
                    {
                        name:'起亚',
                        value:'3',
                    },
                    {
                        name:'别克',
                        value:'4',
                    },
                ],
                animal:[
                    {
                        name:'猫',
                        value:'1',
                    },
                    {
                        name:'狗',
                        value:'2',
                    },
                    {
                        name:'牛',
                        value:'3',
                    },
                    {
                        name:'羊',
                        value:'4',
                    },
                ],
            },
            options:[],
        }
      },
      watch:{
        type:{
            handler:()=>{
                console.log(that,that.selectCount,'-------------');
            },
            deep:true
        }
      },
      created(){
        that = this;
      },
    }
    </script>
  <style scoped></style>
  

2、home.vue组件

<template>
    <div class="home_box">
      <el-button @click="changeType('car')">car</el-button><el-button @click="changeType('animal')">animal</el-button>
      <selectCom :type="type"></selectCom>
    </div>
</template>
  
<script>
  import selectCom from './preview/selectCom';
  
  export default {
    name: 'Hmoe',
    components:{selectCom},
    data () {
      return {
        type:'car',
      }
    },
    methods: {
      changeType(type){
        this.type = type;
      },
    }
  }
  </script>
  <style scoped></style>

二、解决方法——使用function函数代替箭头函数()=>{}

打印watch中this,和selectCount,是五个单独组件count:1,2,3,4,5
在这里插入图片描述
在这里插入图片描述

selectCom.vue

<template>
    <div class="select_com">
      <div class="select_com_content" ref="printImgContent">
          <el-select v-model="model" placeholder="请选择">
              <el-option v-for="item in options" :key="item.value" :label="item.name" :value="item.value">
              </el-option>
          </el-select>
      </div>
    </div>
  </template>
  <script>
    export default {
      name: 'preview',
      props:{
        type:{
            type:String,
            default:'car',
        },
        selectCount:{
            type:Number,
            default:0,
        },
      },
      data () {
        return {
            model:'',
            optionsData:{
                car:[
                    {
                        name:'丰田',
                        value:'1',
                    },
                    {
                        name:'大众',
                        value:'2',
                    },
                    {
                        name:'起亚',
                        value:'3',
                    },
                    {
                        name:'别克',
                        value:'4',
                    },
                ],
                animal:[
                    {
                        name:'猫',
                        value:'1',
                    },
                    {
                        name:'狗',
                        value:'2',
                    },
                    {
                        name:'牛',
                        value:'3',
                    },
                    {
                        name:'羊',
                        value:'4',
                    },
                ],
            },
            options:[],
        }
      },
      watch:{
        type:{
            handler:function(){
                console.log(this,this.selectCount,'-------------');
            },
            deep:true
        }
      },
    }
    </script>
  <style scoped></style>
  

总结

踩坑路漫漫长@~@

相关文章:

  • NFS writeback流程中的GFP_NOFS
  • Docker安装部署RabbitMQ
  • 条款1:理解模版性别推导
  • C#带多组标签的Snowflake SQL查询批量数据导出程序
  • linux 命令 grep
  • Embedding模型到底是什么?
  • C++11 编译使用 aws-cpp-sdk
  • 专题地图的立体表达-基于QGIS和PPT的“千层饼”视图制作实践
  • 后端主流数据库分析
  • 前端面试:React生态有哪些?
  • 【从零开始学习计算机科学】数据库系统(八)数据库的备份和恢复
  • 神经网络常用库-torch(基础操作张量)
  • 奇墨科技FinOps云成本优化:精细化IT成本分摊重塑企业云财务管理
  • JavaScript class
  • Axure设计之下拉多选框制作教程C(中继器)
  • 网络安全防护架构有哪些 网络安全防护措施包括
  • 上下文学习思维链COTPrompt工程
  • SpringMVC响应页面及不同类型的数据,
  • [LeetCode热门100题]|137,260,268,面试17.19
  • vs-code + nRF Connect SDK 编译nrf54l15dk
  • 网站建设套餐表/沈阳专业seo关键词优化
  • 24 手表网站/百度搜索收录入口
  • 网站做网络营销/文职培训机构前十名
  • 做网站前端用什么/seo排名快速上升
  • 舞蹈网站建设报价/株洲网站设计外包首选
  • 建设网站需要学什么程序/网站优化推广招聘