update
This commit is contained in:
1 parent
8d75346c80
commit
7434accb0e
7 files changed
+434
-7
No files matched your search
@@ -1 +1,3 @@
|
|||||||
node_modules
|
node_modules
|
||||||
|
test.*
|
||||||
|
.vscode
|
||||||
+34
-1
@@ -1,6 +1,8 @@
|
|||||||
# 与 css 相关,多学习 css
|
# 与 css 相关,多学习 css
|
||||||
|
|
||||||
## css inset
|
## css inset
|
||||||
|
|
||||||
|
- 同时设置上下左右等多个属性值
|
||||||
- inset : top | right| bottom | left
|
- inset : top | right| bottom | left
|
||||||
- 使用例:
|
- 使用例:
|
||||||
```css
|
```css
|
||||||
@@ -10,8 +12,10 @@
|
|||||||
inset: 2.4em 3em 3em 3em; /* 上 | 右 | 下 | 左 */
|
inset: 2.4em 3em 3em 3em; /* 上 | 右 | 下 | 左 */
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## css 过渡 transition
|
## css 过渡 transition
|
||||||
- 有transition-property、transition-duration、transition-timing-function 和 transition-delay这几个属性,不过一般使用时应该都是用transition合起来写。
|
|
||||||
|
- 有 transition-property、transition-duration、transition-timing-function 和 transition-delay 这几个属性,不过一般使用时应该都是用 transition 合起来写。
|
||||||
- 使用例:
|
- 使用例:
|
||||||
|
|
||||||
```css
|
```css
|
||||||
@@ -25,6 +29,7 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
## css 动画 滚动条驱动
|
## css 动画 滚动条驱动
|
||||||
|
|
||||||
- animation-timeline
|
- animation-timeline
|
||||||
- 有时间再写
|
- 有时间再写
|
||||||
|
|
||||||
@@ -192,3 +197,31 @@
|
|||||||
color: green;
|
color: green;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## grid
|
||||||
|
|
||||||
|
```css
|
||||||
|
.container {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(2, 100px 20px 80px);
|
||||||
|
/* repeat 配合auto-fill/auto-fit 配合minmax 实现自适应布局 */
|
||||||
|
grid-template-columns: 1fr 1fr minmax(100px, 1fr);
|
||||||
|
grid-row-gap: 20px;
|
||||||
|
grid-column-gap: 20px;
|
||||||
|
/* 先行后列,尽可能填满 */
|
||||||
|
grid-auto-flow: row dense;
|
||||||
|
}
|
||||||
|
.item-1 {
|
||||||
|
/* 边框所对应的网格线 */
|
||||||
|
/* grid-column属性是grid-column-start和grid-column-end的合并简写形式,grid-row属性是grid-row-start属性和grid-row-end的合并简写形式。 */
|
||||||
|
grid-column-start: 2;
|
||||||
|
grid-column-end: 4;
|
||||||
|
grid-column: 2/4;
|
||||||
|
grid-row: 1/2;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
## point-event
|
||||||
|
|
||||||
|
当为none时,所有点击事件无效
|
||||||
|
|
||||||
|
##
|
||||||
+99
-1
@@ -1,3 +1,101 @@
|
|||||||
# 杂谈 记录一些碎碎念
|
# 杂谈 记录一些碎碎念
|
||||||
|
|
||||||
---
|
---
|
||||||
npx用来临时使用一个库(如rollup)
|
|
||||||
|
npx 用来临时使用一个库(如 rollup)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
强缓存和协商缓存的 header 参数
|
||||||
|
强缓存:
|
||||||
|
Expires:过期时间,如果设置了时间,则浏览器会在设置的时间内直接读取缓存,不再请求
|
||||||
|
Cache-Control:当值设为 max-age=300 时,则代表在这个请求正确返回时间(浏览器也会记录下来)的 5 分钟内再次加载资源,就会命中强缓存。
|
||||||
|
cache-control:除了该字段外,还有下面几个比较常用的设置值:
|
||||||
|
(1) max-age:用来设置资源(representations)可以被缓存多长时间,单位为秒;
|
||||||
|
(2) s-maxage:和 max-age 是一样的,不过它只针对代理服务器缓存而言;
|
||||||
|
(3)public:指示响应可被任何缓存区缓存;
|
||||||
|
(4)private:只能针对个人用户,而不能被代理服务器缓存;
|
||||||
|
(5)no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到 请求,然后判断资源是否变更,是则返回新内容,否则返回 304,未变更。这个很容易让人产生误解,使人误 以为是响应不被缓存。实际上 Cache-Control: no-cache 是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。
|
||||||
|
(6)no-store:禁止一切缓存(这个才是响应不被缓存的意思)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
mvvm:
|
||||||
|
|
||||||
|
vm: 关注绑定器,将数据和视图绑定,自动更新,低耦合。model仅关注数据更新
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
垃圾回收相关:
|
||||||
|
|
||||||
|
window.gc: 手动调用垃圾回收
|
||||||
|
|
||||||
|
现代主要使用标记清除法。
|
||||||
|
进入执行环境的时候标记上。
|
||||||
|
离开环境的时候直接回收。
|
||||||
|
|
||||||
|
常见的内存泄漏:
|
||||||
|
全局变量,解决方式: 全局变量
|
||||||
|
定时器未清除:记得及时清除
|
||||||
|
闭包: 解决方式: 及时设置为null
|
||||||
|
dom元素删除后未清除: 解决方式: 及时设置为null
|
||||||
|
|
||||||
|
栈(Stack)
|
||||||
|
特点:栈是一种后进先出(LIFO, Last In First Out)的数据结构。
|
||||||
|
|
||||||
|
存储内容:用于存储简单的数据类型(如数字、字符串、布尔值)和函数调用上下文。
|
||||||
|
|
||||||
|
内存分配和释放:内存分配和释放非常快速,直接在栈顶操作。函数调用结束后,栈帧自动释放。
|
||||||
|
|
||||||
|
作用:主要用于管理函数调用和局部变量。
|
||||||
|
|
||||||
|
堆(Heap)
|
||||||
|
特点:堆是一种无序的数据结构,用于动态分配内存。
|
||||||
|
|
||||||
|
存储内容:用于存储复杂的数据类型(如对象、数组)。
|
||||||
|
|
||||||
|
内存分配和释放:内存分配比较灵活,但管理和回收内存需要垃圾回收机制(GC, Garbage Collection)来处理。
|
||||||
|
|
||||||
|
作用:用于存储需要动态分配的较大数据块和复杂数据结构。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
babel相关:
|
||||||
|
|
||||||
|
Babel 是一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
es6几个主要的:
|
||||||
|
1. let, const
|
||||||
|
2. 箭头函数
|
||||||
|
3. class
|
||||||
|
4. 模板字符串
|
||||||
|
5. 解构
|
||||||
|
6. 函数传参默认值&rest
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
http响应头请求头
|
||||||
|
|
||||||
|
请求头:
|
||||||
|
content-type: 请求的数据的类型
|
||||||
|
Authorization: 身份验证,如JWT这样的
|
||||||
|
UA: 浏览器环境
|
||||||
|
|
||||||
|
响应头:
|
||||||
|
set-cookie
|
||||||
|
content-length
|
||||||
|
cache-control
|
||||||
|
|
||||||
|
跨域cookie需要服务器进行设置
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
SEO优化
|
||||||
|
|
||||||
|
1. 大量使用语义化标签
|
||||||
|
2. 保证关键词覆盖率,title之类,配置meta信息
|
||||||
|
3. 制定一个站点地图,放在“robot.txt”中
|
||||||
|
4. 结构化数据
|
||||||
+157
-2
@@ -1,18 +1,21 @@
|
|||||||
# 以下是关于 ts(以及任何关于 ts 的不限于语法,技巧之类的学习心得)
|
# 以下是关于 ts(以及任何关于 ts 的不限于语法,技巧之类的学习心得)
|
||||||
|
|
||||||
## any unknown void never
|
## any unknown void never
|
||||||
|
|
||||||
- any 表示任意类型。这导致不会对类型进行任何检查,用太多不太好就是了。
|
- any 表示任意类型。这导致不会对类型进行任何检查,用太多不太好就是了。
|
||||||
- unknown 表示位置类型。看作any的安全版本。可以赋值为任何类型,但在使用之前必须进行类型检查或类型断言。
|
- unknown 表示位置类型。看作 any 的安全版本。可以赋值为任何类型,但在使用之前必须进行类型检查或类型断言。
|
||||||
- void 代表没有返回值。
|
- void 代表没有返回值。
|
||||||
- never 代表永远不会有任何返回值,如死循环或抛出异常。
|
- never 代表永远不会有任何返回值,如死循环或抛出异常。
|
||||||
|
|
||||||
## 接口 interface
|
## 接口 interface
|
||||||
- 基本可以认为是声明object类型用的东西
|
|
||||||
|
- 基本可以认为是声明 object 类型用的东西
|
||||||
|
|
||||||
## 泛型 <T>
|
## 泛型 <T>
|
||||||
|
|
||||||
- 实际上可以理解为是一种类型的变量
|
- 实际上可以理解为是一种类型的变量
|
||||||
- 如:
|
- 如:
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
function identity<T>(arg: T): T {
|
function identity<T>(arg: T): T {
|
||||||
return arg
|
return arg
|
||||||
@@ -35,3 +38,155 @@
|
|||||||
let pair: Pair<string, number> = { first: 'hello', second: 42 }
|
let pair: Pair<string, number> = { first: 'hello', second: 42 }
|
||||||
console.log(pair) // 输出: { first: 'hello', second: 42 }
|
console.log(pair) // 输出: { first: 'hello', second: 42 }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 箭头函数与普通函数的区别
|
||||||
|
|
||||||
|
- 箭头函数没有 yield
|
||||||
|
- 无 prototype
|
||||||
|
- 没有 this 和 arguments
|
||||||
|
|
||||||
|
## 使用 Object.freeze()
|
||||||
|
|
||||||
|
- Object.freeze() 可以冻结一个对象,使其不能添加、删除或修改属性。
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const obj = { key: 'value' };
|
||||||
|
Object.freeze(obj);
|
||||||
|
|
||||||
|
obj.key = 'new value'; // 无效
|
||||||
|
obj.newKey = 'new value'; // 无效
|
||||||
|
delete obj.key; // 无效
|
||||||
|
|
||||||
|
console.log(obj);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用 Object.defineProperty()使对象某一 key 其不可变
|
||||||
|
|
||||||
|
- Object.defineProperty() 可以定义对象属性,并使其不可变。
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const obj = {};
|
||||||
|
Object.defineProperty(obj, 'key', {
|
||||||
|
value: 'value',
|
||||||
|
writable: false,
|
||||||
|
configurable: false // 不可配置的
|
||||||
|
});
|
||||||
|
|
||||||
|
obj.key = 'new value'; // 无效
|
||||||
|
delete obj.key; // 无效
|
||||||
|
|
||||||
|
console.log(obj); // 输出: { key: 'value' }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Object.seal()。
|
||||||
|
|
||||||
|
- Object.seal() 可以让对象不能添加或删除属性,但允许修改现有属性的值。
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const obj = { key: 'value' };
|
||||||
|
Object.seal(obj);
|
||||||
|
|
||||||
|
obj.key = 'new value'; // 有效
|
||||||
|
obj.newKey = 'new value'; // 无效
|
||||||
|
delete obj.key; // 无效
|
||||||
|
|
||||||
|
console.log(obj);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 判断是否为数组
|
||||||
|
|
||||||
|
- Array.isArray()
|
||||||
|
- instanceof Array
|
||||||
|
- obj.**proto** === [].**proto**
|
||||||
|
|
||||||
|
## 是否为 NaN
|
||||||
|
|
||||||
|
- Number.isNaN()
|
||||||
|
|
||||||
|
## obj 可迭代
|
||||||
|
|
||||||
|
- 实现了迭代器协议(拥有 Symbol.iterator 方法)实现了迭代器协议(拥有 Symbol.iterator 方法)
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const iterable = {
|
||||||
|
*[Symbol.iterator]() {
|
||||||
|
yield 1;
|
||||||
|
yield 2;
|
||||||
|
yield 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## promise新的
|
||||||
|
|
||||||
|
- Promise.race(iterable) 接受一个可迭代对象,返回第一个解决或拒绝的 Promise 的结果。
|
||||||
|
- Promise.allSettled(iterable) 接受一个可迭代对象,返回一个 Promise,所有 Promise 无论解决或拒绝都会返回结果。
|
||||||
|
- Promise.any(iterable) 接受一个可迭代对象,返回第一个成功解决的 Promise 的结果。如果所有 Promise 都被拒绝,则返回一个拒绝的 Promise。
|
||||||
|
|
||||||
|
## deepReadonly
|
||||||
|
|
||||||
|
```ts
|
||||||
|
type DeepReadonly<T> = {
|
||||||
|
readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## callable的对象
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const callableObject = {
|
||||||
|
[Symbol('callable')](...args) {
|
||||||
|
console.log('Object called with args:', ...args);
|
||||||
|
// 执行一些操作并返回结果
|
||||||
|
return args.reduce((sum, val) => sum + val, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 异步迭代
|
||||||
|
|
||||||
|
```ts
|
||||||
|
const asyncIterable = {
|
||||||
|
async *[Symbol.asyncIterator]() {
|
||||||
|
yield await new Promise(resolve => setTimeout(() => resolve(1), 1000));
|
||||||
|
yield await new Promise(resolve => setTimeout(() => resolve(2), 1000));
|
||||||
|
yield await new Promise(resolve => setTimeout(() => resolve(3), 1000));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
(async function() {
|
||||||
|
for await (const value of asyncIterable) {
|
||||||
|
console.log(value); // 输出: 1, 2, 3,每个值之间间隔1秒
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
二进制/文件处理
|
||||||
|
|
||||||
|
blob: 一种类文件对象,只能使用fileReader进行异步读取,读取为arrayBuffer
|
||||||
|
|
||||||
|
arraybuffer: 一种通用的二进制数据缓冲区,需要通过视图(如uint8array)进行修改
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
关于闭包,有逻辑的回答:
|
||||||
|
|
||||||
|
闭包(closure)指有权访问另一个函数作用域中变量的函数。 ----- JavaScript 高级程序设计
|
||||||
|
闭包有什么用?
|
||||||
|
|
||||||
|
延伸变量作用域范围,读取函数内部的变量
|
||||||
|
让这些变量的值始终保持在内存中
|
||||||
|
|
||||||
|
简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
weakMap
|
||||||
|
|
||||||
|
key必须为一个obj
|
||||||
|
可以用于给一个obj附加一些生命周期相同的数据内容(如缓存)
|
||||||
|
|
||||||
+56
-3
@@ -4,7 +4,8 @@
|
|||||||
---
|
---
|
||||||
# 子子组件之间的通信可以通过事件总线(eventBus)实现
|
# 子子组件之间的通信可以通过事件总线(eventBus)实现
|
||||||
---
|
---
|
||||||
# doucument.createElement出来的东西不及时销毁就会一直游离在外面不被释放,积累下来很不好。
|
|
||||||
|
# doucument.createElement出来的东西不及时销毁就会一直游离在外面不被释放,积累下来很不好。(似乎是错误的)
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -12,7 +13,7 @@
|
|||||||
组件设计可以分成业务组件,展示组件,展示组件只负责以对应的形式展示对应的数据,对于业务的处理(如增删查改),则需要通过emit或其他方法交给业务组件处理
|
组件设计可以分成业务组件,展示组件,展示组件只负责以对应的形式展示对应的数据,对于业务的处理(如增删查改),则需要通过emit或其他方法交给业务组件处理
|
||||||
|
|
||||||
---
|
---
|
||||||
# 路由返回拦截hook
|
# 路由返回拦截hook(路由守卫)
|
||||||
* 当点击返回键(浏览器或者是页面上的路由返回功能)时触发,形式如下:
|
* 当点击返回键(浏览器或者是页面上的路由返回功能)时触发,形式如下:
|
||||||
```ts
|
```ts
|
||||||
import { onBeforeRouteLeave } from 'vue-router'
|
import { onBeforeRouteLeave } from 'vue-router'
|
||||||
@@ -27,7 +28,7 @@ onBeforeRouteLeave((to, from, next) => {
|
|||||||
next(true)
|
next(true)
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
* 当next(false时,取消路由原有的返回功能)
|
* 当next===false时,取消路由原有的返回功能
|
||||||
---
|
---
|
||||||
## 具名作用域插槽
|
## 具名作用域插槽
|
||||||
* 具名作用域插槽的工作方式也是类似的,插槽 props 可以作为 v-slot 指令的值被访问到
|
* 具名作用域插槽的工作方式也是类似的,插槽 props 可以作为 v-slot 指令的值被访问到
|
||||||
@@ -83,3 +84,55 @@ example:
|
|||||||
</template>
|
</template>
|
||||||
</el-popover>
|
</el-popover>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# 路由相关:
|
||||||
|
|
||||||
|
* 路由守卫
|
||||||
|
|
||||||
|
- - beforeEach 全局前置守卫
|
||||||
|
|
||||||
|
作用:
|
||||||
|
主要用于在路由跳转前进行权限验证、页面加载状态的设置等操作。例如,判断用户是否已经登录,如果没有登录且要访问需要登录才能访问的页面,就可以将用户重定向到登录页面。
|
||||||
|
它可以对每一次路由跳转进行全局拦截,是控制路由访问权限的重要手段。
|
||||||
|
|
||||||
|
- - afterEach全局后置守卫
|
||||||
|
|
||||||
|
作用:
|
||||||
|
它在路由跳转完成后被调用,主要用于记录页面访问历史、修改页面标题或者进行一些不需要阻塞路由跳转的操作。
|
||||||
|
例如,根据不同的路由来更新文档的标题,或者发送页面访问统计数据到服务器。
|
||||||
|
|
||||||
|
- - 全局解析守卫(beforeResolve)的触发时机
|
||||||
|
|
||||||
|
全局解析守卫beforeResolve在路由导航被触发后,在所有组件内守卫和异步路由组件被解析之前调用。它是在beforeEach之后,但是在组件实例创建和beforeRouteEnter等组件内守卫之前执行。这意味着它处于路由导航过程的一个中间阶段,此时路由已经被匹配,但组件还没有完全解析和进入。
|
||||||
|
主要作用
|
||||||
|
数据预获取:
|
||||||
|
可以用于获取组件渲染所需的数据。与beforeEach不同的是,beforeResolve更专注于确保在组件真正开始渲染之前,所有必要的数据都已经获取并准备好。例如,对于一个包含多个嵌套组件的复杂页面,其中每个组件都需要从服务器获取数据,beforeResolve可以协调这些数据获取操作,确保所有数据都准备好后再进行组件渲染。
|
||||||
|
处理异步操作的集中点:
|
||||||
|
它为处理整个路由导航过程中的异步操作提供了一个集中的位置。在大型应用中,可能会有多个异步操作需要在路由跳转时完成,如加载第三方脚本、初始化插件等。beforeResolve可以用于确保这些异步操作都顺利完成后再继续路由解析过程。
|
||||||
|
|
||||||
|
- - 组件路由守卫
|
||||||
|
```vue
|
||||||
|
<script setup>
|
||||||
|
import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
// 与 beforeRouteLeave 相同,无法访问 `this`
|
||||||
|
onBeforeRouteLeave((to, from) => {
|
||||||
|
const answer = window.confirm(
|
||||||
|
'Do you really want to leave? you have unsaved changes!'
|
||||||
|
)
|
||||||
|
// 取消导航并停留在同一页面上
|
||||||
|
if (!answer) return false
|
||||||
|
})
|
||||||
|
|
||||||
|
const userData = ref()
|
||||||
|
|
||||||
|
// 与 beforeRouteUpdate 相同,无法访问 `this`
|
||||||
|
onBeforeRouteUpdate(async (to, from) => {
|
||||||
|
//仅当 id 更改时才获取用户,例如仅 query 或 hash 值已更改
|
||||||
|
if (to.params.id !== from.params.id) {
|
||||||
|
userData.value = await fetchUser(to.params.id)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
```
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
```ts
|
||||||
|
import {
|
||||||
|
defineComponent,
|
||||||
|
watch,
|
||||||
|
onMounted,
|
||||||
|
onBeforeUnmount,
|
||||||
|
h,
|
||||||
|
getCurrentInstance,
|
||||||
|
type PropType,
|
||||||
|
} from 'vue-demi'
|
||||||
|
import ResizeObserver from './ResizeObserver'
|
||||||
|
import type { IOptions } from './types'
|
||||||
|
|
||||||
|
|
||||||
|
// const component = {
|
||||||
|
// name: 'Home',
|
||||||
|
// props:{
|
||||||
|
// data: String,
|
||||||
|
// },
|
||||||
|
// setup(props, context){
|
||||||
|
// // props.data
|
||||||
|
// // context.attrs context.slots context.emit
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'ResizeObserverComponent',
|
||||||
|
props: {
|
||||||
|
target: [String, Object] as PropType<string | HTMLElement>,
|
||||||
|
disabled: Boolean as PropType<boolean>,
|
||||||
|
immediate: Boolean as PropType<boolean>,
|
||||||
|
delay: {
|
||||||
|
type: Number as PropType<number>,
|
||||||
|
default: 150
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setup(props, { slots }) {
|
||||||
|
let ro: ResizeObserver | null = null
|
||||||
|
watch(() => props.disabled, (val) => {
|
||||||
|
if (val) {
|
||||||
|
ro?.disconnect()
|
||||||
|
} else {
|
||||||
|
ro?.observe()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
onMounted(() => {
|
||||||
|
// const { target, disabled, limiter, wait } = toRefs(props)
|
||||||
|
// 拿到当前组件的实例(注意已挂载)
|
||||||
|
const vm = getCurrentInstance()?.proxy
|
||||||
|
|
||||||
|
// 先用$el
|
||||||
|
let $el: HTMLElement = vm?.$el as HTMLElement
|
||||||
|
|
||||||
|
if (props.target) {
|
||||||
|
if (typeof props.target === 'string') {
|
||||||
|
$el = document.querySelector(props.target) as HTMLElement
|
||||||
|
} else if (props.target instanceof HTMLElement) {
|
||||||
|
$el = props.target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const options: IOptions = {
|
||||||
|
delay: props.delay,
|
||||||
|
immediate: props.immediate,
|
||||||
|
resize: (data, elem) => {
|
||||||
|
vm?.$emit('resize', data, elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ro = new ResizeObserver($el, options)
|
||||||
|
})
|
||||||
|
// 销毁 ResizeObserver实例
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
if (ro) {
|
||||||
|
ro.destroy()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 如果有单个子元素则直接渲染子元素
|
||||||
|
const defaultContent = slots.default?.()
|
||||||
|
return () => (
|
||||||
|
(defaultContent && defaultContent.length === 1)
|
||||||
|
? defaultContent[0]
|
||||||
|
: h('div', defaultContent)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
Whitespace-only changes.
Reference in new issue
Block a user