Vue3-新特性defineOptions和defineModel示例详解
defineOptions
问题:用了<script setup>后,就无法添加与其平级的属性了,比如定义组件的name或其他自定义的属性。
为了解决这一问题,引入了defineProps与defineEmits这两个宏,但这只解决了props与emits这两个属性。如果要定义其他的平级属性,还是得回到最原始的用法--就再添加一个普通的<script>标签。这样就会存在两个<script>标签,让人无法接受。
所以在Vue3.3中新引入了defineOptions宏。顾名思义,主要是用来定义Option API的选项。可以用defineOptions定义任意的选项,props、emits、expose、slots除外(因为这些可以使用defineXXX来做到)
<script setup> import { defineOptions } from 'vue' defineOptions({ name: 'Foo',//组件重命名 inheritAttrs: false, //...更多自定义属性 }) </script>
defineModel
实验型,快速实现双向绑定,简化v-model
在Vue3中,自定义组件上使用v-model,相当于传递一个modelValue属性,同时触发update:modelValue事件
<Child v-model="isVisible"> //相当于 <Child :modelValue="isVisible" @update:modelValue="isVisible=$event">
我们需要先定义props,再定义emits。其中有许多重复的代码。如果需要修改此值,还需要手动调动emit函数
父组件:
<template> <inputModel v-model="txt"></inputModel>{{ txt }} </template> <script setup> import inputModel from '@/components/inputModel.vue' import { ref } from 'vue' const txt = ref(100) </script>
子组件:
<script setup> import { defineProps, defineEmits } from 'vue' defineProps({ modelValue: String }) const emit = defineEmits(['update:modelValue']) </script> <template> <div> <input type="text" :value="modelValue" @input="e => emit('update:modelValue', e.target.value)"> </div> </template> <style scoped> input { width: 14rem; height: 2rem; } </style>
使用defineModel改进后的子组件:
<script setup> import { defineModel } from 'vue' const modelValue = defineModel() </script> <template> <div> <input type="text" :value="modelValue" @input="e => modelValue = e.target.value"> </div> </template>
因为这是实验型,所以还需要配置一些东西才能生效
打开vite.config.js文件加入以下语句:
{ script: { defineModel: true } }
写完后,需要重新启动这个项目才能生效
到此这篇关于Vue3-新特性defineOptions和defineModel的文章就介绍到这了,更多相关Vue3 defineOptions和defineModel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
VScode更新后安装vetur仍无法格式化vue文件的解决
这篇文章主要介绍了VScode更新后安装vetur仍无法格式化vue文件的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-10-10在vue中使用vant TreeSelect分类选择组件操作
这篇文章主要介绍了在vue中使用vant TreeSelect分类选择组件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-11-11
最新评论