vue3.3.x setup 新实验性特性 defineModel 定义多个属性

由于有些业务组件需要定义多个响应式props,类似这种(比较懒,没上ts),在vue3.3.x以前,如果不用三方库,代码会变得很繁琐

javascript 复制代码
<script setup>
	const props = defineProps({
		modelValue: {
			type: Object,
			default: () => ({})
		},
		fields: {
			type: Object,
			default: () => ({})
		},
		list: {
			type: Array,
			default: () => []
		},
		loading: Boolean
	})

	const emit = defineEmits('update:modelValue', 'update:fields', 'update:list', 'update:loading')

	const onUpdateModelValue = (value) => {
		emit('update:modelValue', value)
	}

	const onUpdateLoading = (value) => {
		emit('update:loading', value)
	}

	// ...
</script>

正好vue3.3.x更新了新apiuseModel(原本使用的vueuse的useVModel),于是做出如下调整

javascript 复制代码
<script setup>
	import { useModel } from 'vue'
	const props = defineProps({
		modelValue: {
			type: Object,
			default: () => ({})
		},
		fields: {
			type: Object,
			default: () => ({})
		},
		list: {
			type: Array,
			default: () => []
		},
		loading: Boolean
	})

	const emit = defineEmits('update:modelValue', 'update:fields', 'update:list', 'update:loading')

	const modelValue = useModel(props, 'modelValue')
	const fields = useModel(props, 'fields')
	const list = useModel(props, 'list')
	const loading = useModel(props, 'loading')
</script>

虽然用了vue3.3.x的新特性useModel,但是还是需要定义emit,所以代码还是觉得有点多,然后想到了跟useModel一起发布的defineModel,但是百度了一圈,都只有ts版本的defineModel,而且大部分是单个响应式props,多个属性的响应式配置完全摸不着头脑,于是只能去找找源码,还好源码注释很详细,被我找到了解决方案,具体实现如下

javascript 复制代码
<script setup>
	import { defineModel } from 'vue' // 好像可以引入

	const modelValue = defineModel({ type: Object, default: () => ({}) })
	const fields = defineModel('fields', { type: Object, default: () => ({}) })
	const list = defineModel('list', { type: Array, default: () => [] })
	const loading = defineModel('loading', { type: Boolean })
</script>
相关推荐
SuperEugene7 小时前
Vue3 中后台实战:VXE Table 从基础表格到复杂业务表格全攻略 | Vue生态精选篇
前端·vue.js·状态模式·vue3·vxetable
p5l2m9n4o6q9 小时前
Vue3后台管理系统布局实战:从零搭建Element Plus左右布局(含Pinia状态管理)
vue3·pinia·element plus·viewui·后台管理系统
梵得儿SHI12 小时前
Vue3 生态工具实战进阶:API 请求封装 + 样式解决方案全攻略(Axios/Sass/CSS Modules)
前端·css·vue3·sass·api请求·样式解决方案·组合式api管理
行者-全栈开发1 天前
43 篇系统实战:uni-app 从入门到架构师成长之路
前端·typescript·uni-app·vue3·最佳实践·企业级架构
沙振宇1 天前
【Web】使用Vue3+PlayCanvas开发3D游戏(二)3D 地图自由巡视闯关游戏
游戏·3d·vue3·playcanvas
沙振宇2 天前
【Web】使用Vue3+PlayCanvas开发3D游戏(一)3D 立方体交互式游戏
游戏·3d·vue·vue3·playcanvas
小圣贤君2 天前
从「选中一段」到「整章润色」:编辑器里的 AI 润色是怎么做出来的
人工智能·electron·编辑器·vue3·ai写作·deepseek·写小说
之歆16 天前
Vue3 + Vite2.0 全栈开发实践:从零到一构建通用后台管理系统-上
vue3·vite2.0
之歆17 天前
Vue3 + Vite2.0 全栈开发实践:从零到一构建通用后台管理系统-下
javascript·vue.js·vue3
麦麦大数据18 天前
M004_基于Langchain+RAG的银行智能客服系统设计与开发
typescript·langchain·flask·vue3·faiss·rag