coder-Tom

一个喜欢代码, 音乐,读书, 跑步, 记录生活的程序员

0%

vue3_ref

vue3_ref的用法解析

ref是干什么的?

我们知道, vue2是这样配置响应式的:

image-20221015081038182

而在vue3中, 我们可以使用ref来配置响应式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<template>

<div>
{{someone}}
<button @click="change">按钮</button>
</div>


</template>

<script setup lang = 'ts'>
import { ref, reactive} from 'vue'
const someone =ref( {name : '小马', age : 18})
const change = () => {
someone.value.name = '小杨'
console.log(someone)
}
</script>
<style scoped>

</style>

这里有几个关键的步骤,

1
import { ref, reactive} from 'vue'

我们在修改值的时候: 需要加上.value, 这一步容易被忽略:

1
someone.value.name = '小杨'

官方文档是这样说的:

ref() takes the argument and returns it wrapped within a ref object with a .value property:

翻译一下:

Ref ()获取参数并将其包装在具有. value 属性的 ref 对象中返回,如果不适用.value的话, 会报错:

image-20221015083241387

isRef

isRef用于判断一个对象是不是Ref对象, 它的返回值是一个布尔值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<template>

<div>
{{someone}}
<button @click="change">按钮</button>
</div>

</template>

<script setup lang = 'ts'>
import { ref,isRef, reactive} from 'vue'
const someone = ref({name: '小桃', age : 20})
const otherone = {name : '大肠', age: 21}
const change = () => {
console.log(isRef(someone))
console.log(isRef(otherone));

}
</script>
<style scoped>

</style>

image-20221015093729642

当我点击按钮之后,控制台返回下面的结果:

image-20221015093819007

shallowRef

这个是做浅层响应式的, ref是做深层次的:

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
<template>

<div>
ref:{{someone}}
<br>
shallowRef: {{otherone}}
<br>
<button @click="change">按钮</button>
</div>

</template>

<script setup lang = 'ts'>
import { ref,shallowRef, reactive} from 'vue'
const someone = ref({name: '小桃', age : 20})
const otherone = shallowRef({name : '大肠', age: 21})
const change = () => {
otherone.value.name = '大肠2'
console.log(otherone)

}
</script>
<style scoped>

</style>

执行上面的代码:

image-20221015094349461

在页面中没有发生变化, 但是在控制台中发生了变化, 这个就是shallowRef的作用, 做浅层响应, 但是如果你在change函数中这个写:

1
2
3
4
5
6
7
const change = () => {
otherone.value = {
name : '大肠2'
}
console.log(otherone)

}

这个时候,视图就会更新了, 因为你可以使用value去让它响应

注意:ref和shallowRef是不能一块去写的, 它们会相互影响

triggerRef

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
<template>

<div>
ref:{{someone}}
<br>
shallowRef: {{otherone}}
<br>
<button @click="change">按钮</button>
</div>

</template>

<script setup lang = 'ts'>
import { ref,shallowRef, reactive,triggerRef} from 'vue'
const someone = ref({name: '小桃', age : 20})
const otherone = shallowRef({name : '大肠', age: 21})
const change = () => {
otherone.value.name = '大肠2'
triggerRef(otherone)

}
</script>
<style scoped>

</style>

以上方法,也可以通过triggerRef来实现 ,triggerRef会强制更新依赖

ref获取dom元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<template>

<div ref = 'dom'>
我是一个dom元素

</div>
<button @click="change">按钮</button>
</template>

<script setup lang = 'ts'>
import { ref,shallowRef, reactive,triggerRef} from 'vue'
const dom = ref<HTMLDivElement>()
const change = () => {
console.log(dom.value?.innerText);


}
</script>
<style scoped>

</style>

运行结果:

image-20221015100200481