ref

接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象仅有一个 .value property,指向该内部值。
案例
我们这样操作是无法改变message 的值 应为message 不是响应式的无法被vue 跟踪要改成ref

  1. <template>
  2. <div>
  3. <button @click="changeMsg">change</button>
  4. <div>{{ message }}</div>
  5. </div>
  6. </template>
  7. <script setup lang="ts">
  8. let message: string = "我是message"
  9. const changeMsg = () => {
  10. message = "change msg"
  11. }
  12. </script>
  13. <style>
  14. </style>

改为ref
Ref TS对应的接口

  1. interface Ref<T> {
  2. value: T
  3. }

注意被ref包装之后需要.value 来进行赋值

  1. <template>
  2. <div>
  3. <button @click="changeMsg">change</button>
  4. <div>{{ message }}</div>
  5. </div>
  6. </template>
  7. <script setup lang="ts">
  8. import {ref,Ref} from 'vue'
  9. let message:Ref<string> = ref("我是message")
  10. const changeMsg = () => {
  11. message.value = "change msg"
  12. }
  13. </script>
  14. <style>
  15. </style>
  16. //--------------------------------ts两种方式
  17. <template>
  18. <div>
  19. <button @click="changeMsg">change</button>
  20. <div>{{ message }}</div>
  21. </div>
  22. </template>
  23. <script setup lang="ts">
  24. import { ref } from 'vue'
  25. let message = ref<string | number>("我是message")
  26. const changeMsg = () => {
  27. message.value = "change msg"
  28. }
  29. </script>
  30. <style>
  31. </style>

isRef

判断是不是一个ref对象

  1. import { ref, Ref,isRef } from 'vue'
  2. let message: Ref<string | number> = ref("我是message")
  3. let notRef:number = 123
  4. const changeMsg = () => {
  5. message.value = "change msg"
  6. console.log(isRef(message)); //true
  7. console.log(isRef(notRef)); //false
  8. }

shallowRef

创建一个跟踪自身 .value 变化的 ref,但不会使其值也变成响应式的
例子
修改其属性是非响应式的这样是不会改变的

  1. <template>
  2. <div>
  3. <button @click="changeMsg">change</button>
  4. <div>{{ message }}</div>
  5. </div>
  6. </template>
  7. <script setup lang="ts">
  8. import { Ref, shallowRef } from 'vue'
  9. type Obj = {
  10. name: string
  11. }
  12. let message: Ref<Obj> = shallowRef({
  13. name: "小满"
  14. })
  15. const changeMsg = () => {
  16. message.value.name = '大满'
  17. }
  18. </script>
  19. <style>
  20. </style>

例子2
这样是可以被监听到的修改value

  1. import { Ref, shallowRef } from 'vue'
  2. type Obj = {
  3. name: string
  4. }
  5. let message: Ref<Obj> = shallowRef({
  6. name: "小满"
  7. })
  8. const changeMsg = () => {
  9. message.value = { name: "大满" }
  10. }

triggerRef

强制更新页面DOM
这样也是可以改变值的

  1. <template>
  2. <div>
  3. <button @click="changeMsg">change</button>
  4. <div>{{ message }}</div>
  5. </div>
  6. </template>
  7. <script setup lang="ts">
  8. import { Ref, shallowRef,triggerRef } from 'vue'
  9. type Obj = {
  10. name: string
  11. }
  12. let message: Ref<Obj> = shallowRef({
  13. name: "小满"
  14. })
  15. const changeMsg = () => {
  16. message.value.name = '大满'
  17. triggerRef(message)
  18. }
  19. </script>
  20. <style>
  21. </style>

customRef

自定义ref
customRef 是个工厂函数要求我们返回一个对象 并且实现 get 和 set

  1. <script setup lang="ts">
  2. import { Ref, shallowRef, triggerRef, customRef } from 'vue'
  3. function Myref<T>(value: T) {
  4. return customRef((track, trigger) => {
  5. return {
  6. get() {
  7. track()
  8. return value
  9. },
  10. set(newVal: T) {
  11. console.log('set');
  12. value = newVal
  13. trigger()
  14. }
  15. }
  16. })
  17. }
  18. let message = Myref('小满')
  19. const changeMsg = () => {
  20. message.value = '大满'
  21. // triggerRef(message)
  22. }
  23. </script>