Appearance
vue相关技术
vue
组合式 API 和选项式 API的区别
- 组合式 API 编写的组件使用 script setup 或显式的 setup() 函数。
- 组件对象的属性通常称为选项。这就是选项式 API 得名的原因。
生命周期钩子 (lifecycle hooks)
- Vue 组件实例会经历一个生命周期。例如,它会被创建、挂载、更新和卸载。
- 最常用的是 onMounted(创建和插入DOM结点)、onUpdated(重新渲染) 和 onUnmounted
- 在组合式 API 则使用函数,例如 onMounted()。在选项式 API 中,每个钩子都作为单独的选项提供,例如 mounted。
指令
- 内置的指令包括 v-if、v-for、v-bind、v-on 和 v-slot。
- v-model 可以在组件上使用以实现双向绑定,推荐的实现方式是使用 defineModel() 宏
- defineModel() 返回的值是一个 ref。
- 它可以像其他 ref 一样被访问以及修改,不过它能起到在父组件和当前变量之间的双向绑定的作用:
- 它的 .value 和父组件的 v-model 的值同步;
事件 (event)
- v-on 指令用于在模板中监听事件。
- 事件处理
- 可以使用 v-on 指令 (简写为 @) 来监听 DOM 事件;
- 内联事件处理器:事件被触发时执行的内联 JavaScript 语句 (与 onclick 类似)。
- 方法事件处理器:一个指向组件上定义的方法的属性名或是路径。
- 在内联处理器中调用方法:
- 这允许我们向方法传入自定义参数,@click="say('hello')";
- 也可以使用箭头函数,@click="(event) => console.log('test', event)"
- 组件事件
- 在组件的模板表达式中,可以直接使用 $emit 方法触发自定义事件
- @click="$emit('someEvent')"
- 父组件可以通过 v-on (缩写为 @) 来监听事件,MyComponent @some-event="callback";
- 在template中使用的$emit方法不能在组件的script setup部分中使用,但 defineEmits() 会返回一个相同作用的函数供我们使用:
- 组件可以显式地通过 defineEmits() 宏来声明它要触发的事件
- const emit = defineEmits(['inFocus', 'submit'])
- function buttonClick() { emit('submit')}
- 事件校验
- 所有触发的事件也可以使用对象形式来描述。
- 要为事件添加校验,那么事件可以被赋值为一个函数,接受的参数就是抛出事件时传入 emit 的内容,返回一个布尔值来表明事件是否合法。
提供 / 注入 (provide / inject)
- 是一种组件间通信的形式,该组件的所有后代组件都可以选择使用;
- 与 prop 不同,提供值的组件不知道哪些组件正在接收该值。
- provide 也可以在应用级别使用,使得该值对该应用中的所有组件都可用。
响应式API
- 包括 ref()、reactive()、computed()、watch() 和 watchEffect() 等。
- 响应式作用 (reactive effect)
- 指的是跟踪函数的依赖关系,并在它们的值发生变化时重新运行该函数的过程。
- watchEffect() 是最直接的创建作用的方式。Vue内部的其他各个部分也会使用作用。例如组件渲染更新、computed() 和 watch()。
- 响应性是指在数据变化时自动执行操作的能力。例如,当数据值变化时更新 DOM,或进行网络请求。
- ref 是 Vue 响应性系统的一部分
- 它是一个具有单个响应式属性 (称为 value) 的对象。
- Ref 有多种不同的类型。例如,可以使用 ref()、shallowRef()、computed() 和 customRef() 来创建 ref。
- 函数 isRef() 可以用来检查一个对象是否是 ref,isReadonly() 可以用来检查 ref 是否允许被直接重新赋值
插件 (plugin)
- 插件是一种能为 Vue 添加全局功能的工具代码,是向应用程序添加功能的一种方式。
- app.use(plugin) 可以将插件添加到应用中。插件本身可以是一个函数,也可以是一个带有 install 函数的对象。
- 安装函数会接收到安装它的应用实例和传递给 app.use() 的额外选项作为参数:
- 插件没有严格定义的使用范围,但是插件发挥作用的常见场景主要包括以下几种:
- 通过 app.component() 和 app.directive() 注册一到多个全局组件或自定义指令。
- 通过 app.provide() 使一个资源可被注入进整个应用。
- 向 app.config.globalProperties 中添加一些全局实例属性或方法;
- vue-router库就包含了上述三种的使用
组件
- 组件是 Vue 提供的将 UI 拆成较小部分的主要机制,既可以提高可维护性,也允许代码重用。例如按钮或复选框。多个组件也可以组合成更大的组件。
- 一个 Vue 组件是一个对象。所有属性都是可选的,但是必须有用于组件渲染的模板或渲染函数二选一。
- 大多数 Vue 应用都是通过单文件组件 (.vue 文件) 编写的。单文件组件编译器会将它们转换为用作文件默认导出的一个对象。
- 组件这个词也可以更宽泛地用来指代组件实例。每一个组件都维护着自己的状态,每当使用一个组件,就创建了一个新的实例。
- 在实际应用中,组件常常被组织成层层嵌套的树状结构,可以在每个组件内封装自定义内容与逻辑;
- 通过 script setup,导入的组件都在模板中直接可用。
- 也可以全局地注册一个组件,使得它在当前应用中的任何组件上都可以使用,而不需要额外再导入;
- 在单文件组件中,推荐为子组件使用 PascalCase 的标签名使用 /> 来关闭一个标签,也可以使用 kebab-case 形式并显式地关闭这些组件的标签;
- Props 是一种特别的 attributes,你可以在组件上声明注册。必须在组件的 props 列表上声明它。这里要用到 defineProps 宏;
- defineProps(['title']), , BlogPost title="My journey with Vue",在for中遍历的使用多次组件可以用:title;
- 组件与父组件进行交互,看上方“组件事件”的两种emit使用方式;
- 向组件中传递内容:通过插槽来分配内容,通过 Vue 的自定义 slot /> 元素来实现,作为一个占位符,父组件传递进来的内容就会渲染在这里。
- 动态组件:
- 使用 component :is="..." 来在多个组件间作切换,比如 Tab 界面,被切换掉的组件会被卸载,
- 但可以通过KeepAlive组件强制被切换掉的组件仍然保持“存活”的状态。
nuxt
- 功能:
- 项目结构和配置:了解 Nuxt 项目的目录结构,以及如何配置 nuxt.config.js 文件来满足项目的需求;
- 中间件:理解和运用 Nuxt 的中间件机制,实现诸如权限验证、路由跳转控制等功能。
- 状态管理:有自己的简单状态管理工具,也可以与pinia集成;
- 模块使用:Nuxt 有很多丰富的模块可以扩展功能,例如 @nuxtjs/auth,@tailwindss等很多扩展整合功能;
- 支持自动API路由:
- 在 server/api 目录下创建文件来定义后端 API 逻辑,处理特定的请求和返回相应的数据;
- 路由以api开头,用文件名定义http方法类型,[...].ts这种文件名可以处理全部http请求方法;
- nuxt扩展了 Vue.js 的以下几个主要方面:
- 服务器端渲染(SSR)支持:Nuxt.js 为 Vue.js 应用提供了内置的服务器端渲染功能,使页面能够在服务器端生成完整的 HTML 并发送给客户端;
- 路由系统:提供了更强大和自动化的路由配置方式,包括动态路由、嵌套路由等,简化了路由的管理和维护。自动pages页面路由,按不同的目录组织功能;
- 数据获取:引入了特定的钩子函数(如 asyncData 和 fetch),方便在服务器端和客户端获取数据,并在渲染页面之前预取数据。
- 布局系统:允许轻松创建和管理应用的布局模板,实现不同页面之间的统一布局和布局切换。
- 模块生态:Nuxt.js 拥有丰富的模块生态,方便集成各种功能,如 API 调用、状态管理、样式处理等。
- 构建和部署优化:提供了一系列默认的构建配置和优化策略,以便生成高效的生产环境代码,并支持多种部署方式。
- 开发环境支持:在开发过程中,提供了热模块替换(HMR)、自动代码分割等功能,提高开发效率。
- 约定优于配置:遵循一定的项目结构和命名约定,减少了配置的复杂性,使开发者能够更快速地搭建和开发应用。
- vue和nuxtjs都有命令行工具可以创建模板项目,不用在网上找集成了某某组件的模板;
typescript
- 基础类型:包括数字、字符串、布尔值、数组、元组、枚举、any、void、never 等类型的理解和使用。
- 接口(Interfaces):用于定义对象的形状和结构,确保对象具有特定的属性和方法。
- 类(Classes):包括类的定义、属性、方法、访问修饰符(public、private、protected)、继承等。
- 函数:函数的类型定义、参数类型、返回值类型。
- 泛型(Generics):使函数和类可以更通用,适用于多种类型。
- 类型别名(Type Aliases)和类型断言(Type Assertions):用于创建自定义类型名称和强制类型转换。
- 模块(Modules):了解如何组织代码为模块,以及模块的导入和导出。
- 装饰器(Decorators):用于为类、方法、属性等添加额外的行为或元数据。
- 类型推论(Type Inference):理解 TypeScript 如何自动推断变量和表达式的类型。
- 高级类型操作:如交叉类型(Intersection Types)、联合类型(Union Types)、映射类型(Mapped Types)等。
- 与现有 JavaScript 代码的集成:包括如何在 TypeScript 项目中使用第三方 JavaScript 库。
- 类型兼容性和类型守卫(Type Guards):用于在运行时进行类型检查和条件判断。