Vue3与Vue2比较

这篇具有很好参考价值的文章主要介绍了Vue3与Vue2比较。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vue.js 3相对于Vue.js 2带来了一些重大变化,其中包括一些语法变化。

下面是Vue.js 2和Vue.js 3的一些语法差异比较:

一、语法差异比较

1.组件的注册方式不同

在Vue.js 2中,我们使用Vue.component()或者Vue.extend()方式创建一个组件。但是在Vue.js 3中,我们需要使用 createApp().component()方式来注册一个组件。

当我们使用Vue.js 2时,我们通常使用Vue.component()或Vue.extend()方法注册组件。例如:

// 全局注册组件
Vue.component('my-component', {
  // options
})

// 局部注册组件
var Component = Vue.extend({
  // options
})

var vm = new Vue({
  el: '#app',
  components: {
    'my-component': Component
  }
})

而在Vue.js 3中,注册组件的方式有所改变。我们可以使用Vue.createApp()方法创建一个Vue实例,并使用它的.component()方法注册组件。例如:

const app = Vue.createApp({})
app.component('my-component', {
  // options
})

需要注意的是,Vue.js 3中的组件注册方式与Vue.js 2有一定的兼容性。可以使用Vue.component()方法进行全局组件注册,但需要通过createApp()方法创建的Vue实例来进行局部组件注册。

2.模板指令的变化

Vue.js 3中的模板指令和Vue.js 2相比基本没有变化。但需要注意的是,在Vue.js 3中,动态绑定属性变量名需要使用v-bind:[属性名]语法,而不是v-bind:属性名。
Vue.js 3 在模板指令方面引入了很多新特性,例如v-model指令的modelValue和update:modelValue属性、v-for指令的keyBy属性等。同时,Vue.js 3也对某些指令进行了优化,例如 v-bind指令现在会自动对单词转换为驼峰式命名等。

以下是一个Vue.js 2和Vue.js 3的模板指令示例:
Vue.js 2:

<div id="app">
  <p v-if="show">Hello, {{ name }}</p>
  <input v-model="name">
</div>

Vue.js 3:

<template>
  <div>
    <p v-if="show">Hello, {{ name }}</p>
    <input v-model:value="name" @input="updateName">
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const name = ref('');
    const show = ref(true);
    
    const updateName = (event) => {
      name.value = event.target.value;
    }
    
    return {
      name,
      show,
      updateName
    }
  }
}
</script>

在Vue.js 3中,v-model 指令需要使用:value和@input事件来实现双向数据绑定。另外,vue.js3中使用 ref 来创建响应式数据。除此之外,Vue.js 3还引入了 setup() 函数,取代了 Vue.js 2 中的 data() 和 methods()。

3.ref指令的变化

在Vue.js 2中,我们可以使用ref指令在模板中引用一个DOM元素或组件实例。而在Vue.js 3中,ref指令已经移除,需要使用ref属性来引用一个DOM元素或组件实例。

在Vue2中,我们使用ref指令可以给页面上的元素或组件起一个别名,可以通过this.$refs来获得对这些元素或组件的引用。例如,在Vue2中,我们可以这样定义一个ref:

<template>
  <div>
    <h1 ref="title">Hello World</h1>
  </div>
</template>

我们可以在组件中使用this.$refs.title来引用这个h1元素。
在Vue3中,使用ref指令有了一些变化。ref现在支持名字作为一个函数参数,这样我们可以在调用组件每次实例化时,提供一个不同的名字。另外,我们现在可以使用ref指令引用模板中的任何元素,包括普通的HTML元素、子组件以及子元素上绑定的自定义组件。

以下是Vue3中ref指令的示例:

<template>
  <div>
    <h1 ref="title">Hello World</h1>
    <MyComponent ref="my_component"></MyComponent>
    <div ref="custom_element"></div>
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  components: {
    MyComponent
  },
  created() {
    console.log(this.$refs.title); // h1元素
    console.log(this.$refs.my_component); // MyComponent实例
    console.log(this.$refs.custom_element); // div元素
  }
}
</script>

需要注意的是,Vue3中的ref指令不再返回DOM元素,而是返回元素对应的组件实例或元素引用对象。所以,我们在使用this.$refs时需要特别注意。

4.组件API的变化

Vue.js 3中的组件API进行了调整,例如,Props属性不再使用type和default属性,而是使用传统的JavaScript类型检查。在Vue.js 3中,我们可以使用defineProps()和defineEmits()等方法来定义和使用props和emits。

Vue2和Vue3之间,组件API也经历了很多变化。以下是一些Vue2和Vue3之间组件API的变化差异示例:

4.1.props

