首页 > 其他分享 >vue3.3.x setup 新实验性特性 defineModel 定义多个属性

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

时间:2023-09-15 17:47:34浏览次数:54  
标签:loading const default setup update vue3.3 defineModel type

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

<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),于是做出如下调整

<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,多个属性的响应式配置完全摸不着头脑,于是只能去找找源码,还好源码注释很详细,被我找到了解决方案,具体实现如下

<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>

标签:loading,const,default,setup,update,vue3.3,defineModel,type
From: https://www.cnblogs.com/wandoupeas/p/vue3_useModel.html

相关文章

  • pytest的setup和teardown
    setup和teardown函数可以分别在每个测试用例之前和之后执行,以确保测试环境的准备和清除工作。通过合理使用这两个函数,您可以有效地提高测试效率,并且避免测试用例之间的相互干扰。 Pytest-setup和teardown执行用例肯定有些需要前置条件或后置操作,例如前置的用户登陆,后置的清......
  • Vue3实战06-CompositionAPI+<script setup>好在哪?
    Vue3的CompositionAPI+<scriptsetup>这种最新的代码组织方式。<scriptsetup>是啥?为啥尤大在微博强推?本文就使用CompositionAPI和<scriptsetup>重构第2讲的清单应用。重构过程将明白,CompositionAPI让我们更好组织代码结构,<scriptsetup>本质是更精简方式写Compositi......
  • Vue3实战06-CompositionAPI+<script setup>好在哪?
    Vue3的CompositionAPI+<scriptsetup>标签内定义的变量和函数,都可以在模板中直接使用。###1.2显示清单应用实现累加器后,回到src/pages/Home.vue组件,使用如下代码显示清单应用。直接importTodoList.vue组件,然后<scriptsetup>会自动把组件注册到当前组件,这样......
  • Vue3 setup 如何添加name
    Vue3setup如何添加name小满zs2022-11-2915:5810778 开启掘金成长之旅!这是我参与「掘金日新计划·12月更文挑战」的第2天,点击查看活动详情Vue3中name有什么用呢?1.在递归组件的时候需要定义name2.配合keep-aliveincludeexclude可以缓存组件3.在Vue有报错或......
  • vue3 setup访问子组件的 DOM 元素
    使用setup的情况下这个时候我们无法使用this,注意在setup中setup是封闭的,不会将子组件事件暴露出来,所以要用defineExpose(),将需要在父组件调用的函数暴露出去,子组件代码如下:<template><divref="domRef"><div>哈哈哈哈</div></div></template><scriptsetuplang="t......
  • Vue3.3 + TS4 ,自主打造媲美 ElementPlus的组件库(16章)
    点击下载:Vue3.3+TS4,自主打造媲美ElementPlus的组件库(16章)提取码:n899 Vue3.3+TS4,自主打造媲美ElementPlus的组件库课程,又名:进阶必学,2023最新,打造媲美ElementPlus的组件库随着Web应用程序的复杂性不断增加,为了提高开发效率和维护性,我们往往需要构建可复用的组件库。Vue作为......
  • vue3 使用 setup 语法糖时,keep-alive 缓存使用 include / exclude 获取组件名
    <template><router-viewv-slot="{Component,route}"><keep-alive:include="['ComponentName']"><component:is="Component":key="route.name"/></keep-alive>......
  • 解决CondaVerificationError: setuptools appears to be corrupted
    问题描述使用Anaconda创建新环境,创建环境时或创建虚拟环境后进入到虚拟环境中安装Python,指定Python版本号小于3.7时,总是会出现如下报错:尝试使用condaclean--all并一路点y,无果而终。解决方案定位到指定包的位置,例如上图中红框展现出来的文件路径,进入到该路径下,将提示已......
  • redis setup
    第一步:下载redis安装包(root用户,目录/usr/local/src)#wgethttp://download.redis.io/releases/redis-5.0.5.tar.gz第二步:解压压缩包#tar-zxvfredis-5.0.5.tar.gz跳转到redis解压目录下cdr......
  • linux redis setup
    第一步:下载redis安装包(root用户,目录/usr/local/src)#wgethttp://download.redis.io/releases/redis-5.0.5.tar.gz第二步:解压压缩包#tar-zxvfredis-5.0.5.tar.gz跳转到redis解压目录下cdr......