SetUp(组合式API)
1.setup函数中的this是undefined,vue3中已经弱化了this
2.数据,原来是写在data中的,此时的name、age、tel都不是响应式的数据
1 | setup() { |
3. setup的返回值也可以是一个渲染函数,return ()=>’哈哈’
4.setup与vue2中的data和methods可以共存,并且data能读取到setup里面的数据,但是setup不能读取到data中的数据(由于声明后期引起的)
setup的在生命周期中比data和methods先定义,所有data中可以使用setup中的数据。(但是不建议在vue3中使用)
1 | data() { |
5.setup语法糖
1 | <script lang="ts"> |
改写为:
1 | <script lang="ts" setup name = 'Person'> |
6.响应式数据
ref创建-基本类型的响应式数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<script lang="ts" setup name = 'Person'>
import { ref } from "vue"; //ref创建响应式数据
let name = ref("张三"); //ref创建响应式数据
let age = ref(18); //ref创建响应式数据
let tel = "1245645452";
// 方法
function changeName() {
name.value = "zhangsan";
}
function changeAge() {
age.value += 1;
}
function showtel(){
alert('电话是:'+tel)
}
</script>rective创建-对象类型的响应式数据(只能)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38<template>
<div class="car">
<h2>一辆{{ car.brand }}车,价值{{ car.price }}万</h2>
<button @click="changePrice">修改汽车的价格</button>
<br />
<h2>游戏列表:</h2>
<ul>
<li v-for="g in games" :key="g.id">{{ g.name }}</li>
</ul>
<button @click="changefirstGameName">修改第一个</button>
</div>
</template>
<script lang="ts" setup name = 'Car'>
import { reactive } from "vue";
//数据
let car1 = { brand: "奔驰", price: 100 };
let car = reactive({ brand: "奔驰", price: 100 });
let games =reactive([
{ id: "aysdytfsatre1", name: "王者荣耀" },
{ id: "aysdytfsatre2", name: "原神" },
{ id: "aysdytfsatro3", name: "三国志" },
])
console.log("car:", car);
console.log("car1", car1);
//方法
function changePrice() {
car.price += 10;
}
function changefirstGameName(){
games[0].name = '吃鸡'
}
</script>
ref_对象类型的响应式数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import { ref,reactive} from "vue";
//数据
let car1 = { brand: "奔驰", price: 100 };
let car = ref({ brand: "奔驰", price: 100 });
let games =ref([
{ id: "aysdytfsatre1", name: "王者荣耀" },
{ id: "aysdytfsatre2", name: "原神" },
{ id: "aysdytfsatro3", name: "三国志" },
])
let obj = reactive({x:999})
console.log("obj:",obj)
console.log("car:", car);
console.log("car1", car1);
//方法
function changePrice() {
car.value.price += 10;
}
function changefirstGameName(){
games.value[0].name = '吃鸡'
}ref与reactive对比
宏观角度:
1
21. ref用来定义:基本类型数据、对象类型数据;
2. reactive用来定义:对象类型数据。区别:
1
21. ref 创建的变量必须使用.value(可以使用volar插件自动添加.value )。
2. reactive重新分配一个新对象,会失去响应式(可以使用0bject.assign去整体替换)。使用原则:
1
2
31.若需要一个基本类型的响应式数据,必须使用ref。
2.若需要一个响应式对象,层级不深, ref . reactive都可以。
3.若需要一个响应式对象,且层级较深,推荐使用reactive。
6.toRefs与toRef
作用:将一个响应式对象中的每一个属性,转换为ref 对象。
备注: toRefs 与toRef功能一致,但toRefs可以批量转换。
1 | import { toRefs, reactive } from "vue"; //ref创建响应式数据 |
7.计算属性(computed有缓存,普通方法没有缓存)
1 | <template> |