【bug】在子组件中watch监听父组件传过来的值,监听不到,已解决

bug复现:

父组件需要传参数autoinputFs,autoinputFs为true的时候,子组件中的输入框(只有一个)自动聚焦,很多组件复用mp3Search,有些页面不需要,所以定义了autoinputFs控制输入框是否自动聚焦

bash 复制代码
<template>
  <div>
<mp3Search :autoinputFs="true">
    </mp3Search>
  </div>
</template>

子组件接受并监听

bash 复制代码
<el-input v-model="form.serchvalue" ref="myInput">
            <i class="el-icon-search" slot="suffix"> </i>
          </el-input>
 props: {
    autoinputFs: {
      type: Boolean,
      default: false,
    },
  },
watch: {
    autoinputFs: {
      handler(newVal) {
        console.log(newVal, "newVal");
        this.$nextTick(() => {
          this.$refs.myInput.focus();
        });
      },
  
    },
  },

watch中的console.log()始终无法触发

解决方法:加上 immediate: true,立即执行一次监听函数

解决代码:

bash 复制代码
watch: {
    autoinputFs: {
      handler(newVal) {
        console.log(newVal, "newVal");
        this.$nextTick(() => {
          this.$refs.myInput.focus();
        });
      },
  immediate: true, // 立即执行一次监听函数
    },
  },

解决的方法不难,但是我觉得更需要知道的是为什么会产生这个bug

在监听器watch初始化时,Vue 并不会主动触发watch监听函数,除非设置了 immediate

在 Vue 中,当一个组件被创建时,父组件向子组件传递的 props 会被初始化并建立响应式关系。这意味着,如果父组件传递给子组件的 prop 发生变化,Vue 会负责检测这些变化并触发相应的更新。

然而,在 watch 中直接监听一个 prop 时,并不会触发初始的监听函数。这是因为 Vue 在组件初始化阶段不会主动去检测 prop 的变化,Vue 在创建组件实例时会在数据响应式系统中设置 prop 的初始值,但是在组件挂载之前,Vue 并不会立即将 prop 中的变化反映到实例的数据中,也就是说,只要组件挂载之前 prop 没有发生变化,watch中是无法触发的

这是为了避免在组件初始化时过多的计算和处理,只有在确实需要在初始化时对 prop 进行处理时才会执行一次监听函数

相关推荐
非优秀程序员2 小时前
第10章 千团出世|《互联网产品恩仇录》
前端
非优秀程序员2 小时前
第11章 小高在对面|《互联网产品恩仇录》
前端
非优秀程序员2 小时前
第14章 只剩美团|《互联网产品恩仇录》
前端
非优秀程序员2 小时前
第09章 老乡何必为难老乡|《互联网产品恩仇录》
前端
非优秀程序员2 小时前
第07章 孙德良的阳谋|《互联网产品恩仇录》
javascript·后端
非优秀程序员2 小时前
第03章 三大门户,烽烟起于瀛海威|《互联网产品恩仇录》
前端
程序员大阳6 小时前
HTML+CSS+JS对话式实战(5)-活动管理页之查看报名名单的实现
javascript·css·html·查看报名名单
曦樂~6 小时前
【Web Development】02 CSS
前端·css
风骏时光牛马6 小时前
后端服务接口开发与数据逻辑处理
前端
东鹏特饮7 小时前
经典打砖块(Breakout)游戏
前端·css·css3