1. vue2和vue3双向数据绑定原理发生了改变
vue2 的双向数据绑定是利用ES5 的一个 API Object.definePropert()
对数据进行劫持 结合 发布订阅模式的方式来实现的。
vue3 中使用了 es6 的 Proxy
API 对数据代理。
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方法,在组件初始化构造的时候触发
- 引入reactive声明数据为响应性数据
- 使用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>