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

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>


http://www.kler.cn/a/375219.html

相关文章:

  • [bug]java导出csv用Microsoft Office Excel打开乱码解决
  • 软件设计与体系结构
  • Go web 开发框架 Iris
  • ffmpeg翻页转场动效的安装及使用
  • 深度学习实战车辆目标跟踪【bytetrack/deepsort】
  • Tool之Excalidraw:Excalidraw(开源的虚拟手绘风格白板)的简介、安装和使用方法、艾米莉应用之详细攻略
  • 「Mac畅玩鸿蒙与硬件10」鸿蒙开发环境配置篇10 - 项目实战:计数器应用
  • k8s集群 ceph rbd 存储动态扩容
  • Java项目实战II基于Java+Spring Boot+MySQL的植物健康系统(开发文档+数据库+源码)
  • 网络搜索引擎Shodan(5)
  • Lucene数据写入流程
  • 【qt qtcreator使用】【正点原子】嵌入式Qt5 C++开发视频
  • Python爬虫:在1688上“侦探游戏”获取店铺详情
  • 如何利用斗篷cloak技术做F牌独立站?
  • mysql 中临时表
  • 如何提高FPGA的逻辑利用率与资源效率!!!
  • 软件测试工程师面试整理 —— 编程与自动化!
  • 竞赛管理新未来:Spring Boot大学生竞赛平台
  • C++的filesystem的时间与Qt的QDateTime时间为什么相差204年?
  • git入门教程15:git扩展
  • Vue全栈开发旅游网项目(3)-Vue路由配置
  • 基于SpringBoot和PostGIS的世界各国邻国可视化实践
  • 一文了解 | 软件测试类型与用途
  • 前端请求后端接口报错(blocked:mixed-content),以及解决办法
  • Element Plus在Vue3的安装
  • 使用web.dev提供的工具实现浏览器消息推送服务