准备工作
创建项目
pnpm create vite√ Project name: … vite-vue3-demo //项目名称
√ Select a framework: » Vue //前端框架
√ Select a variant: » JavaScript
运行
pnpm i
pnpm run dev
安装依赖
1 | pnpm install vue-router@4 |
响应式
reactive
创建一个响应式对象,仅对对象类型有效(对象、数组和 Map、Set 这样的集合类型),而对 string、number 和 boolean 这样的 原始类型 无效。
示例
1 | // javascript |
1 | <p> {{ state }}</p> |
ref
创建任意类型的响应式数据
示例
1 | import { ref } from 'vue' |
1 | <!-- 模板里不需要.value--> |
$ref 响应式语法糖
官方api
结合了ref和reactive的优点,该功能处于实验性阶段
需要在vite.config.js里配置reactivityTransform: true
1 | import { defineConfig } from 'vite' |
示例
1 | //1、响应式 基础类型 和对象类型都不需要.value |
1 | <p> $refnum1 -->{{ num }}</p> |
props
- 父组件
1 | <template> |
- 子组件
1 | <template> |
当对象或数组作为 props 被传入时,虽然子组件无法更改 props 绑定,但仍然可以更改对象或数组内部的值。这是因为 JavaScript 的对象和数组是按引用传递,而对 Vue 来说,禁止这样的改动虽然可能,但有很大的性能损耗,比较得不偿失。
这种更改的主要缺陷是它允许了子组件以某种不明显的方式影响父组件的状态,可能会使数据流在将来变得更难以理解。在最佳实践中,你应该尽可能避免这样的更改,除非父子组件在设计上本来就需要紧密耦合。在大多数场景下,子组件应该抛出一个事件来通知父组件做出改变。
emit
父子通信的一种方式,事件触发
- 示例
子组件 emitChild.vue
1 | <template> |
父组件
1 | <template> |
slot
- 没有name的插槽为默认插槽,默认name为default
- 可用v-slot:slot1 也可用 #slot1
定义
1 | <slot name="slot1"> |
使用
1 | <template #slot1> |
- 示例
子组件
1 | <template> |
父组件
1 | <template> |
数据注入
父组件向后代组件传递数据
- 一般>=3级使用,两级可以使用
props $ref语法糖定义的数据在后代组件修改数据后貌似无法响应式父组件提供数据
1 | <script setup> |
后代组件注入使用
1 | import { inject } from 'vue' |
示例
- 父组件
1 | <template> |
- 后代组件
1 | <template> |
计算属性
示例
1 | <template> |
watch
官方api
监听属性改变
1 | watch(prop,callBack, { |
示例
1 | <template> |
生命周期
1 | <template> |
iconfont
使用阿里巴巴矢量图标库 创建简单的图标组件
- 1、资源管理-我的项目-生成symol 链接
- 2、在index.html引入 (可以将js下载下来)
1 | <script src="//at.alicdn.com/t/c/font_3760320_azguqahs9pt.js"></script> |
- 3、 编写icon-font 组件
1 | <template> |
- 4、在main.js里全局注册组件
1 | import IconFont from "@/components/iconFont.vue"; |
- 5、使用组件
1 | <icon-font name="icon-search" size="32px" /> |
hooks
逻辑复用、逻辑和页面分离
例子
- useTodoList.js
1 | import { ref } from 'vue'; |
- 使用
1 | <template> |
未完待续