vue学习笔记

95 阅读5分钟

总结一些vue2和vue3的区别

原理方面

1. 使用组合式API替换选项式API:从Vue 2的选项式API(如datamethodscomputed等选项)迁移到Vue 3的组合式API(如使用setup函数)。组合式API提供了更灵活的代码组织方式,使得逻辑更加聚合,便于维护和复用。

2. 响应式原理的改变:Vue 3使用Proxy代替了Vue 2中的Object.defineProperty来实现响应式系统。这解决了Vue 2中无法通过下标修改数组、无法监听对象属性的新增和删除的问题,同时也提升了响应式的效率。(Vue 3并没有完全抛弃defineProperty。对于通过reactive定义的响应式数据,Vue 3使用Proxy进行包装,而对于ref,Vue 3仍然使用defineProperty给一个空对象定义一个value属性来实现响应式。)

3. 组合式API的引入:Vue 3引入了组合式API,使得源码可以按照函数式编程的方式编写,方便按需引入。这种写法配合tree-shaking(Tree-shaking 是一种优化 JavaScript 代码的技术,它的核心目的是移除那些在代码库中未被使用的部分,从而减少最终打包文件的大小)功能,可以使得打包体积更小,因为tree-shaking功能必须配合按需引入的写法。

3. 性能方面:Vue 3增加了静态节点标记,会标记静态节点,不对静态节点进行比对,从而提高效率。

image.png

静态节点标记

在 Vue 3 中,静态节点是指那些在组件的生命周期中不会发生变化的节点。这些节点在首次渲染后,其内容和结构被认为是稳定的,因此在后续的更新中不需要再次进行比较或重新渲染。

图片中的静态节点

在图片中,我们可以看到三个 div 元素的创建:

  1. 第一个 div 元素包含静态文本 "Hello World"。
  2. 第二个 div 元素包含动态内容 {{x}}并且被标记为1。
  3. 第三个 div 元素包含动态类名 :class="a" 和静态文本 "Hello World"并且被标记为2。

在 Vue 3 的渲染过程中,第一个 div 元素可以被标记为静态节点,因为它不包含任何动态内容。这意味着在后续的更新中,Vue 可以跳过对这个节点的比较和重新渲染,从而提高性能。

性能优化

通过标记静态节点,Vue 3 可以减少不必要的 DOM 操作,因为只有动态节点需要在每次更新时被重新评估和可能的重新渲染。这种优化策略可以显著提高大型应用的性能,尤其是在包含大量节点和频繁更新的场景中。

总结

Vue 3 通过静态节点标记和优化,减少了不必要的 DOM 操作,从而提高了应用的运行效率。在图片中,第一个 div 元素是一个静态节点的例子,它在首次渲染后不需要再次进行比较或重新渲染,除非其内容或结构发生变化。这种优化是 Vue 3 提升性能的关键策略之一。

进阶操作方面

1. v-model 应用于自定义组件时的变化

在 Vue 2 的自定义组件中,v-model 传递的值是value,默认监听 changeinput 事件来实现双向数据绑定。 在 Vue 3 的自定义组件中,v-model 传递的值是modelValue,监听updata:modelValue事件来实现双向数据绑定。

2. Mixins和Hooks

Mixins

在Vue 2中,Mixins是一种常见的复用逻辑的方式。Mixins允许你在一个单独的文件中定义一些组件选项(如data、methods、computed等),然后在多个组件中复用这些选项。Mixins在Vue 2中非常流行,因为它们提供了一种简单的方式来共享功能。(但是Minins容易造成组件和自身的逻辑冲突) ``

export default {
  data() {
    return {
      commonData: ''
    };
  },
  methods: {
    commonMethod() {
      console.log('Common method called');
    }
  }
};

// MyComponent.vue
import myMixin from './mixins';

export default {
  mixins: [myMixin],
  data() {
    return {
      localData: ''
    };
  },
  methods: {
    localMethod() {
      this.commonMethod();
    }
  }
};

Hooks

在Vue 3中,引入了Composition API,其中的核心概念之一就是Hooks。Hooks提供了一种更灵活的方式来复用逻辑。与Mixins不同,Hooks允许你直接在组件内部使用函数来复用逻辑,而不是通过全局的Mixins对象。

import { ref } from 'vue';

export function useCommon() {
  const commonData = ref('');
  const commonMethod = () => {
    console.log('Common method called');
  };

  return { commonData, commonMethod };
};

// MyComponent.vue
import { useCommon } from './useCommon';

export default {
  setup() {
    const { commonData, commonMethod } = useCommon();

    const localMethod = () => {
      commonMethod();
    };

    return { commonData, localMethod };
  }
};

总结

  • Vue 2:虽然Mixins在Vue 2中仍然可以使用,但Vue 3的引入使得Composition API成为推荐的方式,即使在Vue 2中也可以通过@vue/composition-api插件来使用Composition API。
  • Vue 3:官方推荐使用Composition API和Hooks,因为它们提供了更好的逻辑复用和组织方式,使得代码更加模块化和易于维护。

总的来说,Hooks提供了一种更现代、更灵活的方式来复用逻辑,特别是在Vue 3中,它们是首选的复用方式。

3. TypeScript

Vue 3 的设计和 API 更加友好地支持 TypeScript。Vue 3 提供了更好的类型推断和类型定义,使得在使用 TypeScript 开发时可以获得更好的类型检查和代码补全支持。这有助于提高代码的质量和开发效率。