前提查看一下你的 Vue 版本是否是大于 4.5.0 的。不是的话就得创建vue 2 项目,然后手动升级到 vue3
项目创建有两种方式
创建步骤(命令行创建)
vue create vue3demo
对比 Vue2 中 OPTIONS API,data 和 methods 的定义如下所示
<script>
export default {
data () {
return {
name: '小皮'
}
},
methods: {
}
}
</script>
在 Vue3 中,上述的方式依然可以使用。但是我们今天要使用 Vue3 的 Composition API 完成同样的功能
学习指引:
setup 函数
ref 函数
<template>
<div id="app">
<h2>姓名:{{name}}</h2>
<h2>年龄:
<button type="button" @click="changeAge(-1)">+</button>
{{age}}
<button type="button" @click="changeAge(1)">+</button>
</h2>
<h2>出生年份: (插值表达式实现) {{2020 - age}}</h2>
<h2>出生年份:(计算属性实现)
<button type="button" @click="changeYear(-1)">-</button>
{{year}}
<button type="button" @click="changeYear(1)">+</button>
</h2>
</div>
</template>
<script>
import { ref , computed} from 'vue'
export default {
name: 'App',
setup () {
// 使用 方法 和 对象必须使用响应是对应式的。都必须返回
const name = ref('Hello')
const age = ref(18)
const year = computed({
// 设置 getter 和 setter
get: () => {
return 2020 - age.value
},
set: val => {
age.value = 2020 - val
}
})
function changeAge(val) {
// age 是一个响应式对象,直接 age++ 是错误的
age.value+=val;
}
// 计算属性
function changeYear(val) {
year.value = year.value + val
}
return {name,age,changeAge,year, changeYear}
}
}
</script>
<style>
</style>
上面的代码是不是看起来很冗余,这下我们使用 响应式对象 来简化上面的代码
<template>
<div id="app">
<h2>姓名:{{name}}</h2>
<h2>年龄:
<button type="button" @click="changeAge(-1)">+</button>
{{age}}
<button type="button" @click="changeAge(1)">+</button>
</h2>
<h2>出生年份: (插值表达式实现) {{2020 - age}}</h2>
<h2>出生年份:(计算属性实现)
<button type="button" @click="changeYear(-1)">-</button>
{{year}}
<button type="button" @click="changeYear(1)">+</button>
</h2>
</div>
</template>
<script>
import { reactive , computed, toRefs} from 'vue'
export default {
name: 'App',
setup () {
const data = reactive({
name: '小皮',
age: 18,
year: computed({
// 设置 getter 和 setter
get: () => {
return 2020 - data.age
},
set: val => {
data.age = 2020 - val
}
})
})
function changeAge(val) {
data.age+=val
}
// 计算属性
function changeYear(val) {
data.year = data.year + val
}
// 直接返回 data 是一个响应式的数据,在上面需要使用 data.xxx 属性得到属性,如果需要在上面直接使用属性,可以使用该方式
// 使用 ..toRefs() 方法将一个整体的响应式对象 变成 普通对象,然后在展开(解包)得到 单独的响应式数据
return {...toRefs(data), changeAge, changeYear}
}
}
</script>
<style>
</style>
效果同上图
在父子组件传参中,会使用到如下两个参数
import { reactive , computed, toRefs, watch} from 'vue'
export default {
name: 'App',
// setup 参数
props: {
title: String
},
// context 获取插槽,属性
setup (props, context) {
const data = reactive({
name: '小皮',
age: 18,
year: computed({
// 设置 getter 和 setter
get: () => {
return 2020 - data.age
},
set: val => {
data.age = 2020 - val
}
})
})
// 使用监听器
watch (() => props.title, (newTitle,oldTitle) => {
console.log(newTitle,oldTitle)
context.emit('title-changed')
})
function changeAge(val) {
data.age+=val
}
// 计算属性
function changeYear(val) {
// 响应式对象
data.year = data.year + val
}
return {...toRefs(data), changeAge, changeYear}
}
}
</script>
对比 vue2,我们使用一些内置的方法。Vue3 用一个更大的变化
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有