diff方法优化
vue2中的虚拟dom是进行全量对比。vue3新增了静态标记(Patchflag),在与上次虚拟节点进行对比的时候,只对比带有PatchFlag的节点,并且可以通过flag的信息得知当前节点要对比的内容。简单说就是添加标记,如果数据不会改变即是死数据那就没有节点。也就不用参与比较,只比较带标记的自然效率会高。hoistStatic 静态提升
vue2中无论元素是否参与更新,每次都会重新创建,然后重新渲染。vue3中对于不参与更新的元素,会做静态提升,只会被创建一次,在渲染时候直接复用即可。通俗讲大概意思就是把不参与创建的元素在方法外以var创建成对象,渲染时候不重新创建了,直接服用。cacheHandlers 事件侦听器缓存
默认情况下onClick会被视为动态绑定,所以每次都会去追踪它的变化,但是因为是同一个函数,所以没有追踪变化,直接缓存起来复用即可。ssr渲染
当有大量静态的内容的时候,这些内容会被当做纯字符串推进一个buffer里面,即使存在动态的绑定,会通过模板插值嵌入进去。这样会比通过虚拟dom来渲染的快上很多很多。当静态内容大到一定量级时候,会用_createStaticVNode方法在客户端去生成一个static node,这些静态node,会被直接innerHtml,就不需要创建对象,然后根据对象渲染。安装Vite
npm install -g create-vite-app利用Vite创建VUE3项目
create-vite-app 'projectName'安装依赖运行项目
cd 'projectName npm install npm run dev超方便,主要解决data与method分离的问题
注意:ref监听简单类型,reactive复杂类型
提示:类似于java面向对象的思路,这里也同样可以将具体增删改方法提取到一个JS中然后export出来,vue页面中直接import视同就可以了同样也在setup中进行参数互传,即最后return的对象都是可以作为参数传递给这其中的其他方法的。
ref相关代码
<template> {{count}} <br> <button @click="myRef()">提交</button> </template> <script> import {ref} from 'vue'; export default { name: 'App', // setup函数是组合API的入口函数 setup() { // 定义了一个名称为count的变量,这个变量的初始值为0 //这个变量发生改变后,Vue会自动更新UI //注意ref函数只能监听简单类型的变化,不能监听复杂类型的变化(数组/对象) let count = ref(0) //在组合API中如果想定义方法,不用定义到methods中,直接定义即可 function myRef(){ count.value++; console.log(count.value) } // 注意点:在组合API中定义的变量/方法,要想在外界使用,必须通过return {xxx,xxx}暴露出去,必须用{} return {count,myRef} }, components: {} } </script>这个组合API就是不用再去将属性,方法等等去分开定义只需要引入’ref’,然后写入setup()再return就好,具体情况参照上边代码。 reactive相关代码
<template> <ul> <li v-for="(item,index) in this.state.stus" :key="item.id" @click="remStu(index)">{{item.name}}-{{item.age}} </li> </ul> </template> <script> import {reactive} from 'vue'; export default { name: 'App', setup() { let {state, remStu} = outMethod(); return {state, remStu}; }, } //单功能数据与方法整合在一个function内,在setup中直接可以调用。 function outMethod() { let state = reactive({ stus: [ {id: 1, name: 'a', age: 11}, {id: 2, name: 'b', age: 12}, {id: 3, name: 'c', age: 13}, ] }); function remStu(index) { state.stus = state.stus.filter((stu, ids) => ids != index); } return {state, remStu} } </script>reactive参数必须是对象(json/arr)
如果reactive传递了其他对象,即除了json或者arr以外的其他类型对象,如时间对象。
默认情况下修改对象,界面不会自动更新如果想更新,可以通过重新赋值的方式将对象整体toRef,具体使用
//原始 let name = toRef(obj,"name"); let age = toRef(obj,"age"); name.value = 'zs'; age.value = 66 //toRefs() let state = toRefs(obj) state.name.value = 'zs'; state.age.value = 66Option Api即原本Vue2中使用的data,methods方式 Composition Api即Vue3中的setup方式 Composition Api(组合API/注入API):本质其实就是将setup中的属性注入data,方法注入methods中。
如果某个对象永远都不要被追踪使用markRaw()。