vue3-reactive
宁静致远 7/17/2020 vue3
# reactive -- 做对象的响应式
用来绑定复杂的数据类型 组数、对象
<script setup lang="ts">
<script setup lang="ts">
import { reactive } from 'vue';
let a:number[] = [1, 2, 3, 4, 5]
let arr:number[] = reactive([])
let obj = reactive({
name: 'xxx'
})
arr = a
console.log(arr);
obj.name = 'yyy'
console.log(obj);
</script>
<template>
<div>
<div>{{arr}}</div>
<div>{{obj}}</div>
</div>
</template>
<style scoped>
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
注意, 异步或者接口请求,直接赋值页面响应不到UI变化
<script setup lang="ts">
import { reactive } from 'vue';
let a: number[] = [1, 2, 3, 4, 5]
let arr: number[] = reactive([])
setTimeout(() => {
arr = a
console.log(arr);
}, 1000);
</script>
<template>
<div>
<div>{{ arr }}</div>
</div>
</template>
<style scoped>
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
修改为
<script setup lang="ts">
import { reactive } from 'vue';
let a: number[] = [1, 2, 3, 4, 5]
let arr: number[] = reactive([])
setTimeout(() => {
arr.push(...a)
console.log(arr);
}, 1000);
</script>
<template>
<div>
<div>{{ arr }}</div>
</div>
</template>
<style scoped>
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<script setup lang="ts">
import { reactive } from 'vue';
type ListType = {
list: number[]
}
let arr = reactive<ListType>({
list: []
})
setTimeout(() => {
let a: number[] = [1, 2, 3, 4, 5]
arr.list = a
console.log(arr.list);
}, 1000);
</script>
<template>
<div>
<div>{{ arr.list }}</div>
</div>
</template>
<style scoped>
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# readonly
接受一个对象(响应函或纯对象)或ref, 返回原始对象的只读代理
<script setup lang="ts">
import { reactive, readonly } from 'vue';
let obj = reactive({
name: 'xxx'
})
let copyObj = readonly(obj)
copyObj.name = 'yyy' // 只读属性,不可修改
</script>
<template>
<div>
</div>
</template>
<style scoped>
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# shallowReactive
响应式代理,在dom挂载之前执行会被生效都是响应式,如果是在dom 挂载之后,只会对浅层的数据做试图更新,再深层的数据只会变化值,不会改变试图
<script setup lang="ts">
import { shallowReactive } from 'vue';
let obj = {
a: 'xxx',
b: {
c: {
d: 2
}
}
}
const state = shallowReactive(obj)
const handleClick1 = () => {
state.a = 'a被改变了'
}
const handleClick2 = () => {
state.b.c.d = 3
}
</script>
<template>
<div>
{{state}}
<button @click="handleClick1">浅层数据更新</button>
<button @click="handleClick2">深层数据更新</button>
</div>
</template>
<style scoped>
</style>
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
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