<template>
<div></div>
</template>
<script setup>
const emit = defineEmits(["update:modelValue"]);
const props = defineProps({
modelValue: {
type: Array,
defualt: [],
},
});
watch(
() => props.modelValue,
() => {
// 一些操作
},
{
immediate: true,
}
);
</script>
有没有办法,如果组件内部 emit 改变 modelValue 的值不触发组件内部 watch 监听,只有在父组件改变了传入的值才触发组件内部 watch 监听
1
dingjs 2022-08-15 09:38:05 +08:00
不行,watch 的是 props ,只要改变必定会触发监听函数。
简单点的办法是可以存个变量,emit 的时候更新,监听函数中判断一下值有没有变化 |
3
ciming OP @dingjs 主要是因为外部传进来的数据和组件处理的数据有差异,需要处理转换下,那个转换函数还要去遍历树,如果每次 emit 都会触发 watch ,就会很耗费性能
|
4
Highlight1024 2022-08-15 10:43:12 +08:00
有一个蠢一点的方法就是弄一个值来区分是不是父组件改变的值
|
5
haobaiZhang 2022-08-15 11:36:18 +08:00
@ciming 组件内部用 computed ? emit 的时候, 只保持外部的数据结构?
|
6
haobaiZhang 2022-08-15 11:37:09 +08:00
@haobaiZhang 哦哦, 有点问题, 没考虑 emit 不触发 watch
|
8
Vegetable 2022-08-15 15:27:12 +08:00
本质上你的 emit 并没有修改 modelValue,而是向上 emit ,modelValue 的变化永远是外部触发的,所以这个场景和你描述的是不符的。
比如你 emit("update:modelValue",1),但是外部可能是 @update:modelValue=(val)={value=val+1} 如果用这种需求,不建议搞太复杂,弄两个方法算了 |
9
lin07hui 2022-08-15 17:18:20 +08:00
以后使用 `<script setup lang="ts">` 吧。
|
10
joesonw 2022-08-15 18:32:06 +08:00 via iPhone
view 不要直接使用 props ,用一个 state 存,watch props 后存到 state 上
|
11
gausszhou 2022-08-16 08:34:40 +08:00
个人倾向于在组件外层,在接口回调中,进行数据结构的转换。
获取数据--> 前置处理-->双向绑定--> (用户操作-->后置处理) --> 提交数据 |
12
zhuweiyou 2022-08-16 12:13:11 +08:00
一般来说, 调用者传入的值应该符合组件的需求, 而不是组件去迎合调用者.
这种情况我一般是在父上转换好格式再传给子组件用. |
13
chenjiangui998 2022-08-28 01:57:38 +08:00
这项目没开 lint? modelValue: {
type: Array, defualt:() => [], }, 多实例共享 modelValue 了 |