vue3新特性

72 阅读2分钟

vue2和vue3响应式的区别:

vue2中:

     const initData = {
        a: 1
      };
      const data = {};
      Object.keys(initData).forEach((keys) => {
        //会直接在一个对象身上定义一个新的属性或者修改现有的属性
        Object.defineProperty(data, keys, {
          get() {
            console.log('访问元素', keys);
            return initData[keys];
          },
          set(v) {
            console.log('修改元素', keys);
            initData[keys] = v;
          }
        });
      });
  1. 修改对象身上本身现有的属性会触发对象getter和setter属性,依赖收集是正常的

image.png

2.当动态增加对象身上的属性时,不会重新触发对象身上的响应式收集

image.png

3.如何解决?Vue.set || this.$set

思路:先判断类型:null或undefined 数组:通过原有方法触发响应式依赖 对象

// 代码待补充

vue3中:

     const initData1 = {
        a: 1
      };
      const proxy = new Proxy(initData1, {
        get(target, key, receiver) {
          console.log('访问元素', key);
          return Reflect.get(target, key, receiver);
        },
        set(target, key, value, receiver) {
          console.log('修改元素', key);
          return Reflect.set(target, key, value, receiver);
        }
      });

image.png

无论是修改对象身上的属性还是访问对象身上新增的属性时,都会触发对象的响应式操作

vue2和vue3写法区别:

export default {
  data(){
   return {
    count:0
    }
  },
  computed:{
   multiple(){
    return 2*this.count
    }
  },
  methods: {
   increase(){
     this.count++
   }
 }
}
<script setup> 
  import { ref } from 'vue' 
  const count = ref(0) 
  function increase(){
     count.value++
   }
</script>

vue3的新特性

组合式 API (Composition API)

  1. ref:添加响应式的值,具体的是获取proxy对象里面的某个值

如何判断一个值是不是ref:isRef

setup(){
 const conunt = ref(10)
 const total = 30
 console.log("count is ref": isRef(count)) //true
 console.log("total is ref": isRef(total)) //false
}
  1. reactive:通过proxy创建出来的实例
  2. toRefs
  3. readOnly:只读不可修改
  4. shallowReactive
  5. shallowReadonly

生命周期

区别:新增两个生命周期

vue2:生命周期 image.png image.png image.png vue3:生命周期钩子(全部加上on) image.png image.png

异步组件:按需加载

!!!按需加载的前提是:打包构建的产物是分包的,不是和其他文件柔和在一起

声明异步组件:

import { defineAsyncComponent } from 'vue' 
const AsyncComp = defineAsyncComponent(() =>import('./components/MyComponent.vue') )

注册异步组件:

app.component('MyComponent', defineAsyncComponent(() => import('./components/MyComponent.vue') ))

自定义指令

teleport

目的:将子节点渲染到父节点以外的节点上

hooks