在Vue2中,我们通过props来声明组件的输入属性。在Vue3中,这个声明被移到了组件选项之外,使用setup函数的参数props来接收props输入属性。在Vue3中,我们需要使用reactive()或ref()函数来对props进行响应式处理。
Vue2中props的声明示例:

// Vue2

Vue.component('my-component', {
  props: {
    propA: String,
    propB: [Number, String],
    propC: {
      type: String,
      required: true
    },
    propD: {
      type: Number,
      default: 100
    }
  },
  // ...
})

Vue3中props的使用示例:

// Vue3

<template>
  <div>{{ props.propA }}</div>
</template>

<script>
  import { reactive } from 'vue'

  export default {
    name: 'MyComponent',
    setup(props) {
      // props 响应式
      const state = reactive({
        propA: props.propA,
        propB: props.propB
      })

      // ...
      return { state }
    }
  }
</script>

4.2.生命周期钩子函数

在Vue3中,一些生命周期钩子被重命名或者被废除。例如,beforeCreate和created钩子函数在Vue3中被合并成了一个beforeMount生命周期钩子函数,这个钩子函数在组件开始挂载前调用。
Vue2中生命周期钩子函数的示例:

Vue.component('my-component', {
  beforeCreate() {
    // ...
  },
  created() {
    // ...
  },
  beforeMount() {
    // ...
  },
  // ...
})

Vue3中生命周期钩子函数的示例:

<script>
  export default {
    beforeMount() {
      // ...
    },
    // ...
  }
  </script>

4.3.组件间通信

在Vue2中,我们使用emit和on来进行组件间通信。在Vue3中,将emit和on进行了更改,变为了emits和emit()。我们现在可以通过在模板中使用 v-on=“emits” 来向父组件发射事件。
Vue2中组件间通信的示例:

Vue.component('my-component', {
  methods: {
    handleClick() {
      this.$emit('show-message', 'Hello World')
    }
  },
  // ...
})

Vue.component('parent-component', {
  methods: {
    handleMessage(message) {
      console.log(message)
    }
  },
  mounted() {
    this.$on('show-message', this.handleMessage)
  },
  // ...
})

Vue3中组件间通信的示例:

<template>
  <button @click="handleClick">Show Message</button>
</template>

<script>
  import { defineEmits } from 'vue'

  export default {
    emits: ['show-message'], // 声明组件事件

    methods: {
      handleClick() {
        this.$emit('show-message', 'Hello World')
      }
    },
    // ...
  }
</script>

以上是Vue2和Vue3之间组件API的一些变化差异示例,仅供参考。实际使用时,请查看官方文档以获取更详细的信息。

5.事件的变化

在Vue.js 3中,事件的写法方式发生了变化,事件名需要使用小驼峰写法,如@myEvent,而不是@my-event。
在Vue2中,我们使用v-on指令来绑定事件监听器。例如,我们可以这样绑定一个点击事件监听器:

<template>
  <div>
    <button v-on:click="handleClick">Click me</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleClick() {
      console.log('Clicked');
    }
  }
};
</script>

在Vue3中,v-on指令已被重命名为@符号。除此之外,Vue3还引入了全新的事件API。Vue3的事件API允许我们在逻辑组件(setup函数)内的引用中定义事件处理程序,而不需要使用Vue2中的methods属性。例如:

<template>
  <div>
    <button @click="handleClick">Click me</button>
  </div>
</template>

<script>
import { onMounted } from 'vue';

export default {
  setup() {
    const handleClick = () => {
      console.log('Clicked');
    };

    onMounted(() => {
      console.log('Mounted');
    });

    return { handleClick };
  }
};
</script>

在上面的示例中,我们通过调用Vue3的onMounted函数,在组件挂载时记录了一条消息。我们还定义了一个handleClick函数,它与按钮的点击事件相对应,并用setup函数的返回值将其公开。

二、Vue3变化和改进

除了组件 API 和事件绑定等方面的差异外,Vue.js 3 还带来了一些其它的变化和改进,其中包括:

6.更快的渲染性能

Vue.js 3 引入了新的虚拟 DOM 实现,使得页面渲染更快。

7.改进的响应式系统

Vue.js 3 的响应式系统也有所改进,使得响应式数据的追踪和更新更加高效。

8.改进的 TypeScript 支持

Vue.js 3 的代码库完全使用 TypeScript 进行编写,使得开发者能够更好地利用 TypeScript 的类型检查和语法提示等特性。

9.改进的插件系统

Vue.js 3 的插件系统有所改进,使得插件的编写和使用更加方便。

10.改进的工具链

Vue.js 3 的工具链也有所改进,使得开发者能够更加方便地进行开发、调试和部署等工作。

