vue3 Composition API (组合式API)

组合式 API 是一系列 API 的集合,使我们可以使用函数而不是声明选项的方式书写 Vue 组件。它是一个概括性的术语。

一、setup

一个组件选项,在组件被创建之前,props 被解析之后执行。它是组合式 API 的入口。
setup 函数是个新的入口函数,相当于 vue2.x 中 beforeCreate 和 created,在 beforeCreate 之后 created 之前执行。

起初 Vue3.0 暴露变量必须 return 出来,template中才能使用;
这样会导致在页面上变量会出现很多次。
很不友好,vue3.2只需在script标签中添加setup。
可以帮助我们解决这个问题。

组件只需引入不用注册,属性和方法也不用返回,
也不用写setup函数,也不用写export default ,
甚至是自定义指令也可以在我们的template中自动获得。

1)return 方法

<template>
  <div class="app-container">
    {{valueString}} 
  </div>
</template>

<script lang="ts">
import {
  defineComponent,
  reactive,
  toRefs,
} from "vue";

// TIP: 若要对传递给 setup() 的参数进行类型推断,你需要使用 defineComponent。
export default defineComponent({
  setup() {
    const state = reactive({
      rows: {},
      dialog: {
        open: false,
        title: "",
      },
      valueString:"内容",
    });
    return {
      ...toRefs(state),
    };
  },
});
</script>

2)script标签中添加setup

<template>
  <div class="app-container">
    {{valueString}}
    <!-- 直接使用组件 -->
    <Info ref="infoRefs" />  
  </div>
</template>

<script lang="ts" setup>
  
  import Info from "./component/info.vue"; // 引入组件
  // 响应式
  const valueString:String = "内容";
  
</script>

二、getCurrentInstance

getCurrentInstance 支持访问内部组件实例。
访问实例上下文,获取当前组件的实例、上下文等

1)对象及方法

import { getCurrentInstance } from 'vue';
// 获取当前组件实例
const instance = getCurrentInstance();

// 获取当前组件的上下文,下面两种方式都能获取到组件的上下文。
const { ctx }  = getCurrentInstance();  //  方式一,这种方式只能在开发环境下使用,生产环境下的ctx将访问不到
const { proxy }  = getCurrentInstance();  //  方式二,此方法在开发环境以及生产环境下都能放到组件上下文对象(推荐)
// ctx 中包含了组件中由ref和reactive创建的响应式数据对象,以及以下对象及方法;
proxy.$attrs
proxy.$data
proxy.$el
proxy.$emit
proxy.$forceUpdate
proxy.$nextTick
proxy.$options
proxy.$parent
proxy.$props
proxy.$refs
proxy.$root
proxy.$slots
proxy.$watch

waring:

getCurrentInstance 只暴露给高阶使用场景,典型的比如在库中。
强烈反对在应用的代码中使用 getCurrentInstance。
请不要把它当作在组合式 API 中获取 this 的替代方案来使用。

2)使用

getCurrentInstance 只能在 setup 或生命周期钩子中调用。
如需在 setup 或生命周期钩子外使用,请先在 setup 中调用 getCurrentInstance() 获取该实例然后再使用。


<el-button type="primary" @click="submitForm">确定</el-button>

<script lang="ts">
import {
  defineComponent,
  onMounted,
  reactive,
  toRefs,
  getCurrentInstance,
} from "vue";  

export default defineComponent({
  emits: ["reloadList"], // 子组件执行父组件方法
  setup() {
    const state = reactive({
      rows: {},
      dialog: {
        open: false,
        title: "",
      },
    });
    const { proxy } = getCurrentInstance() as any; //有效
    const Instance = getCurrentInstance(); //有效
    // 点击事件
    const submitForm = (): void => {
      console.log("Instance", Instance); // 有效
      getCurrentInstance(); // 无效
      proxy.$emit("reloadList", "传值的内容"); 
    };
    // 生命周期
    onMounted(() => {
      getCurrentInstance(); // 有效
    });
    return {
      handleAdd,
      submitForm,
      form,
      ...toRefs(state),
    };
  },
});
</script>

