首页 > 其他分享 >Vue3:子组件 watch 父组件传递的 props,watch 不触发,该如何通知子组件更新?

Vue3:子组件 watch 父组件传递的 props,watch 不触发,该如何通知子组件更新?

时间:2023-01-03 01:33:08浏览次数:51  
标签:pageCount Vue3 watch currentIndex props 组件 监听

问题阐述

问题描述

父组件传递给子组件 props,由于父组件的业务需求,希望子组件通过 watch 监听 props 修改数据。

父组件模板:

<PaginationPage
  ref="pagination"
  @fixed-change="fixedChange"
  @float-change="floatChange"
  :current-index="currentIndex"
  :page-count="pageCount">
</PaginationPage>

子组件 setup:

const props = defineProps({
  pageCount: {
    type: Number,
    default: 2
  },
  currentIndex: {
    type: Number,
    default: 1
  }
});

let _pageCount = $ref<number>(props.pageCount);
let _currentIndex = $ref<number>(props.currentIndex);

// 监听 props,发生变化时更新
watch(() => props.pageCount, () => {
  _pageCount = props.pageCount;
});

// 监听 props,发生变化时更新
watch(() => props.currentIndex, () => {
  _currentIndex = props.currentIndex;
});

子组件模板:

<el-pagination
  @current-change="fixedSorterChange"
  v-model:current-page="_currentIndex"
  v-model:page-count="_pageCount"
  :background="true"
  layout="prev, pager, next, jumper"
/>

发生前提

由于子组件使用了 element-plus 分页组件,而分页组件 page-count、current-page 都是双向响应式数据,而 vue3 不允许我们把 props 传递给组件的双向响应式数据(即通过 v-model 绑定的 model 值)。因此,我就再声明一个新的响应式数据,把 props 赋值过去,再把这个新的响应式数据传递给分页组件。

需求描述

父组件 watch 监听路由变化,修改传递给子组件的 props,希望子组件通过 watch 监听到在父组件中,传递给子组件的 props 变化,子组件的 watch 触发从而更新数据。

父组件 setup:

watch(route, () => {
  pageCount = 2;
  currentIndex = 1;
});

发生原因

  1. pageCount 与子组件的 props 初始值保持一致,watch 不会触发;
  2. 路由切换时,可能 pageCount 发生变化,子组件监听到了并触发,可能 currentIndex 没有变化,子组件对应的 watch 也没有变化。

总而言之,watch 显得有些不合适。defineExpose,暴露一个函数,这个函数来修改子组件本身的数据,减少更多的代码。父组件通过 ref 获取子组件对象,调用暴露出来的函数。

子组件 setup:

const updateProps = () => {
  _pageCount = 2;
  _currentIndex = 1;
};

defineExpose({ updateProps });

父组件 setup:

const pagination = ref();

watch(route, () => {
  pagination.value.updateProps();
});

问题总结

根本原因发生在,因为数据一样,或者某些原因没有导致被监听的响应式数据发生改变,就不可能触发 watch。希望,不管也没有变化都触发函数,并执行其他逻辑(子组件里的),推荐暴露一个函数,专门做这件事,父组件 ref 拿到之后,不管怎么样都触发子组件暴露出来的函数即可。

标签:pageCount,Vue3,watch,currentIndex,props,组件,监听
From: https://www.cnblogs.com/Enziandom/p/17020946.html

相关文章

  • iView 树形组件 on-select-change 事件用法
    一、组件  <Tree:data="baseData"@on-select-change="checkBoxSel"show-checkbox></Tree>二、方法checkBoxSel(root,node){......
  • 学vue的第二天:watch()事件侦听
    <!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> <scriptsrc="js/vue.js"type="text/javascript"></script> <styletype="text/css">......
  • Flannel网络组件
    34.Flannel网络组件GitHub-flannel-io/flannel:flannel是一种用于容器的网络结构,专为Kubernetes设计概述有CoreOS开源的针对k8s的网络服务,其目的为解决k8s集群中......
  • Calico网络组件
    35.Calico网络组件简介Calico是一个纯三层的网络插件,calico的bgp模式类似于flannel的host-gwCalico方便集成OpenStack这种云架构,为openstack虚拟机、容器、裸机提供......
  • Vue3的响应系统
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content=......
  • Django组件之form组件
    目录Django组件之form组件一、form组件二、forms组件渲染标签三、forms组件展示信息四、forms组件校验补充五、forms组件参数补充六、modelform组件Django组件之form组件......
  • 企业级低代码平台,JeecgBoot-Vue3版 v1.3.0 版本正式发布
    项目介绍Jeecgboot-Vue3采用Vue3.0、Vite、Ant-Design-Vue、TypeScript等新技术方案,包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能。Je......
  • vue3 + ts + element_plus 创建后台管理系统,学习记录
    本贴用于记录vue3 后台管理系统学习过程1、创建vue3+ts 工程vuecreateadmin-demo     接下来都是默认选项。 ......
  • 我对Swing各组件的认识
    2010-09-28我对Swing各组件的认识注:整理之前的博客 my263229365   参加工作两个多月了,本来在学校学的是java,方向定位在J2EE的,结果工作后却从事了桌面应用程序的开发,不......
  • C# StopWatch的使用
    一、Stopwatch的用处Stopwatch来自于System.usingSystem.Diagnostics命名空间。它可以测量一个时间间隔的运行时间,或跨多个间隔的已用时间总数。在典型方案中,调用Start(......