Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(image):支持懒加载 #3096

Merged
merged 166 commits into from
Jun 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
166 commits
Select commit Hold shift + click to select a range
ea64917
feat:n-input Support hidden password
doom-9 Jun 17, 2021
149d8e6
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 17, 2021
8664169
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 18, 2021
0627777
feat(form): support require-mark-placement(#171)
doom-9 Jun 18, 2021
f9729c8
Revert "feat(form): support require-mark-placement(#171)"
doom-9 Jun 18, 2021
2566db7
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 18, 2021
aa41027
Revert "feat:n-input Support hidden password"
doom-9 Jun 18, 2021
3f01195
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 18, 2021
076c432
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 21, 2021
2307ef8
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 21, 2021
d4f08f8
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 21, 2021
56f6d75
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 22, 2021
658835d
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 22, 2021
3d90083
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 22, 2021
1e860cc
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 23, 2021
c1c7942
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 23, 2021
0cb198e
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 24, 2021
71ad4cd
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 24, 2021
cd8476a
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 25, 2021
ac74273
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 26, 2021
e685823
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 28, 2021
2a450f1
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 28, 2021
b02f5f8
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 29, 2021
4f151e7
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 29, 2021
b8cf341
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 29, 2021
c7fa132
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 30, 2021
d7348e6
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 1, 2021
c504c72
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 1, 2021
c14f943
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 1, 2021
23da897
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 2, 2021
eb86273
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 2, 2021
ba7fdda
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 2, 2021
51430c2
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 3, 2021
f25cbf3
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 3, 2021
bfdf90f
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 3, 2021
36939e1
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 4, 2021
244ea96
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 4, 2021
a445262
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 5, 2021
43a5740
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 5, 2021
8c53a25
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 5, 2021
bdddc47
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 6, 2021
c4b7311
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 6, 2021
3ac6a8a
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 7, 2021
9c59190
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 8, 2021
988f21f
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 8, 2021
f6a3a9c
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 9, 2021
c1e42a7
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 10, 2021
4e65da9
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 11, 2021
bd7b76c
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 12, 2021
22576d3
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 13, 2021
a3e4ecb
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 15, 2021
89b4729
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 16, 2021
c603d61
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 17, 2021
4536c5a
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 22, 2021
b9b72a4
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 24, 2021
69ef0b6
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 26, 2021
2f3f242
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 27, 2021
cde10b4
Merge branch 'TuSimple:main' into main
doom-9-zz Jul 30, 2021
3d370f7
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 2, 2021
182f166
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 3, 2021
b9ac1d9
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 8, 2021
a77df05
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 9, 2021
59de411
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 10, 2021
1d21533
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 11, 2021
ae2e706
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 12, 2021
4a93636
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 13, 2021
f5f59c5
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 16, 2021
de2aa61
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 18, 2021
e9c17d4
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 20, 2021
4b88be4
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 21, 2021
ddb72e0
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 23, 2021
2fc986b
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 25, 2021
80a016c
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 26, 2021
d2afcd9
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 30, 2021
a1ebf69
Merge branch 'TuSimple:main' into main
doom-9-zz Aug 31, 2021
98c953c
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 1, 2021
2c759c4
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 2, 2021
ede7006
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 3, 2021
d49332c
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 4, 2021
4849399
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 6, 2021
2cab16e
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 9, 2021
2a54fd7
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 10, 2021
f302028
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 12, 2021
8ba779c
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 13, 2021
1b770b3
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 14, 2021
40395dc
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 15, 2021
74e65b8
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 16, 2021
dc31190
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 18, 2021
f23518f
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 22, 2021
1af12fb
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 23, 2021
536c07b
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 24, 2021
52f8b2a
Merge branch 'TuSimple:main' into main
doom-9-zz Sep 27, 2021
983be14
Merge branch 'TuSimple:main' into main
doom-9-zz Oct 8, 2021
0f27d13
Merge branch 'TuSimple:main' into main
doom-9-zz Oct 9, 2021
89b56c7
Merge branch 'TuSimple:main' into main
doom-9-zz Oct 15, 2021
beaa1df
Merge branch 'TuSimple:main' into main
doom-9-zz Oct 18, 2021
7295d08
Merge branch 'TuSimple:main' into main
doom-9-zz Oct 19, 2021
15114a1
test(dialog): Update dialog component test (#1404)
songjianet Oct 21, 2021
9912c91
test(data-table): update test (#1411)
XieZongChen Oct 21, 2021
127928e
Merge branch 'TuSimple:main' into main
doom-9-zz Oct 21, 2021
d5583a7
fix
doom-9 Oct 29, 2021
97e20de
Merge branch 'TuSimple:main' into main
doom-9-zz Oct 29, 2021
87e531d
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 5, 2021
d91cb3f
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 11, 2021
c57bf86
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 14, 2021
e8d8fab
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 15, 2021
2b9824d
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 17, 2021
20f683c
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 18, 2021
63635cd
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 19, 2021
30ea08c
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 23, 2021
1918226
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 25, 2021
5f8c96f
Merge branch 'TuSimple:main' into main
doom-9-zz Nov 28, 2021
9a6ac51
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 2, 2021
da45f6c
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 6, 2021
e08c254
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 13, 2021
d5e6679
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 15, 2021
4699d9f
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 17, 2021
c4707dc
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 23, 2021
6919c6c
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 27, 2021
94403a8
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 27, 2021
8204e90
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 28, 2021
c5e40fb
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 29, 2021
f9035bc
Merge branch 'TuSimple:main' into main
doom-9-zz Dec 30, 2021
438bec7
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 4, 2022
b281775
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 5, 2022
fc00eaf
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 6, 2022
d9b2067
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 7, 2022
f62ec45
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 10, 2022
646418f
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 11, 2022
c682f90
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 12, 2022
631d846
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 12, 2022
449d771
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 13, 2022
168a24d
Merge branch 'TuSimple:main' into main
doom-9-zz Jan 20, 2022
9a296ef
Merge branch 'TuSimple:main' into main
doom-9-zz Feb 9, 2022
e69e5e9
Merge branch 'TuSimple:main' into main
doom-9-zz Feb 11, 2022
229a136
Merge branch 'TuSimple:main' into main
doom-9-zz Feb 13, 2022
fd68aab
Merge branch 'TuSimple:main' into main
doom-9-zz Feb 13, 2022
3f21720
Merge branch 'TuSimple:main' into main
doom-9-zz Feb 21, 2022
1d91714
Merge branch 'TuSimple:main' into main
doom-9-zz Feb 22, 2022
d3728bb
Merge branch 'TuSimple:main' into main
doom-9-zz Feb 24, 2022
cec0867
Merge branch 'TuSimple:main' into main
doom-9-zz Mar 1, 2022
30b8e52
Merge branch 'TuSimple:main' into main
doom-9-zz Mar 4, 2022
98ba9f0
Merge branch 'TuSimple:main' into main
doom-9-zz Mar 7, 2022
9ddfde6
Merge branch 'TuSimple:main' into main
doom-9-zz Mar 8, 2022
30a4819
Merge branch 'TuSimple:main' into main
doom-9-zz Mar 9, 2022
07e3fb4
Merge branch 'TuSimple:main' into main
doom-9-zz Mar 11, 2022
acd3c73
Merge branch 'TuSimple:main' into main
doom-9-zz Mar 18, 2022
03897f0
Merge branch 'TuSimple:main' into main
doom-9-zz Mar 19, 2022
0212945
Merge branch 'TuSimple:main' into main
doom-9-zz Apr 2, 2022
be9c55b
Merge branch 'TuSimple:main' into main
doom-9-zz Apr 13, 2022
f12e8e1
Merge branch 'TuSimple:main' into main
doom-9-zz Apr 16, 2022
de30051
Merge branch 'TuSimple:main' into main
doom-9-zz Apr 25, 2022
bf19e4f
Merge branch 'TuSimple:main' into main
doom-9-zz May 25, 2022
99fde1b
Merge branch 'TuSimple:main' into main
doom-9-zz May 27, 2022
db78827
Merge branch 'TuSimple:main' into main
doom-9-zz May 31, 2022
8899d04
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 9, 2022
6bd4caf
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 13, 2022
fbb5797
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 14, 2022
674f4ba
Merge branch 'TuSimple:main' into main
doom-9-zz Jun 15, 2022
b833f25
图片懒加载
doom-9-zz Jun 13, 2022
e757830
添加debug
doom-9-zz Jun 13, 2022
f5d06fc
完善
doom-9-zz Jun 15, 2022
291d814
添加demo文件
doom-9-zz Jun 15, 2022
9c7ba37
changelog
doom-9-zz Jun 15, 2022
9ba60d0
更新DOM后才开始执行
doom-9-zz Jun 15, 2022
21bcc0d
Merge branch 'main' into feat(image)-支持懒加载
07akioni Jun 19, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.en-US.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

### Feats

- 🌟 `n-image` adds `lazy` prop, closes [#3055](https://github.com/TuSimple/naive-ui/issues/3055).
- Exports `NTooltipInst` type.
- `n-data-table` adds `render-cell` prop, closes [#3095](https://github.com/TuSimple/naive-ui/issues/3095).
- `n-space` adds `wrap-item` prop.
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

### Feats

- 🌟 `n-image` 新增 `lazy` 属性,关闭 [#3055](https://github.com/TuSimple/naive-ui/issues/3055)
- 导出 `NTooltipInst` 类型
- `n-data-table` 新增 `render-cell` 属性,关闭 [#3095](https://github.com/TuSimple/naive-ui/issues/3095)
- `n-space` 新增 `wrap-item` 属性
Expand Down
1 change: 1 addition & 0 deletions src/image/demos/enUS/index.demo-entry.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ error.vue
preview-disabled.vue
custom.vue
tooltip.vue
lazy.vue
```

## API
Expand Down
16 changes: 16 additions & 0 deletions src/image/demos/enUS/lazy.demo.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<markdown>
# lazyLoad
</markdown>

<template>
<n-image
v-for="(item, index) in Array(50)"
:key="index"
width="100"
src="https://07akioni.oss-cn-beijing.aliyuncs.com/07akioni.jpeg"
lazy
:lazy-options="{
root: '.n-layout--static-positioned'
}"
/>
</template>
1 change: 1 addition & 0 deletions src/image/demos/zhCN/index.demo-entry.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ preview-disabled.vue
custom.vue
tooltip.vue
full-debug.vue
lazy.vue
```

## API
Expand Down
16 changes: 16 additions & 0 deletions src/image/demos/zhCN/lazy.demo.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<markdown>
# 懒加载
</markdown>

<template>
<n-image
v-for="(item, index) in Array(50)"
:key="index"
width="100"
src="https://07akioni.oss-cn-beijing.aliyuncs.com/07akioni.jpeg"
lazy
:lazy-options="{
root: '.n-layout--static-positioned'
}"
/>
</template>
33 changes: 31 additions & 2 deletions src/image/src/Image.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@ import {
toRef,
watchEffect,
ImgHTMLAttributes,
onMounted
onMounted,
onBeforeUnmount,
watchPostEffect
} from 'vue'
import NImagePreview from './ImagePreview'
import type { ImagePreviewInst } from './ImagePreview'
import { imageGroupInjectionKey } from './ImageGroup'
import type { ExtractPublicPropTypes } from '../../_utils'
import { useConfig } from '../../_mixins'
import { imagePreviewSharedProps } from './interface'
import { imgObserverHandler, imgUnobserverHandler } from './utils'

export interface ImageInst {
click: () => void
Expand All @@ -24,6 +27,10 @@ const imageProps = {
alt: String,
height: [String, Number] as PropType<string | number>,
imgProps: Object as PropType<ImgHTMLAttributes>,
lazy: Boolean,
lazyOptions: Object as PropType<{
root: string
}>,
objectFit: {
type: String as PropType<
'fill' | 'contain' | 'cover' | 'none' | 'scale-down'
Expand Down Expand Up @@ -77,6 +84,21 @@ export default defineComponent({
imageGroupHandle?.groupId || ''
)
})

watchPostEffect(() => {
if (props.lazy) {
imgObserverHandler(imageRef.value, props.lazyOptions?.root)
} else {
imgUnobserverHandler(imageRef.value)
}
})

onBeforeUnmount(() => {
if (props.lazy) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

如果一开始 lazy 最后不 lazy 就泄漏了

imgUnobserverHandler(imageRef.value)
}
})

watchEffect(() => {
void props.src
void props.imgProps?.src
Expand Down Expand Up @@ -112,7 +134,13 @@ export default defineComponent({
ref="imageRef"
width={this.width || imgProps.width}
height={this.height || imgProps.height}
src={this.showError ? this.fallbackSrc : this.src || imgProps.src}
src={
this.showError
? this.fallbackSrc
: this.lazy
? undefined
: this.src || imgProps.src
}
alt={this.alt || imgProps.alt}
aria-label={this.alt || imgProps.alt}
onClick={this.click}
Expand All @@ -121,6 +149,7 @@ export default defineComponent({
style={[imgProps.style || '', { objectFit: this.objectFit }]}
data-error={this.showError}
data-preview-src={this.previewSrc || this.src}
data-src={this.src || imgProps.src}
/>
)

Expand Down
42 changes: 42 additions & 0 deletions src/image/src/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
let imgObserver: IntersectionObserver | null = null

let imgObserverOptions: {
root: HTMLElement | null
} | null

const imgObserverCallback: IntersectionObserverCallback = (entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const img = entry.target as HTMLImageElement
if (!img.src) {
img.src = img.dataset.src || ''
}
}
})
}

export const imgObserverHandler: (
el: HTMLImageElement | null,
root?: string
) => void = (el, root = 'body') => {
if (el === null) return
if (imgObserver === null) {
imgObserverOptions = {
root: document.querySelector(root)
}
imgObserver = new IntersectionObserver(
imgObserverCallback,
imgObserverOptions
)
}
imgObserver.observe(el)
}

export const imgUnobserverHandler: (el: HTMLImageElement | null) => void = (
el
) => {
if (el === null) return
if (imgObserver) {
imgObserver.unobserve(el)
}
}