需要注意的是,虽然 Vue.js 3 带来了许多改进和新特性,但是也有一些向后不兼容的变化,因此在迁移版本时需要注意相关的文档和指南。

总结

总之,Vue.js 3相比Vue.js 2带来了一些语法上的变化,这些变化主要是为了提高性能和类型安全性,同时也为我们提供更好的开发体验。文章来源地址https://www.toymoban.com/news/detail-451773.html

到了这里,关于Vue3与Vue2比较的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端(四)——vue.js、vue、vue2、vue3

    😊博主:小猫娃来啦 😊文章核心: vue.js、vue、vue2、vue3从全局到局部 Vue.js是一款流行的JavaScript框架 vue,vue2,vue3都是vue.js的不同版本。 Vue:Vue.js的第一个版本,也称为Vue 1.x。它于2014年首次发布,并获得了广泛的应用和认可。 Vue2:Vue.js的第二个版本,也称为Vue 2.x。它在Vu

    2024年02月12日
    浏览(79)
  • uniapp引入全局js,vue2/vue3不同方式引入

    Hi I’m Shendi uniapp引入全局js,vue2/vue3不同方式引入 最近写小程序,个人开发,选用了 uni-app 进行开发 选用的 vue3 版本 因为我用的 vue3 版本,在这里踩了没学过vue3的坑,用vue2引入全局js的方式使用,导致undefined… Vue2 版引入全局js的方法如下 将js放到项目内,一般放到自建的

    2024年02月03日
    浏览(63)
  • Vue2和Vue3是Vue.js框架的两个主要版本,它们之间有以下区别

    性能优化:Vue3在内部进行了重写,采用了更高效的虚拟DOM算法,使得渲染速度更快,性能更好。 更小的体积:Vue3的体积比Vue2更小,这意味着更快的下载和加载速度。 Composition API:Vue3引入了Composition API,它是一种新的组合式API,可以更好地组织和重用组件逻辑,使得代码更

    2024年02月15日
    浏览(48)
  • 【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

    gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。 当前 GoGoCode 支持解析和操作如下类型的代码: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    浏览(54)
  • vue2 如何监听数组的变化

    在Vue 2中,底层是通过重写数组的原型方法来实现对数组变化的监听。具体来说,Vue 2使用了一个名为Observer的类来劫持数组的原型方法,使其在调用这些方法时能够触发相应的变化通知。 当Vue 2初始化一个响应式对象时,如果对象是一个数组,Vue会将数组的原型指向一个经过

    2024年02月12日
    浏览(50)
  • vue3- 02vue3的变化

    创建实例不再使用构造函数,而是使用createApp 使用插件时不再通过构造函数,而是通过实例 vue2的this指向是组件 vue3的this指向是proxy(代理,代理的是组件实例) vue3: vue2: 总结:组件实例代理: 1. setup(): 设置组件的初始状态和行为 setup 函数接收两个参数:props 和 context。

    2024年02月16日
    浏览(40)
  • Flutter vs 前端 杂谈:SliverAppBar、手动实现Appbar、前端Html+JS怎么实现滚动变化型Appbar - 比较

    Flutter vs 前端 杂谈 SliverAppBar的弹性背景的显隐效果使用Html+JS怎么实现 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134149018 在 Flutter 中,最简单的 appbar 就是 Appbar 组件,它没有任何难点,任何刚

    2024年02月05日
    浏览(59)
  • vue3监听路由的变化

    可以使用监听 router.currentRoute.value 的值,,来监听路由的变化。 引入: setup使用 : 控制台输出的值 newValue : 如果我们只需要监听当前路由 name 的变化,就可以这么监听 router.currentRoute.value.name immediate:true //true 就表示会立即执行。(watch默认绑定,页面首次加载时,是不会执行

    2024年02月12日
    浏览(44)
  • Vue3组件不发生变化,如何监听pinia中数据变化?

    在开发过程中,我们需要将一些跨组件使用的的数据在pinia中进行状态管理,组件在初始化的时候我们能通过onMounted,computed,watch,watchEffect获取到存储在pinia state中的内容,有一些特殊情况,在组件初始化之后我们无法通过以上四种情况获取state中的内容,这时候我们怎么做呢?

    2024年02月11日
    浏览(54)
  • vue3-模板中的变化

    vue2 比较让人诟病的一点就是提供了两种双向绑定: v-model 和 .sync ,在 vue3 中,去掉了 .sync 修饰符,只需要使用 v-model 进行双向绑定即可。 为了让 v-model 更好的针对多个属性进行双向绑定, vue3 作出了以下修改 当对自定义组件使用 v-model 指令时,绑定的属性名由原来的 va

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包