将Ts往Vue3中再整合一下

简介: 将Ts往Vue3中再整合一下

00. 创建一个vue3+ts的基础工程:yarn create vite


01. Ts规范data的类型(类型断言):



  1. 使用type定义Todo的类型:
type Todo = {
  id: number;
  name: string;
};
复制代码


  1. data中的属性这样来定义:
data() {
    return {
      items: [] as Todo[],
    };
},
复制代码


  1. 类型推断正常并提示:

1.png


02. Ts规范props的类型(PropType):


  1. 使用type定义Title的类型:
type Title = {
  value: string;
  color: string;
};
复制代码


  1. props中的属性这样来定义:
props: {
    title: {
      type: Object as PropType<Title>,
      required: true,
    },
},
复制代码


  1. 类型推断正常并提示:

2.png3.png


03. Ts规范computed的写法(规范返回值类型):


  1. 定义制定返回类型的computed:
computed: {
  doubleCounter(): number {
    return this.counter * 2;
  },
},
复制代码


04. Ts规范methods的写法(规范形参和返回值类型):


createTodo(name: string): Todo {
  return { name, id: this.items.length + 1 };
},
复制代码


05. Ts规范composition api的写法:


  1. 定义属性:
defineProps({
  title: {
    type: Object as PropType<Title>,
    required: true,
  },
});
复制代码


  1. 定义data:
const counter = ref(1);
const items = ref([] as Todo[]);
const todoName = ref("");
复制代码


  1. 定义计算属性:
const doubleCounter = computed(() => counter.value * 2);
复制代码


  1. 定义方法:
const createTodo = (name: string): Todo => {
  return { name, id: items.value.length + 1 };
};
复制代码


  1. 使用type规范模块导入:
<script lang="ts" setup>
import { computed, ref } from "vue";
import type { PropType } from "vue";
import type { Todo, Title } from "../types";
</script>
复制代码


06. Ts规范Vuex4.+的写法:


  1. 安装Vuex4+:yarn add vuex@next --save
  2. 模块扩展(vuex.d.ts):
// 模块扩展:this.$store强类型支持
declare module "@vue/runtime-core" {
  interface ComponentCustomProperties {
    // 应用泛型约束Store的类型
    $store: Store<State>;
  }
}
复制代码
  1. useStore类型化:
  1. 创建一个InjectionKey
export const key: InjectionKey<Store<State>> = Symbol();
复制代码
  1. 按装store是携带InjectionKey
import store, { key } from "./store";
createApp(App).use(store,  key).mount("#app");
复制代码
  1. composition api中使用
import { useStore } from "vuex";
import { key } from "../store";
const store = useStore(key);
const counter = computed(() => store.state.counter);
复制代码
  1. useStore(key)再次包装,减少key的导入
export function useStore () {
  return baseUseStore(key)
}
复制代码
  1. 子模块的类型规范:
  1. 定义子模块:
import { State } from "./../index";
import { Module } from "vuex";
import { Todo } from "../../types";
const initialState = {
  data: [] as Todo[],
};
// 通过值来推断类型
export type TodoState = typeof initialState;
export default {
  namespaced: true,
  state: initialState,
  mutations: {
    initTodo(state, payload: Todo[]) {
      state.data = payload;
    },
    addTodo(state, payload: Todo) {
      state.data.push(payload);
    },
  },
  actions: {
    initTodo({ commit }) {
      setTimeout(() => {
        commit("initTodo", [
          {
            id: 1,
            name: "vuex",
          },
        ]);
      }, 500);
    },
  },
} as Module<TodoState, State>;
复制代码
  1. 挂载到index.ts
import { InjectionKey } from "vue";
import { createStore, Store, useStore as baseUseStore } from "vuex";
import todos, { TodoState } from "./modules/todos";
export type State = {
  counter: number;
  todos?: TodoState;
};
export const key: InjectionKey<Store<State>> = Symbol();
export const store = createStore({
  state: {
    counter: 0,
  },
  modules: {
    todos,
  },
});
export function useStore() {
  return baseUseStore(key);
}
复制代码


07. TS规范Vue-Router4的写法:


  1. 安装Vuex4+:yarn add vue-router@4 --save
  2. 扩展路由配置(交叉类型):
import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";
export type AppRouteRecordRaw = RouteRecordRaw & {
  hidden?: boolean;
};
export default createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: "/",
      component: () => import("../view/Home.vue"),
      hidden: true,
    },
  ] as AppRouteRecordRaw[],
});
复制代码


08. Ts规范Axios的写法:


  1. 安装axios:yarn add axios --save
  2. 构建基本结构:
import axios from "axios";
 const http = axios.create({
    baseURL: import.meta.env.VITI_BASE_URL,
    timeout: 5000,
})
export default http;
复制代码
  1. 通过泛型规范结果的类型:

4.png5.png


09. 支持环境变量的提示


  1. 新建环境变量配置文件.env.development
VITI_BASE_URL = /api
复制代码
  1. 新建/修改env.d.ts,增加ImportMetaEnv配置:
interface ImportMetaEnv {
  VITI_BASE_URL: string;
}
复制代码
  1. 使用时正常提示:

6.png由于快捷键冲突,做开发这么多年才改了一下。。。7.png

  1. 顺便增加一下接口代理:
export default defineConfig({
  server: {
    proxy: {
      "/api": {
        target: "https://jsonplaceholder.typicode.com",
        changeOrigin: true,
        // 重写地址:最终地址不携带api
        rewrite: (path) => path.replace(/^\/api/, ""),
      },
    },
  },
});
// 调用修改
http.get<Todo>("/todos/1");
复制代码


总结:


以上内容整理自“Young村长”的B站视频,单单去学习Ts语法总是没有在实践中用用学的快,推荐你们多像Young村长学习呀,老铁们。



相关文章
|
30天前
|
资源调度 JavaScript 前端开发
创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】
这是一篇关于创建Vue项目的详细指南,涵盖从环境搭建到项目部署的全过程。
161 1
|
2月前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
146 3
|
3月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
64 1
|
3月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
149 58
|
3月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
74 8
|
3月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
181 64
|
3月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
3月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
167 60
|
3月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
99 17
|
3月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
120 17

热门文章

最新文章