举报投诉联系我们 手机版 热门标签 VUE中文网
您的位置:VUE中文网 > vue3响应式api Vue 3.0 响应性API Refs

vue3响应式api Vue 3.0 响应性API Refs

2023-02-24 01:17 VUE3教程

vue3响应式api Vue 3.0 响应性API Refs

vue3响应式api

Vue3响应式API是Vue3中新增的一种API,它可以帮助开发者更好地管理数据流,并且可以更快地实现数据的双向绑定。

Vue3响应式API的核心是响应式对象(Reactive Object),它是一个特殊的JavaScript对象,其中包含了一些特殊的属性。这些特殊的属性会被Vue3监听,当这些属性发生变化时,Vue3会自动重新渲染页面。

使用Vue3响应式API时,我们需要使用ref函数来创建一个Reactive Object。ref函数有两个参数:value 和 shallow。value表示要创建Reactive Object的原始数据,shallow表示是否将原始数据作为Reactive Object的直接子元素。如果shallow被设置为true,则原始数据将作为Reactive Object的直接子元素而不会再进行递归处理。

const reactiveObject = ref({ 
    name: 'John', 
    age: 20 
}, true);

上面代码中我们使用ref函数创建了一个Reactive Object,并将shallow设置为true。这意味着name 和 age 这两个字段将作为reactiveObject 的直接子元素而不会再进行递归处理。

此外,Vue3还新增了computed函数来帮助我们处理复杂的逻辑。computed函数也有2个参数getter 和 setter (如有必要也可以省略setter )。getter 用来读取reactiveObject 中字段的值并返回新的对象或者新的字段值;setter 用来保存reactiveObject 中字段的新值并根据情况重新render 页面。

const fullName = computed(() => { 
    return reactiveObject.value.name + ' ' + reactiveObject.value.age; 
}); 

上面代码中我们使用computed函数创建了一个fullName 字段(即fullName 是reactiveObject 的子元素之一 ) ,该字段由name 和 age 这2个字段所生成。当name 或者age 字

本节例子中代码使用的单文件组件语法

#ref

接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象具有指向内部值的单个 property .value

示例:

const count = ref(0)
console.log(count.value) // 0


count.value++
console.log(count.value) // 1

如果将对象分配为 ref 值,则可以通过 reactive 方法使该对象具有高度的响应式。

类型声明:

interface Ref<T> {
  value: T
}


function ref<T>(value: T): Ref<T>

有时我们可能需要为 ref 的内部值指定复杂类型。我们可以通过在调用 ref 来覆盖默认推断时传递一个泛型参数来简洁地做到这一点:

const foo = ref<string | number>("foo") // foo"s type: Ref<string | number>


foo.value = 123 // ok!

如果泛型的类型未知,建议将 ref 转换为 Ref<T>

function useState<State extends string>(initial: State) {
  const state = ref(initial) as Ref<State> // state.value -> State extends string
  return state
}

#unref

如果参数为 ref,则返回内部值,否则返回参数本身。这是 val = isRef(val) ? val.value : val

function useFoo(x: number | Ref<number>) {
  const unwrapped = unref(x) // unwrapped 确保现在是数字类型
}

#toRef

可以用来为源响应式对象上的 property 性创建一个 ref。然后可以将 ref 传递出去,从而保持对其源 property 的响应式连接。

const state = reactive({
  foo: 1,
  bar: 2
})


const fooRef = toRef(state, "foo")


fooRef.value++
console.log(state.foo) // 2


state.foo++
console.log(fooRef.value) // 3

当您要将 prop 的 ref 传递给复合函数时,toRef 很有用:

export default {
  setup(props) {
    useSomeFeature(toRef(props, "foo"))
  }
}

#toRefs

将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的ref

const state = reactive({
  foo: 1,
  bar: 2
})


const stateAsRefs = toRefs(state)



// ref 和 原始property “链接”
state.foo++
console.log(stateAsRefs.foo.value) // 2


