- defineModel 已稳定
- defineModel 的简单介绍
- 使用 $emit 更新父组件传递过来的数据(vue3.2)
- 使用 defineModel 更新父组件传递过来的数据(vue3.4)
- 使用 defineModel 后的感觉
- defineModel 传递多个 v-model
- defineModel 设置默认值
- 发现 2 个问题:父子数据不同步,子组件数据不更新
- 验证: 子组件引用数据类型不更新,基本数据类型会更新
- 总结: defineModel 使用默认值会造成 2 个影响
- 处理 v-model 修饰符
- v-model 修饰符实现:第一个字母转为大写
- v-bind 的简写语法
- v-bind 的简写语法用在组件传递值上
- 更高效的反应性系统 watchEffect
- 编译器性能优化
- 删除了已弃用的功能
- 监听子组件的生命周期:@vnode-xx 更改为@vue:xxx
- 监听子组件的生命(vue3.4 之前)
- 监听子组件的生命(vue3.4)
- 监听子组件的生命-奇怪的地方
- 奇怪的地方:如果使用 vue3 的生命周期将不会被触发
- v-is 指令已被删除,改用带 vue:前缀的 is 属性
- 结语
在本文中,通过最近在项目中实践,我将深入探讨 Vue 3.4 带来的革新和提升,一同见证这个前端框架的进步。
性能提升:
在性能方面,Vue 3.4 做出了重大的内部改进,其中最引人注目的是模板解析器的全新重写。与之前基于正则表达式的解析器相比,新的解析器使用基于状态机的标记化技术,它通过单次遍历整个模板字符串来解析模板,显著提高了解析速度,模板解析器速度提高了 2 倍。无论是小型还是大型的 Vue 模板,新解析器都能保持两倍的性能提升,同时确保了向后兼容性。
另一个值得关注的升级是对响应系统的重构。在旧版本中,即使计算属性的结果未发生变化,每次依赖项更新,观察者也会被触发。而在 Vue 3.4 中,优化后的系统确保只有在计算结果实际变化时,相关的效果才会被触发,从而减少了组件的不必要渲染,提升了整体的性能。
Vue 3.4 中引入了非常多的新特性,下面我列举一些来介绍它们,争取让大家看得明明白白的:
defineModel 已稳定
defineModel 在 vue3.3 中还是一个实验性功能,但是经过一个学期的努力,该同学已经转正,大家可以使用。
defineModel 的简单介绍
defineModel() 返回的值是一个 ref,它可以像其他ref
一样被访问以及修改,能起到在父组件和当前变量之间的双向绑定的作用。它的.value
和父组件的v-model
的值同步,当它被子组件改变时,会触发父组件绑定的值一起更新。
我们都知道 props 的设计原则是单项数据流,子组件默认情况下是无法更改父组件传递过来的数据。如果要更改 vue3.3 以前是通过 $emit 来实现的。
下面我们来对比一下使用$emit
和defineModel
来更新数据。
使用 $emit 更新父组件传递过来的数据(vue3.2)
父组件:
// 父页面 <template> <div> <div > <p>我是父页面-此时:son 组件的值{{ flag }}</p> <button @click="openHandler"> 显示子组件</button> </div> <!-- 控制子组件是否显示 --> <son v-model:flag="flag"></son> </div> </template> <script setup lang="ts"> // vue3.2 开始组件引入后,就不需要注册啦。变量也不需要暴露出去啦 import son from '@/components/son.vue' import { ref } from 'vue'; let flag = ref(false) // 点击事件,更改值,让组件显示出来 const openHandler = ()=>{ flag.value = true; } </script> <style> .father-box{ background: palegreen; } </style>
子组件:
// son 组件 <template> <div v-if="flag"> <h1 >我是 son 组件</h1> <button @click="hideHandler"> 关闭组件:更改父组件传递过来的值</button> </div> </template> <script setup lang="ts"> import { defineProps, defineEmits } from "vue"; // 接收传递过来的值 defineProps({ flag: { type: Boolean, default: false, } }); // 注册事件 const emits = defineEmits(["update:flag"]); // 去更新父组件中的 flag 值,更改为 false const hideHandler = () => { emits("update:flag", false) } </script> <style> .son-box{ background: pink; } </style>