VUE3 函数的声明和使用

在了解了响应式数据如何使用之后,接下来就要开始了解函数了。

在 Vue 2 ,函数通常是作为当前组件实例上的方法在 methods 里声明,然后再在 mounted 等生命周期里调用,或者是在模板里通过 Click 等行为触发,由于组件内部经常需要使用 this 获取组件实例,因此不能使用箭头函数。

export default {
  data: () => {
    return {
      num: 0,
    }
  },
  mounted: function () {
    this.add()
  },
  methods: {
    // 不可以使用 `add: () => this.num++`
    add: function () {
      this.num++
    },
  },
}

在 Vue 3 则灵活了很多,可以使用普通函数、 Class 类、箭头函数、匿名函数等等进行声明,可以将其写在 setup 里直接使用,也可以抽离在独立的 .js / .ts 文件里再导入使用。

需要在组件创建时自动执行的函数,其执行时机需要遵循 Vue 3 的生命周期,需要在模板里通过 @click、@change 等行为触发,和变量一样,需要把函数名在 setup 里进行 return 出去。

下面是一个简单的例子,方便开发者更直观地了解:

<template>
  <p>{{ msg }}</p>

  <!-- 在这里点击执行 `return` 出来的方法 -->
  <button @click="updateMsg">修改MSG</button>
</template>

<script lang="ts">
import { defineComponent, onMounted, ref } from 'vue'

export default defineComponent({
  setup() {
    const msg = ref<string>('Hello World!')

    // 这个要暴露给模板使用,必须 `return` 才可以使用
    function updateMsg() {
      msg.value = 'Hi World!'
    }

    // 这个要在页面载入时执行,无需 `return` 出去
    const init = () => {
      console.log('init')
    }

    onMounted(() => {
      init()
    })

    return {
      msg,
      changeMsg,
    }
  },
})
</script>

<think>好的,用户问的是如何在Vue3声明函数的最佳实践。我需要结合提供的引用资料来组织答案。首先,系统指令要求用中文,数学公式用$...$,但这里可能不太需要数学公式,不过得注意格式。用户提供的引用中有几个关于Vue3的组合式函数、权限控制函数式调用组件的内容,应该重点参考这些。 首先,Vue3的组合式API是声明函数的核心,尤其是在setup或<script setup>中。需要提到使用refreactive创建响应式数据,以及如何封装逻辑到组合式函数中,如引用[1]提到的VueUse的例子,说明将非响应式API转为响应式的方法。还要提到生命周期钩子的使用,比如onMounted。 然后,引用[4]提到了函数式调用组件,比如弹窗,这可以通过组合式函数返回方法来触发,这部分可以作为一个最佳实践的例子。需要说明如何将组件挂载到DOM并管理其状态。 另外,引用[2]中的useView展示了如何统一接口处理不同操作模式,这也是声明函数时需要考虑的复用性模块化。需要建议将相关功能组织到自定义hook中,如useUser或usePermission,如引用[3]中的权限Hooks。 还要注意类型声明使用TypeScript来增强代码的可靠性维护性,这点可能在引用中没有明确提到,但结合最佳实践应该包括进去。 可能还需要区分选项式API组合式API的写法,但用户可能更关注组合式,因为引用资料大部分都是关于组合式函数的最佳实践。需要确保回答结构清晰,分点说明不同场景下的声明方法,并给出代码示例,如简单的函数、组合式函数函数式组件调用等。 最后,生成的相关问题需要与Vue3函数声明相关,比如组合式函数选项式API的区别,响应式处理,TypeScript的使用等。需要检查引用标记是否正确添加,比如引用[1]、[4]、[2]、[3]在适当的位置。</think>在 Vue3声明函数的最佳实践主要围绕组合式 API 展开,以下是分场景的具体实现方案: ### 一、基础函数声明 ```typescript // 普通工具函数(无响应式) function formatDate(timestamp: number): string { return new Date(timestamp).toLocaleString() } ``` 适用于纯数据转换等非响应式场景,注意保持函数纯度(无副作用)[^1] ### 二、组合式函数声明(最佳实践) ```typescript // useCounter.ts import { ref } from &#39;vue&#39; export function useCounter(initialValue = 0) { const count = ref(initialValue) const increment = () => count.value++ const decrement = () => count.value-- return { count, increment, decrement } } ``` 特点: 1. 使用`ref`/`reactive`创建响应式数据 2. 封装相关业务逻辑 3. 返回响应式对象方法[^2] ### 三、组件内函数声明 ```vue <script setup> import { ref } from &#39;vue&#39; // 响应式状态 const searchQuery = ref(&#39;&#39;) // 方法声明 const handleSearch = () => { fetchResults(searchQuery.value) } // 私有方法使用常规函数 function fetchResults(query) { // API调用逻辑 } </script> ``` 最佳实践: 1. 事件处理函数使用`const`声明 2. 内部方法使用`function`声明 3. 通过`setup`语法糖自动暴露方法[^4] ### 四、函数式组件调用(高阶实践) ```typescript // useModal.ts import { createApp, h } from &#39;vue&#39; export function useModal(component) { return (props) => { const container = document.createElement(&#39;div&#39;) const app = createApp({ render: () => h(component, props) }) app.mount(container) return { unmount: () => app.unmount() } } } ``` 适用于动态组件挂载场景,参考vant组件库实现方式 ### 五、类型声明最佳实践 ```typescript // 使用TypeScript增强类型安全 interface User { id: number name: string } export function useUserAPI() { const getUser = async (id: number): Promise<User> => { // API请求 } return { getUser } } ``` 建议结合TypeScript进行参数/返回值类型声明 ### 六、生命周期整合 ```typescript import { onMounted } from &#39;vue&#39; export function useAutoRefresh() { const refresh = () => { /*...*/ } onMounted(() => { const timer = setInterval(refresh, 5000) return () => clearInterval(timer) }) } ``` 在组合式函数中直接使用生命周期钩子[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值