stateAsRefs.foo.value++
console.log(state.foo) // 3

当从合成函数返回响应式对象时,toRefs 非常有用,这样消费组件就可以在不丢失响应性的情况下对返回的对象进行分解/扩散:

function useFeatureX() {
  const state = reactive({
    foo: 1,
    bar: 2
  })


  // 逻辑运行状态


  // 返回时转换为ref
  return toRefs(state)
}


export default {
  setup() {
    // 可以在不失去响应性的情况下破坏结构
    const { foo, bar } = useFeatureX()


    return {
      foo,
      bar
    }
  }
}

#isRef

检查值是否为ref对象。

#customRef

创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制。它需要一个工厂函数,该函数接收 tracktrigger 函数作为参数,并应返回一个带有 getset 的对象。

  • 使用 v-model 使用自定义 ref 实现 debounce 的示例:

  <input v-model="text" />

  function useDebouncedRef(value, delay = 200) {
    let timeout
    return customRef((track, trigger) => {
      return {
        get() {
          track()
          return value
        },
        set(newValue) {
          clearTimeout(timeout)
          timeout = setTimeout(() => {
            value = newValue
            trigger()
          }, delay)
        }
      }
    })
  }

  
  export default {
    setup() {
      return {
        text: useDebouncedRef("hello")
      }
    }
  }

Typing:

function customRef<T>(factory: CustomRefFactory<T>): Ref<T>


type CustomRefFactory<T> = (
  track: () => void,
  trigger: () => void
) => {
  get: () => T
  set: (value: T) => void
}

#shallowRef

创建一个 ref,它跟踪自己的 .value 更改,但不会使其值成为响应式的。

const foo = shallowRef({})
// 改变 ref 的值是响应式的
foo.value = {}
// 但是这个值不会被转换。
isReactive(foo.value) // false

参考:正在将独立的响应式值创建为 refs

#triggerRef

手动执行与 shallowRef](#shallowref) 关联的任何效果。

const shallow = shallowRef({
  greet: "Hello, world"
})


// 第一次运行时记录一次 "Hello, world"
watchEffect(() => {
  console.log(shallow.value.greet)
})


// 这不会触发作用,因为 ref 很浅层
shallow.value.greet = "Hello, universe"


// 记录 "Hello, universe"
triggerRef(shallow)

参考计算和侦听 - watchEffect

阅读全文
以上是VUE中文网为你收集整理的vue3响应式api Vue 3.0 响应性API Refs全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • vue3组合式api太强了 Vue 3.0 组合式API

    vue3组合式api太强了 Vue 3.0 组合式API

    2023-02-27 VUE3教程

    本节例子中代码使用的单文件组件语法#setup一个组件选项,在创建组件之前执行,一旦 props 被解析,并作为组合式 API 的入口点入...

  • vue自定义指令实现 Vue 3.0 自定义指令

    vue自定义指令实现 Vue 3.0 自定义指令

    2023-02-27 VUE3教程

    #简介除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要...

  • vue 3.0 teleport

    vue 3.0 teleport

    2023-02-26 VUE3教程

    Vue 鼓励我们通过将 UI 和相关行为封装到组件中来构建 UI。我们可以将它们嵌套在另一个内部,以构建一个组成应用程序 UI 的树。...

  • vue插件大全 Vue 3.0 插件

    vue插件大全 Vue 3.0 插件

    2023-02-23 VUE3教程

    插件是自包含的代码,通常向 Vue 添加全局级功能。它可以是公开 install() 方法的 object,也可以是 function插件的功能范围没有...

  • vue3.0入门 Vue 3.0 基础

    vue3.0入门 Vue 3.0 基础

    2023-02-25 VUE3教程

    Web 可访问性 (也称为 a11y) 是指创建可供任何人使用的网站的实践方式——无论是身患某种障碍、通过慢速的网络连接访问、使用老...

© 2024 VUE中文网 vue88.com 版权所有 联系我们