vue2与vue3区别

1. vue2和vue3双向数据绑定原理发生了改变

vue2 的双向数据绑定是利用ES5 的一个 API Object.definePropert()对数据进行劫持 结合 发布订阅模式的方式来实现的。

vue3 中使用了 es6 的 ProxyAPI 对数据代理。

2.根节点

    vue2只有一个根节点

     

   vue3可以有多个根节点

      

3. API

      Vue2使用选项类型API(Options API):用属性来分割组件

      Vue3合成型API(Composition API):用方法来分割组件

   这样代码会更加简便和整洁

4. 建立数据 data

      vue2:把数据放在data中


export default {
  props: {
    title: String
  },
  data () {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
   
  },
  components:{
            "buttonComponent":btnComponent
     },
}
 
}

   vue3:使用setup方法,在组件初始化构造的时候触发

  1. 引入reactive声明数据为响应性数据
  2. 使用setup()方法来返回我们的响应性数据,从而我们的template可以获取这些响应性数据
import { reactive } from 'vue'

export default {
  props: {
    title: String
  },
  setup () {
    const state = reactive({
      username: '',
      password: ''
    })

    return { state }
  }
}

   使用:

<template>
  <div>
    <h2> {{ state.username }} </h2>
  </div>
</template>

5. 生命周期钩子 — Lifecyle Hooks

Vue2--------------vue3
beforeCreate  -> setup()
created       -> setup()
beforeMount   -> onBeforeMount
mounted       -> onMounted
beforeUpdate  -> onBeforeUpdate
updated       -> onUpdated
beforeDestroy -> onBeforeUnmount
destroyed     -> onUnmounted
activated     -> onActivated
deactivated   -> onDeactivated

6.传参不同

   父传子:通过props接收并通过 toRefs转成响应式 toRefs(props)

import { toRefs } from 'vue'
 
setup(props) {
	const { title } = toRefs(props)
 
	console.log(title.value)
	 onMounted(() => {
      console.log('title: ' + props.title)
    })

}

      子传父: 

      在 Vue2 中我们会调用到this.$emit然后传入事件名和参数对象

       vue3中没有this,只能通过setup中的参数传递


setup (props, { attrs, slots, emit }) {
    //          属性     插槽  事件
    const login = () => {
      emit('login', {
        username: state.username,
        password: state.password
      })
    }
}

7. vue3 Teleport瞬移组件

Teleport一般被翻译成瞬间移动组件,"独立组件",

使用:

<template>
<teleport to="#modal">
  <div id="center" v-if="isOpen">
    <h2><slot>this is a modal</slot></h2>
    <button @click="buttonClick">Close</button>
  </div>
</teleport>
</template>


在public文件夹下的index.html中增加一个节点

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <div id="modal"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值