• vue3.4新特性:v-bind同名简写、defineModel


    在上一篇 vue3.3 文章中,虽然写了 defineModel ,但并未考虑到写的时候3.4版本里 defineModel 才作为稳定的API正式加入( 两年没看vue3 更新的内容了... ),并增加了对支持修饰符相关的内容;

    基于此,如果在vue3.3的版本里使用defineModel碰到某些错误的话,也许就会是该版本不支持,vue3.4也算是较为重要的一个小版本吧,建议还是使用3.4而不是3.3


    defineModel是配合父子组件使用的,所以下面分为2个代码块作为案例演示用法:

    1. <template>
    2. <div>
    3. <div>父组件div>
    4. <div>vue3.3新特性: defineModel div>
    5. <div :id>vue3.4新特性: v-bind同名简写 (ts eslint都会报错,暂时懒得研究是什么依赖版本的问题); defineModel 正式加入div>
    6. <div>
    7. <child v-model:inputName.animation="data1">child>
    8. div>
    9. div>
    10. template>
    11. <script setup lang="ts">
    12. import { ref,watch } from "vue";
    13. import child from "./child.vue";
    14. const id = ref('testID')
    15. const data1 = ref(undefined)
    16. // const data1 = ref('')
    17. watch(data1,(val)=>{
    18. console.log(val,'监听是否变化');
    19. })
    20. setTimeout(() => {
    21. data1.value = '肥伦'
    22. console.log('变更数据',data1.value);
    23. }, 1000);
    24. script>

    子组件:

    1. <template>
    2. <div>
    3. <div>子组件div>
    4. <div><input type="text" v-model="modelValue">div>
    5. div>
    6. template>
    7. <script setup lang="ts">
    8. // defineModel 是 props + emit 的语法糖, defineModel就只建议用运行时声明的写法了!
    9. // defineModel([name], [prop])的参数说明
    10. /**
    11. * name 和 prop 选项都不是必填。
    12. */
    13. /**
    14. * prop {} 参数详解
    15. * {
    16. * type: String // 表示vmodel绑定的值类型,不符合控制台抛出警告。
    17. * default: '芙莉莲' // 当父组件vmodel传入的是 undefine 将使用该默认值。
    18. * set: function // 修改该 model 时触发
    19. * get: function // 访问该 model 时触发
    20. * }
    21. */
    22. // const modelValue = defineModel() // 写法1,子组件这里等价于props.modelValue + update:modelValue ;(由父组件通过 v-model 使用)
    23. // const modelValue = defineModel({ type: String,default:'芙莉莲' }) // 写法1的基础上,设置model的功能选项。
    24. // const modelValue = defineModel('inputName') // 写法2,子组件这里等价于props.inputName + update:inputName ;(由父组件通过 v-model:inputName 使用)
    25. // const modelValue = defineModel('inputName', { type: String, default: '芙莉莲' }) // 写法2的基础上,声明 prop 选项
    26. // ↓ 写法3,如果v-model声明了修饰符,则需要通过解构返回值的方式获取;
    27. const [modelValue, modelModifiers] = defineModel('inputName', {
    28. type: String,
    29. default: '芙莉莲',
    30. set(val) {
    31. if (modelModifiers.animation) {
    32. return val.trim()
    33. }
    34. return val
    35. },
    36. // get(val){
    37. // return val
    38. // }
    39. })
    40. console.log(modelValue.value, modelModifiers);
    41. // modelValue 在被修改时,触发 "update:inputName" 事件; 不声明model的name时,则是默认的 update:modelValue
    42. // 总结就是根本不用管他是 update:xxx 什么玩意,这部分不重要,因为defineModel写法下,你不需要自己去调用了!
    43. setTimeout(() => {
    44. // emit('update:inputName','测试有用吗')
    45. // 如果你非要自己手动调用,也是可以的!但会报TS错,因为emit没有声明该类型,解决方法就是你去声明一下就好了。
    46. // 但是最终还不如 modelValue.value = xx 的方式去修改更好!
    47. modelValue.value = '测试更改有效的!'
    48. }, 5000);
    49. script>

  • 相关阅读:
    【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测
    设计加速!11个Adobe XD插件推荐!
    华为鲲鹏服务器
    流量渠道分析
    详解IIC通信协议以及FPGA实现
    MySQL中为什么要使用索引合并(Index Merge)
    从月薪10k到30k的必走之路:自动化测试
    KubeEdge v1.15.0发布!新增5大特性
    mac DOSBox快捷键
    蓝桥(杂题3)
  • 原文地址:https://blog.csdn.net/lijiahui_/article/details/136382002