vue2与vue3的区别

响应式原理

Vue.js 2使用Object.defineProperty()对数据进行劫持,结合发布订阅模式来实现响应式。例如,下面是一个Vue.js 2的示例:

var data = { message: 'Hello, Vue!' }

Object.defineProperty(data, 'message', {
  get: function () {
    console.log('get message')
    return message
  },
  set: function (newValue) {
    console.log('set message')
    message = newValue
  }
})

console.log(data.message) // 输出:'Hello, Vue!'
data.message = 'Hello, World!'
console.log(data.message) // 输出:'Hello, World!'

Vue.js 3则使用ES6的Proxy API对数据进行代理,通过reactive()函数给每一个对象都包一层Proxy,从而实现对数据的监控。例如,下面是一个Vue.js 3的示例:

import { reactive } from 'vue'

const data = reactive({ message: 'Hello, Vue!' })

console.log(data.message) // 输出:'Hello, Vue!'
data.message = 'Hello, World!'
console.log(data.message) // 输出:'Hello, World!'

Vue.js 3引入了Composition API,可以更好地组织和复用组件逻辑。例如,下面是一个Vue.js 2的示例:

export default {
  data () {
    return {
      message: 'Hello, Vue!'
    }
  },
  methods: {
    sayHello () {
      console.log(this.message)
    }
  }
}

而在Vue.js 3中,可以使用setup()函数来组织和复用组件逻辑。例如,下面是一个Vue.js 3的示例:
 

import { reactive } from 'vue'

export default {
  setup () {
    const state = reactive({
      message: 'Hello, Vue!'
    })
    const sayHello = () => {
      console.log(state.message)
    }
    return {
      state,
      sayHello
    }
  }
}

TypeScript支持

Vue.js 3对TypeScript的支持更加友好,可以更好地进行类型检查和代码提示。例如,下面是一个Vue.js 3的示例:

import { defineComponent, ref } from 'vue'

interface User {
  name: string
  age: number
}

export default defineComponent({
  setup () {
    const user = ref<User>({ name: 'Tom', age: 18 })
    const sayHello = () => {
      console.log(`Hello, ${user.value.name}!`) // 可以进行代码提示
    }
    return {
      user,
      sayHello
    }
  }
})

Teleport组件

Vue.js 3引入了Teleport组件,可以更方便地在DOM树中移动组件。例如,下面是一个Vue.js 3的Teleport组件示例:

<teleport to="body">
  <div class="modal">
    <h2>Modal Title</h2>
    <p>Modal Content</p>
  </div>
</teleport>

全局API的变化

Vue.js 3中的全局API发生了变化,例如Vue.component()变成了app.component(),Vue.directive()变成了app.directive(),Vue.filter()变成了app.filter()等。例如,下面是一个Vue.js 3的全局API示例:

import { createApp } from 'vue'
import MyComponent from './MyComponent.vue'

const app = createApp({})

app.component('my-component', MyComponent)
app.directive('my-directive', {
  mounted (el, binding) {
    console.log(binding.value)
  }
})
app.filter('my-filter', (value) => {
  return value.toUpperCase()
})

app.mount('#app')

VNode的变化

Vue.js 3中的VNode发生了变化,可以更好地支持渲染函数和自定义渲染器。例如,下面是一个Vue.js 3的VNode示例:

import { h } from 'vue'

const vnode = h('div', { class: 'container' }, [
  h('h1', 'Hello, Vue!'),
  h('p', 'This is a paragraph.')
])

console.log(vnode)

生命周期的变化

Vue.js 3中的生命周期发生了变化,例如beforeCreate和created合并成了beforeMount,beforeDestroy和destroyed合并成了unmounted等。例如,下面是一个Vue.js 3的生命周期示例:

import { createApp, onBeforeMount, onMounted, onBeforeUnmount, onUnmounted } from 'vue'

const app = createApp({
  beforeMount () {
    console.log('beforeMount')
  },
  mounted () {
    console.log('mounted')
  }
})

onBeforeMount(() => {
  console.log('onBeforeMount')
})

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

onBeforeUnmount(() => {
  console.log('onBeforeUnmount')
})

onUnmounted(() => {
  console.log('onUnmounted')
})

app.mount('#app')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值