一、核心代码
- import {computed} from "vue";
-
- export function useVModel(props: any, propName: string, emit: any) {
- //传入的参数是对象
- if (Object.prototype.toString.call(props[propName]).slice(8, -1) === 'Object') {
- return computed({
- get() {
- return new Proxy(props[propName], {
- set(obj, name, val) {
- emit('update:' + propName, {
- ...obj,
- [name]: val,
- })
- return true;
- }
- })
- },
- set(val) {
- emit('update:' + propName, val)
- }
- })
- } else if (Object.prototype.toString.call(props[propName]).slice(8, -1) === 'Array') {//传入的参数是数组
- return computed({
- get() {
- return props[propName];
- },
- set(val) {
- emit('update:' + propName, val)
- }
- })
- } else {//基本数据类型以及其他
- return computed({
- get() {
- return props[propName];
- },
- set(val) {
- emit('update:' + propName, val)
- }
- })
- }
- }
二、运用
子组件
- <my-layer v-model:show="isShowLayer"/>
- ……
- import {useVModel} from "@/hooks/useVModel";
- ……
- props: {
- show: {type: Boolean, default: false},
- },
- ……
- let isShowLayer = useVModel(props, "show", emit);
- ……
- layerClose() {
- isShowLayer.value = false;
-
- },
-
- <my-choose-point v-model:show="isShowMap"/>