三、生命周期钩子

这些生命周期钩子注册函数只能在 setup() 期间同步使用,因为它们依赖于内部的全局状态来定位当前活动的实例 (此时正在调用其 setup() 的组件实例)。在没有当前活动实例的情况下,调用它们将会出错。
组件实例的上下文也是在生命周期钩子的同步执行期间设置的,因此,在生命周期钩子内同步创建的侦听器和计算属性也会在组件卸载时自动删除。

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

beforeCreate -> 使用 setup()

created -> 使用 setup()

beforeMount -> onBeforeMount

mounted -> onMounted

beforeUpdate -> onBeforeUpdate

updated -> onUpdated

beforeUnmount -> onBeforeUnmount

unmounted -> onUnmounted

errorCaptured -> onErrorCaptured

renderTracked -> onRenderTracked

renderTriggered -> onRenderTriggered

activated -> onActivated

deactivated -> onDeactivated

四、Provide / Inject 依赖注入

使我们可以在使用响应性 API 时,利用 Vue 的依赖注入系统。
provide 和 inject 启用类似于 2.x provide / inject 选项的依赖项注入。
两者都只能在 setup() 当前活动实例期间调用。

1)provide

provide 函数定义两个参数:
provide( name,value )
name:定义提供 property 的 name 。
value :property 的值。

**eg:**父组件传递参数 provide(“row”, 内容); // 父组件传值

import { provide } from "vue"
 
export default {
  setup(){
    provide("row", isAdoptOptions); //  (有效)
    
   // 点击详情向子组件提供单条数据
   const handleInfo = (row: object) => {
      proxy.$refs.infoRefs.handleInfo(row);
      provide("row", isAdoptOptions); // 无效 接收的为undefined
   };
  }
}

2)inject

inject 函数接收两个参数:
inject(name,default)
name:接收 provide 提供的属性名。
default:设置默认值,可以不写,是可选参数。【如果未提供默认值,并且在 Provide 上下文中找不到该属性,则 inject 返回 undefined。】

**eg:**子组件接收参数 inject(‘row’)

import { inject } from "vue"
 
export default {
  setup(){
    const rowsValue = inject('row')
    onMounted(() => {
      console.log('rowsValue',rowsValue)
    });
    return {
      rowsValue
    }
  }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3的Composition API引入了一种新的方式来解决Vue 2中使用Mixins带来的一些问题。下面是关于如何替换Vue Mixins的一些重要信息: 1. 组合式APIComposition API允许我们使用函数来组织和复用代码逻辑,而不是通过将代码段混入到组件中的方式。这使得逻辑更清晰,更易于维护和测试。 2. setup函数:在Vue 3的组件中,我们需要使用一个新的函数叫做setup函数来替代Vue 2中的created、mounted等生命周期函数。setup函数在创建组件实例时执行,并且可以返回一个对象,包含组件中需要使用的数据、方法和生命周期钩子。 3. Composables:组合式API还引入了一种叫做composables的概念,它可以作为可重用的逻辑单元,用于将代码逻辑组织为一种更灵活的方式。我们可以创建自己的composables,并在多个组件中使用它们,从而实现代码的复用和解耦。 4. 冲突解决:在Vue 2中,当使用多个Mixins时,可能会发生命名冲突的情况。而在Vue 3的组合式API中,由于代码的逻辑被组织为函数,这种冲突的情况更容易避免,并且提供了更好的可读性和维护性。 总之,Vue 3的组合式API提供了一种更强大和灵活的方式来组织和复用代码逻辑,替代了Vue 2中使用Mixins的方式。它通过引入setup函数和composables的概念,解决了Mixins可能带来的一些问题,并提供了更好的可读性、维护性和冲突解决能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值