您的位置:58编程 > vue3 组合式api Vue 3.0 组合式API

vue3 组合式api Vue 3.0 组合式API

2023-05-20 18:33 VUE3教程

vue3 组合式api Vue 3.0 组合式API

vue3 组合式api Vue 3.0 组合式API

vue3 组合式api

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

#setup

一个组件选项,在创建组件之前执行,一旦 props 被解析,并作为组合式 API 的入口点

  • 入参:
    • {Data} props
    • {SetupContext} context
  • 类型声明

interface Data {
  [key: string]: unknown
}


interface SetupContext {
  attrs: Data
  slots: Slots
  emit: (event: string, ...args: unknown[]) => void
}


function setup(props: Data, context: SetupContext): Data

TIP

若要获取传递给 setup() 的参数的类型推断,请使用 defineComponent 是需要的。

  • 示例:

使用模板:

  <!-- MyBook.vue -->
  <template>
    <div>{{ readersNumber }} {{ book.title }}</div>
  </template>

  
  <script>
    import { ref, reactive } from "vue"

  
    export default {
      setup() {
        const readersNumber = ref(0)
        const book = reactive({ title: "Vue 3 Guide" })

  
        // expose to template
        return {
          readersNumber,
          book
        }
      }
    }
  </script>

使用渲染函数:

  // MyBook.vue

  
  import { h, ref, reactive } from "vue"

  
  export default {
    setup() {
      const readersNumber = ref(0)
      const book = reactive({ title: "Vue 3 Guide" })
      // 请注意,我们需要在这里显式地暴露ref值
      return () => h("div", [readersNumber.value, book.title])
    }
  }

  • 参考:组合式 API setup

#生命周期钩子

可以使用直接导入的 onX 函数注册生命周期钩子:

import { onMounted, onUpdated, onUnmounted } from "vue"


const MyComponent = {
  setup() {
    onMounted(() => {
      console.log("mounted!")
    })
    onUpdated(() => {
      console.log("updated!")
    })
    onUnmounted(() => {
      console.log("unmounted!")
    })
  }
}

这些生命周期钩子注册函数只能在 setup() 期间同步使用,因为它们依赖于内部全局状态来定位当前活动实例 (此时正在调用其 setup() 的组件实例)。在没有当前活动实例的情况下调用它们将导致错误。

组件实例上下文也是在生命周期钩子的同步执行期间设置的,因此在生命周期钩子内同步创建的侦听器和计算属性也会在组件卸载时自动删除。

选项 API 生命周期选项和组合式 API 之间的映射

  • beforeCreate -> use setup()
  • created -> use setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeUnmount -> onBeforeUnmount
  • unmounted -> onUnmounted
  • errorCaptured -> onErrorCaptured
  • renderTracked -> onRenderTracked
  • renderTriggered -> onRenderTriggered
  • 参考:组合式 API 生命周期钩子

#Provide / Inject

provideinject 启用依赖注入。只有在使用当前活动实例的 setup() 期间才能调用这两者。

  • 类型声明

interface InjectionKey<T> extends Symbol {}


function provide<T>(key: InjectionKey<T> | string, value: T): void


// without default value
function inject<T>(key: InjectionKey<T> | string): T | undefined
// with default value
function inject<T>(key: InjectionKey<T> | string, defaultValue: T): T

Vue 提供了一个 InjectionKey 接口,该接口是扩展 Symbol 的泛型类型。它可用于在提供者和消费者之间同步注入值的类型:

import { InjectionKey, provide, inject } from "vue"


const key: InjectionKey<string> = Symbol()


provide(key, "foo") // 提供非字符串值将导致错误


const foo = inject(key) // foo 的类型: string | undefined

如果使用字符串 key 或非类型化 symbols,则需要显式声明注入值的类型:

const foo = inject<string>("foo") // string | undefined

  • 参考

  • Provide / Inject
  • 组合式 API Provide / Inject

#getCurrentInstance

getCurrentInstance 允许访问对高级使用或库创建者有用的内部组件实例。

import { getCurrentInstance } from "vue"


const MyComponent = {
  setup() {
    const internalInstance = getCurrentInstance()


    internalInstance.appContext.config.globalProperties // access to globalProperties
  }
}

getCurrentInstance 仅在安装或生命周期挂钩期间有效。

在安装程序或生命周期挂钩之外使用时,请在setup上调用getCurrentInstance(),并改用该实例。

const MyComponent = {
  setup() {
    const internalInstance = getCurrentInstance() // works


    const id = useComponentId() // works


    const handleClick = () => {
      getCurrentInstance() // doesn"t work
      useComponentId() // doesn"t work


      internalInstance // works
    }


    onMounted(() => {
      getCurrentInstance() // works
    })


    return () =>
      h(
        "button",
        {
          onClick: handleClick
        },
        `uid: ${id}`
      )
  }
}


// also works if called on a composable
function useComponentId() {
  return getCurrentInstance().uid
}
阅读全文
以上是58编程为你收集整理的vue3 组合式api Vue 3.0 组合式API全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  •  什么是XHTML?

    什么是XHTML?

    XHTML 简介XHTML(可扩展超文本标记语言)——是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过语法上更加严格。XHTML...

  •  XHTML 实体参考

    XHTML 实体参考

    像这样的字符在HTML中有特殊的含义,所以这些在文本中是不能使用的。实体是用于符号的术语。键盘上的外部符号,商标或版权等许多...

  •  XHTML 测验
  •  XHTML 测验

    XHTML 测验

    您可以通过 W3SCHOOL 的测验程序来测试您的 XHTML 技能。关于本测验本测验包含20道题,每道题的最长答题时间是20分钟(这是由于...

  •  XHTML高级教程-什么是XHTML格式?

    XHTML高级教程-什么是XHTML格式?

    XHTML格式是文档的结构和样式。格式允许设计者确定外观并创建XHTML文档的样式。本部分熟悉用户使用与XHTML相关联的格式化标签。X...

  • html页面内容居中 HTML 页面内容

    html页面内容居中 HTML 页面内容

    HTML页面内容Article 标签article元素表示自包含HTML文档中的内容。以下代码显示了正在使用的 article 元素。!DOCTYPE HTMLhtml/...

  •  HTML 实例

    HTML 实例

    HTML 实例HTML 基础非常简单的HTML文档HTML 标题HTML 段落HTML 链接HTML 图片实例解析HTML 标题HTML 标题在html源码中插入注释插...

  • html元素有哪些 HTML 元素

    html元素有哪些 HTML 元素

    以下代码显示了一个应用于某些文本的 HTML 元素的简单示例。I like codeweb/code and CSS.起始标记为code,结束标记为/ code。标...

  • htmlurl路径到底具体指什么 HTML URL

    htmlurl路径到底具体指什么 HTML URL

    HTML统一资源定位器 (Uniform Resource Locators) URL 是一个网页地址。URL 可以由字母组成,如 ".cn",或互联网协议(IP)地址...

  • html链接css HTML 链接

    html链接css HTML 链接

    HTML 链接 HTML 使用超级链接与网络上的另一个文档相连。几乎可以在所有的网页中找到链接。点击链接可以从一张页面跳转到另一张...

© 2024 58编程 58biancheng.com 版权所有 联系我们
桂ICP备12005667号-32 Powered by CMS