欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > vue3父子组件双向数据绑定v-model;父组件调用子组件事件

vue3父子组件双向数据绑定v-model;父组件调用子组件事件

2024/10/25 19:35:28 来源:https://blog.csdn.net/i_am_a_div/article/details/141219012  浏览:    关键词:vue3父子组件双向数据绑定v-model;父组件调用子组件事件

效果:
在这里插入图片描述

父far.vue

<template><div><div>父组件内容<pre>value1:{{ value1 }}</pre><el-button type="primary">flag1:{{ flag1 }}</el-button><pre>obj1:{{ obj1 }}</pre><el-input v-model="obj1.name" placeholder=""></el-input></div><el-button type="primary" @click="getSonData">父组件触发子组件事件</el-button><!-- :value1="value1" 是正常传值 --><!-- v-model="flag1"  是匿名双向绑定 --><!-- v-model:obj2="obj1" 是具名obj2双向绑定 --><son ref="sonRef" :value1="value1" v-model="flag1" v-model:obj2="obj1"></son></div>
</template><script setup>
import { ref } from "vue"
import son from './components/son.vue'
let value1 = ref('123')
let flag1 = ref(false)
let obj1 = ref({name: 'jack',age: 18
})const sonRef = ref(null)
// 父组件触发子组件事件
const getSonData = () => {if (!sonRef.value) returnsonRef.value.sonFun()
}
</script><style lang="scss" scoped></style>

子组件:son.vue

<template><div style="margin-top: 100px;">子组件:{{ value1 }} {{ modelValue }} {{ obj2 }}<br>正常使用:<el-input v-model="value2" placeholder=""></el-input><br><el-button type="primary" @click="changeFlag">双向修改flag1:{{ localValue }}</el-button><br>双向修改:<el-input v-model="obj3.name" placeholder="" @change="changeName"></el-input></div></template><script script setup>
import { ref, defineOptions, defineProps, defineEmits, watch } from 'vue'const emit = defineEmits(['value1', 'update:modelValue', 'update:obj2']);defineOptions({name: " Son"
})
const props = defineProps({value1: {type: [String, Number],default: () => {return undefined}},modelValue: { // 父组件 v-model 时数据没有指定参数名,所以此时属性modelValue会接收到v-model变量 即 flag1type: Boolean,default: () => {return false}},obj2: { // 具名双向绑定type: Object,default: () => {return {}}},
})
let value2 = ref(props.value1)
let localValue = ref(props.modelValue || false)
let obj3 = ref(props.obj2 || {})
const changeFlag = () => {localValue.value = !localValue.valueemit('update:modelValue', localValue.value) // 同步修改父组件的值
}
const changeName = () => {emit('update:obj2', obj3.value) // 同步修改父组件的值
}// 监听属性变化
watch([() => props.modelValue, () => props.obj2], ([modelValue, obj2]) => {console.log(modelValue, obj2);
}, { deep: true, immediate: true })// 子组件暴露给父组件的方法
const sonFun = () => {console.log('子组件暴露给父组件的方法', 1);
}
// 暴露
defineExpose({sonFun
})
</script><style lang="scss" scoped></style>

版权声明:

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

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