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

vue3 自定义useVModel函数

vue3 中使用v-model 父子组件共享数据的方法:

前提知识点:

1、子组件中获取v-model的值:

const props = defineProps({
  modelValue: {
    type: Object,
    required: true,
  },
});

2、子组件中触发父组件修 改modelValue的方法,这是vue3内部方法,不需要在父组件中监听

const emit = defineEmits(['update:modelValue']);
emit('update:modelValue',newValue)

父组件代码:

<script setup>
import { onMounted, reactive, ref } from 'vue';
import AboutView from './AboutView.vue'
const  chartContainer = ref(null)
const person = ref({name:'zs', age:20})
</script>

<template>
 <div>
  父组件修改共享数据名字:<input v-model="person.name"/>
 </div>
 <div>
  父组件修改共享数据年龄:<input v-model="person.age"/>
 </div>
<AboutView v-model="person"></AboutView>
</template>

//父组件使用v-model给子组件共享了一个对象

子组件代码:

<template>
  <div class="about">
    子组件数据:
    {{ pdata.name }}
    {{ pdata.age }}
    {{ pdata }}

    子组件修改父组件的名字:<input v-model="pdata.name" />
    子组件修改父组件的年龄:<input v-model="pdata.age" />
  </div>
</template>

<script setup>
import { getCurrentInstance, computed } from 'vue';

const _this = getCurrentInstance().proxy;

const props = defineProps({
  modelValue: {
    type: Object,
    required: true,
  },
});

const emit = defineEmits(['update:modelValue']);
function useVModel(props,propsName, emit) {
  return computed({
    get() {
      // 使用 new Proxy 来创建代理对象
      return new Proxy(props[propsName], {
        get(target, key, receiver) {
          return Reflect.get(target, key, receiver);
        },
        set(target, key, value){
          // 当属性被修改时,触发事件将修改后的数据传回父组件
          emit(`update:${propsName}`, { ...target, [key]: value });
          return true;
        },
      });
  
    },
    //如果modelValue是一个对象,且子组件的去修改的是一个属性值,是触发不了set方法的,所以在get方法中使用 proxy代理进行了拦截
    set(value) {
      // 如果需要手动设置整个对象的值
      emit(`update:${propsName}`, value);
    },
  });
}
const pdata = useVModel(props,'modelValue',emit)
</script>


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

相关文章:

  • 1.1 重叠因子:布林带(Bollinger Bands)概念与Python实战
  • uniapp uni.request重复请求处理
  • 【算法】002、编程实现社会问题
  • 【GPT】从GPT1到GPT3
  • Soft Actor-Critic (SAC)算法
  • Qt:容器类控件
  • LVS-nat模式
  • 深入解析TLS协议:保障网络通信安全的关键技术
  • 力扣习题笔记
  • Sklearn常用算法及建模流程总结
  • element-plus树形数据与懒加载的实现
  • matlab下载安装图文教程
  • Excel核心函数VLOOKUP全解析:从入门到精通
  • 51单片机学习之旅——定时器
  • Jetson AGX 安装 VScode 教_ubuntu1804
  • J3打卡——DenseNet模型实现鸟类分类
  • Linux软硬链接与动静态库
  • 调用deepseek接口
  • ⭐ Unity 横向滑动列表 首尾相连 轮转图
  • Rust 面试题