聚水潭
118.20M · 2026-03-13
在vue3中,若没有学好setup函数,后面学习vue3将会越学越乱。 setup是一个函数,它在vue3是一个新的配置项,是组合式语法 (Composition API)表演的舞台,组件中所用的属性、计算属性、方法、监视等等,均需要在setup中配置。 setup特性:
上节 vue3与vue2语法优劣对比中,vue2语法是选项式(OptionsAPI),如下图:
既然vue3是组合式语法 (Composition API),它就不应该有data,methods,而是所有内容都合并在一起,删除data与methos,建立setup函数,定义数据与方法,流程如下
<template>
<div class="car">
<h2>品牌:{{ name }}</h2>
<h2>价格:{{ price }}万</h2>
<button @click="changeName">修改品牌</button>
<button @click="changePrice">修改价格</button>
<button @click="showLowPrice">查看低价</button>
</div>
</template>
<script lang="ts">
export default{
name: 'Car',
setup() {
console.log(this)
let name = '奔驰';
let price = 100;
let lowPrice = 80;
function changeName() {
name = '宝马'
console.log(name)
}
function changePrice() {
price += 10;
console.log(price)
}
function showLowPrice() {
alert(lowPrice);
}
return { name, price, changeName, changePrice, showLowPrice }
}
}
</script>
浏览器输入,效果如下:
在vue组件中,常常有人将vue2语法与vue3语法混着写,既在data定义数据,又在setup定义数据。当使用函数访问数据中,问题出现。setup数据能否访问data数据,反之亦能否?页面属性与方法非常混乱,所以在vue3中,不要去写vue2语法,实在搞不定再去写。
继上面的事例,给car新增一个color颜色属性,用vue2语法编写
<template>
<div class="car">
<h2>品牌:{{ name }}</h2>
<h2>价格:{{ price }}万</h2>
<h2>颜色:{{ color }}</h2>
<button @click="changeName">修改品牌</button>
<button @click="changePrice">修改价格</button>
<button @click="showLowPrice">查看低价</button>
<button @click="changeColor">修改颜色</button>
</div>
</template>
<script lang="ts">
export default{
name: 'Car',
data() {
return {
color:'红色'
}
},
methods: {
changeColor() {
this.color='蓝色'
}
},
setup() {
let name = '奔驰';
let price = 100;
let lowPrice = 80;
function changeName() {
name = '宝马'
console.log(name)
}
function changePrice() {
price += 10;
console.log(price)
}
function showLowPrice() {
console.log(lowPrice)
}
return { name, price, changeName, changePrice, showLowPrice }
}
}
</script>
在浏览器访问,发现可以共存,且color是响应式数据。如图:
在data中修改color默认赋值为name+'color',修改methods函数changeColor,让它访问name属性,调用修改价格函数
data() {
return {
color:name+'color'
}
},
methods: {
changeColor() {
this.color = '蓝色'
console.log(this.name);
this.changePrice();
}
},
在浏览器访问,效果如下图
<template>
<div class="car">
<h2>品牌:{{ name }}</h2>
<h2>价格:{{ price }}万</h2>
<h2>颜色:{{ color }}</h2>
<button @click="changeName">修改品牌</button>
<button @click="changePrice">修改价格</button>
<button @click="showLowPrice">查看低价</button>
<button @click="changeColor">修改颜色</button>
</div>
</template>
<script lang="ts">
export default{
name: 'Car',
data() {
return {
color: this.name + '红色'
}
},
methods: {
changeColor() {
this.color = '蓝色'
console.log(this.name);
this.changePrice();
}
},
setup() {
let name = '奔驰';
let price = 100;
let lowPrice = 80;
function changeName() {
name = '宝马'
console.log(name)
}
function changePrice() {
price += 10;
console.log(price)
}
function showLowPrice() {
console.log(lowPrice)
}
return { name, price, changeName, changePrice, showLowPrice }
}
}
</script>
set函数需要返回值,否则模版中无法访问setup定义的属性
setup() {
let name = '奔驰';
return { name }
}
如若新增一个属性weight重量,,就需要返回weight属性
setup() {
let name = '奔驰';
return { name,weight }
}
当有许多个属性时,代码很繁琐,且return { name,weight }是无必要的。只需要在script标签中添加setup可优雅解决
<template>
<div class="car">
<h2>品牌:{{ name }}</h2>
<button @click="changeName">修改品牌</button>
</div>
</template>
<script setup lang="ts">
let name = '奔驰';
function changeName() {
name = '宝马'
}
</script>
注意script有setup标识,在setup里声明的属性和方法,模版都可以访问。