须知:你仍然可以在Vue3.x中使用vue2的选项式Api写法,但我更建议你选择最新的组成式Api写法
OptionsApi - Vue2.x - 选项式Api
1.限制了自由度,必须按照规定来书写代码,如props,methods,data,computed,watch,各司其职,禁止越界
2.上下文必须使用this
3.生命周期包含beforeCreated()和Created()
CompositionApi - Vue3.x - 组成式Api
1.将代码打碎,允许在setup()函数中自由书写,使代码的分割感进一步降低
2.没有this,统一使用setup()函数中的context参数,由原来的this.getData => context.getData
3.生命周期被setup()入口给替代
4. Tree-Shaking 的目的,使用到什么就引入什么,最后打包也只打包用到的 api
整体来看其实变化不大,使用setup代替了之前的beforeCreate和created,其他生命周期名字有些变化,功能都是没有变化的
//Vue2.x写法
<template>
<div class="name">
<p></p>
<p></p>
</div>
</template>
//Vue3.x
<template>
<div class="name"></div>
<div class="name2"></div>
<div class="name3"></div>
</template>
Vue2.x
export default{
mounted() {
this.getRouter();
},
methods: {
getRouter() {
console.log(this.$route);
console.log(this.$router);
},
},
}
Vue3.x
import { getCurrentInstance } from "vue";
export default {
setup(props, context) {
const { ctx } = getCurrentInstance();
console.log(ctx.$router.currentRoute.value);
},
};
import { useRoute, useRouter } from "vue-router";
export default {
setup(props, context) {
const currRoute = useRoute();
const currRouter = useRouter();
console.log(currRoute);
console.log(currRouter);
},
};
//Vue2.x 中创建 store 实例
export default new Vuex.Store({
// ...
})
//Vue3.x
import Vuex from 'vuex'
export default Vuex.createStore({
state: {
count: 0
},
mutations: {
ADD (state) {
state.count++
}
},
actions: {
add ({ commit }) {
commit('ADD')
}
},
modules: {
}
})
Vue3.x组件中使用 - 两种方式
<template>
<div class="home">
<p>{{count}}</p>
<button @click="add">增加</button>
</div>
</template>
<script>
import { computed } from 'vue'
import { useStore } from 'vuex'
export default {
setup () {
const store = useStore()
const count = computed(() => store.state.count)
const add = () => {
store.dispatch('add')
}
return {
count,
add
}
}
}
</script>
import {getCurrentInstance} from 'vue'
// ...
const store = getCurrentInstance().ctx.$store
export default{
setup(){
const count=ref(0);
const state=reactive({
count:0
})
}
}
ref
reactive
总结:通过比较两属性的不同点根据具体需求合理的使用
1.如果需要组件初始化时执行,则用watchEffect
2.如果需要获取新值旧值,则使用watch
exprot default {
props: {
title: String
},
mounted() {
console.log(this.title);
}
}
//通过setup中的内置参数进行调用,舍弃了之前的this调用方式
exprot default {
props: {
title: String
},
//props 组件传入的属性
setup(props,context) {
console.log(props.title) // 响应式
}
}
// vue页面中引入,该方法会将Mixins中的所有方法和属性一并引入
import mixin from 'mixin.js'
export default{
data(){},
mixins: [mixin]
}
// vue页面中引入
import mixin from 'mixin.js'
//第一种写法 - 利用ES6解构写法,只引用需要的部分
export default{
setup(){
const { count, plusOne, hello } = mixin()
hello()
console.log(count.value, plusOne.value)
}
}
// 第二种写法 - 调用组件中的局部变量
export default {
setup () {
// 某个局部值的合成函数需要用到
const myLocalVal = ref(0);
// 它必须作为参数显式地传递
const { ... } = mixin(myLocalVal);
}
}
<template></template>
export default{
emits:['backData'],
setup(props,{emit}){
function back(){
emit('backData');
}
}
}
1 、对于业务经常变动的业务项目,不适合用 TypeScript,因为快速才是此类需求最重要的。
2 、对于工具类 /基础设施类项目,最好上 TypeScript 。
根据编写代码使用的语言方式不同,选择合适的模块
<template>
<button @click="inc">{{ count }}</button>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
const inc = () => count.value++
</script>
import { ref } from 'vue'
export default {
setup() {
const count = ref(0)
const inc = () => count.value++
return {
count,
inc,
}
},
}
Vue2.x Object.defineProperty
const data= {
name: 'xiaoming',
sex: '男'
}
// 遍历对象,对其属性值进行劫持
Object.keys(data).forEach(key => {
let val = data[key]
Object.defineProperty(data, key, {
enumerable: true, // 该属性可被枚举
configurable: true, // 该属性可以被删除以及属性描述符可以被改变
get () {
console.log(`属性值${data}当前值为${val}`)
return val
},
set (newValue) {
console.log(`监听到属性值${data}由${val}变为${newValue}`)
val = newValue
}
})
});
data.name // 属性值name当前值为zhangsan
data.name = 'lisi' // 监听到属性值name由zhangsan变为lisi
data.age // 属性值age当前值为18
data.age = 25 // 监听到属性值age由18变为25
Vue3.x Proxy(ES6)
let obj = {
a: 1,
b: 2,
}
const p = new Proxy(obj, {
get(target, key, value) {
if (key === 'c') {
return '我是自定义的一个结果';
} else {
return target[key];
}
},
set(target, key, value) {
if (value === 4) {
target[key] = '我是自定义的一个结果';
} else {
target[key] = value;
}
}
})
console.log(obj.a) // 1
console.log(obj.c) // undefined
console.log(p.a) // 1
console.log(p.c) // 我是自定义的一个结果
obj.name = '李白';
console.log(obj.name); // 李白
obj.age = 4;
console.log(obj.age); // 4
p.name = '李白';
console.log(p.name); // 李白
p.age = 4;
console.log(p.age); // 我是自定义的一个结果
console.log(import.meta.env);
Vue2.x
Object.assign(this.$data, this.$options.data());
Vue3.x
const initState = () => {
return {
a: 1
}
}
const state = reactive(initState())
const resetState = () => {
Object.assign(state, initState())
}
如您已了解完Vue3.x的新特性,则推荐您看以下文章,方便您快速入手Vue3项目