Vue 3 + TypeScript进阶用法

在掌握了 Vue 3 和 TypeScript 的基本使用后,你可以进一步探索一些进阶特性和最佳实践。这些包括更复杂的类型定义、自定义 hooks、全局状态管理等。下面是一些关键点:

1. 更复杂的类型定义

Props 和 Emits 的类型

对于组件的 props 和 emits,可以使用更精细的类型来描述它们的行为。

import { defineComponent, PropType } from 'vue';

interface User {
  id: number;
  name: string;
}

export default defineComponent({
  props: {
    user: {
      type: Object as PropType<User>,
      required: true
    }
  },
  emits: {
    (event: 'update:user', payload: User): boolean => true,
    (event: 'deleteUser'): boolean => true
  },
  setup(props, { emit }) {
    const handleUpdate = (newUser: User) => {
      emit('update:user', newUser);
    };

    return { handleUpdate };
  }
});

这里我们为 user prop 指定了具体的接口类型,并且详细地定义了 emits 的行为。

2. 自定义 Hooks

Hooks 是一种从函数组件中提取逻辑的方式,在 Vue 3 中通过 Composition API 实现。创建可复用的逻辑块可以帮助保持代码的整洁和可维护性。

// useFetch.ts
import { ref, onMounted, onUnmounted } from 'vue';
import axios from 'axios';

function useFetch<T>(url: string) {
  const data = ref<T | null>(null);
  const error = ref<Error | null>(null);
  const loading = ref(true);

  function fetchData() {
    loading.value = true;
    axios.get(url)
      .then(response => {
        data.value = response.data;
      })
      .catch(err => {
        error.value = err;
      })
      .finally(() => {
        loading.value = false;
      });
  }

  onMounted(fetchData);
  onUnmounted(() => {
    // 清理操作
  });

  return { data, error, loading, fetchData };
}

export default useFetch;

然后在组件中使用这个 hook:

import { defineComponent } from 'vue';
import useFetch from './useFetch';

interface Post {
  id: number;
  title: string;
}

export default defineComponent({
  setup() {
    const { data, error, loading, fetchData } = useFetch<Post>('https://jsonplaceholder.typicode.com/posts/1');

    return { data, error, loading, fetchData };
  }
});

3. 全局状态管理 - Pinia

Pinia 是一个轻量级的状态管理库,专为 Vue 3 设计。它与 TypeScript 集成良好,支持模块化设计。

首先安装 Pinia:

npm install pinia

然后创建一个 store:

// stores/userStore.ts
import { defineStore } from 'pinia';

interface UserState {
  id: number;
  name: string;
}

export const useUserStore = defineStore('user', {
  state: (): UserState => ({
    id: 0,
    name: ''
  }),
  actions: {
    setUser(user: UserState) {
      this.$patch(user);
    }
  }
});

在组件中使用 store:

import { defineComponent } from 'vue';
import { useUserStore } from '@/stores/userStore';

export default defineComponent({
  setup() {
    const userStore = useUserStore();

    return { userStore };
  }
});

4. 使用 Volar 插件

Volar 是专门为 Vue 3 设计的新一代 VS Code 插件,提供了比 Vetur 更好的 TypeScript 支持。确保你已经安装了 Volar 来获得最佳开发体验。

5. 类型安全的路由

如果你使用 Vue Router,可以通过定义路由配置的类型来增强类型安全性。

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import Home from '../views/Home.vue';

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  // 更多路由...
];

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
});

export default router;

通过上述步骤,你可以充分利用 Vue 3 和 TypeScript 的强大功能,构建出既高效又易于维护的应用程序。

Vue 3 + TypeScript 高阶用法 https://blog.youkuaiyun.com/fghyibib/article/details/144209800?spm=1001.2014.3001.5502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涔溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值