欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > computed拦截v-model

computed拦截v-model

2024/11/29 22:56:13 来源:https://blog.csdn.net/weixin_46243043/article/details/143316384  浏览:    关键词:computed拦截v-model

一,问题

在父组件和子组件中都使用v-model会打破单项数据流。


二,方法

基于上述问题采用computed拦截v-model

<!-- 父组件 -->
<template><div><my-component v-model="form"></my-component></div>
</template>
<script setup>
import myComponent from "./components/MyComponent.vue";
import { ref } from "vue";const form = ref({name:'coderkey',age:18,sex:'男'
})
</script>
<!-- 子组件 -->
<template><div><el-input v-model="form.name"></el-input><el-input v-model="form.age"></el-input><el-input v-model="form.sex"></el-input></div>
</template>
<script setup>
import { computed } from "vue";const props = defineProps({modelValue: {type: Object,default: () => {},},
});
// const emit = defineEmits(["update:modelValue"]);
const emit = defineEmits();const form = computed({get() {return props.modelValue;},set(newValue) {console.log('属性改变了')emit("update:modelValue", newValue);},
});
</script>

三,注意

最后发现问题:form.xxx = xxx时,并不会触发computedset,只有form = xxx时,才会触发set
解决方法:用watch监听器或者用Proxy代理对象。


四,Proxy + computed拦截v-model的对象

<!-- 父组件 -->
<template><div><my-component v-model="form"></my-component></div>
</template>
<script setup>
import myComponent from "./components/MyComponent.vue";
import { ref } from "vue";const form = ref({name: "coderkey",age: 18,sex: "男",
});
</script>
<!-- 子组件 -->
<template><div><el-input v-model="form.name"></el-input><el-input v-model="form.age"></el-input><el-input v-model="form.sex"></el-input></div>
</template>
<script setup>
import { computed } from "vue";const props = defineProps({modelValue: {type: Object,default: () => {},},
});// const emit = defineEmits(["update:modelValue"]);
const emit = defineEmits();
const form = computed({get() {return new Proxy(props.modelValue, {get(target, key) {return Reflect.get(target, key);},set(target, key, value) {emit("update:modelValue", {...target,[key]: value,});return true;},});}
});
</script>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com