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>
相关推荐
草木红17 小时前
vite 安装 vue3 和 tailwindcss
vue3·vite·tailwindcss
凯小默2 天前
vue3-10-计算属性以及get跟set
vue3
Eshine、2 天前
解决前端项目中,浏览器无法正常加载带.gz名称的文件
前端·vue3·.gz·.gz名称的js文件无法被加载
Light602 天前
Vue3 关键字速查表:从入门到进阶的全景指南
vue3·前端开发·响应式编程·组合式api·ai集成
你说啥名字好呢10 天前
【Vue 渲染流程揭秘】
前端·javascript·vue.js·vue3·源码分析
行走的陀螺仪12 天前
vue3-封装权限按钮组件和自定义指令
前端·vue3·js·自定义指令·权限按钮
麦麦大数据13 天前
F046 新闻推荐可视化大数据系统vue3+flask+neo4j
python·flask·vue3·知识图谱·neo4j·推荐算法
Sheldon一蓑烟雨任平生13 天前
Vue3 高级性能优化
性能优化·vue3·tree-shaking·高级性能优化·首屏加载优化·更新优化·大型虚拟列表
前端.攻城狮14 天前
用fetch-event-source处理流式消息:Vue 3中实现openAI/DeepSeek的实时输出
vue3·流式消息
Sheldon一蓑烟雨任平生15 天前
webpack 从零构建 Vue3
webpack·typescript·vue3·webpack配置·从零构建vue3