diff --git a/src/packages/infiniteloading/__tests__/infiniteloading.spec.tsx b/src/packages/infiniteloading/__tests__/infiniteloading.spec.tsx
index e845b74aa9..cafd72b3c7 100644
--- a/src/packages/infiniteloading/__tests__/infiniteloading.spec.tsx
+++ b/src/packages/infiniteloading/__tests__/infiniteloading.spec.tsx
@@ -1,9 +1,10 @@
import * as React from 'react'
-import { render, waitFor } from '@testing-library/react'
+import { act, render, waitFor } from '@testing-library/react'
import { trigger, triggerDrag } from '@/utils/test/event'
import '@testing-library/jest-dom'
import { InfiniteLoading } from '../infiniteloading'
+import { sleep } from '@/utils/sleep'
test('pull base', () => {
const refresh = jest.fn()
@@ -26,33 +27,6 @@ test('pull base', () => {
expect(refresh).toBeCalled()
})
-test('pull base 01', async () => {
- const done = jest.fn()
- const refresh = (done: () => void) => {
- setTimeout(() => {
- done()
- }, 10)
- }
- const { container } = render(
-
- )
- const track = container.querySelector('.nut-infiniteloading')
-
- // pulling
- trigger(track, 'touchstart', 0, 0)
- trigger(track, 'touchmove', 0, 20)
- expect(container).toMatchSnapshot()
-
- // loading
- trigger(track, 'touchend', 0, 100)
- expect(container).toMatchSnapshot()
-
- // still loading
- triggerDrag(track, 0, 100)
- refresh(done)
- await waitFor(() => expect(done).toHaveBeenCalled())
-})
-
test('pull base 03', () => {
const refresh = jest.fn()
const { container } = render(
@@ -98,19 +72,17 @@ test('infiniteloading base 01', async () => {
setRefreshList([...refreshList])
}
- const refreshLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = refreshList.length
- for (let i = curLen; i < curLen + 10; i++) {
- refreshList.push(`${i}`)
- }
- if (refreshList.length >= 300) {
- setRefreshHasMore(false)
- } else {
- setRefreshList([...refreshList])
- }
- done()
- }, 500)
+ const refreshLoadMore = async () => {
+ await sleep(10)
+ const curLen = refreshList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ refreshList.push(`${i}`)
+ }
+ if (refreshList.length >= 300) {
+ setRefreshHasMore(false)
+ } else {
+ setRefreshList([...refreshList])
+ }
}
return (
{
setRefreshList([...refreshList])
}
- const refreshLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = refreshList.length
- for (let i = curLen; i < curLen + 10; i++) {
- refreshList.push(`${i}`)
- }
- if (refreshList.length >= 30) {
- setRefreshHasMore(false)
- } else {
- setRefreshList([...refreshList])
- }
- done()
- }, 500)
+ const refreshLoadMore = async () => {
+ await sleep(100)
+ const curLen = refreshList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ refreshList.push(`${i}`)
+ }
+ if (refreshList.length >= 30) {
+ setRefreshHasMore(false)
+ } else {
+ setRefreshList([...refreshList])
+ }
}
return (
{
expect(container).toMatchSnapshot()
await waitFor(() => expect(done).toHaveBeenCalled())
})
+
+test('hasMore false', () => {
+ const done = jest.fn()
+ const { container: container1, rerender } = render(
+
+ {Array.from({ length: 100 })
+ .fill('NutUI')
+ .map((item: string, index) => {
+ return (
+
+ {item}
+
+ )
+ })}
+
+ )
+ const track1 = container1.querySelector('.nut-infiniteloading')
+ trigger(track1, 'scroll', 0, 100)
+})
+
+test('hasMore', () => {
+ const done = jest.fn()
+ const { container } = render(
+
+ {Array.from({ length: 100 })
+ .fill('NutUI')
+ .map((item: string, index) => {
+ return (
+
+ {item}
+
+ )
+ })}
+
+ )
+ const track1 = container.querySelector('.nut-infiniteloading')
+ act(() => {
+ trigger(track1, 'scroll', 0, 100)
+ })
+
+ waitFor(() => {
+ expect(done).toBeCalled()
+ })
+})
+
+test('pull base 01', async () => {
+ const refresh = async () => {
+ await sleep(10)
+ }
+ const { container } = render(
+
+ )
+ const track = container.querySelector('.nut-infiniteloading')
+
+ // pulling
+ trigger(track, 'touchstart', 0, 0)
+ trigger(track, 'touchmove', 0, 20)
+ expect(container).toMatchSnapshot()
+
+ // loading
+ trigger(track, 'touchend', 0, 100)
+ expect(container).toMatchSnapshot()
+})
diff --git a/src/packages/infiniteloading/demo.taro.tsx b/src/packages/infiniteloading/demo.taro.tsx
index 499c20295b..edb0a43282 100644
--- a/src/packages/infiniteloading/demo.taro.tsx
+++ b/src/packages/infiniteloading/demo.taro.tsx
@@ -5,6 +5,7 @@ import { useTranslate } from '@/sites/assets/locale/taro'
import { InfiniteLoading, Cell } from '@/packages/nutui.react.taro'
import '@/packages/infiniteloading/demo.scss'
import Header from '@/sites/components/header'
+import { sleep } from '@/utils/sleep'
interface T {
'83913e71': string
@@ -12,6 +13,7 @@ interface T {
eb4236fe: string
'1254a90a': string
}
+
const InfiniteLoadingDemo = () => {
const [translated] = useTranslate({
'zh-CN': {
@@ -41,30 +43,26 @@ const InfiniteLoadingDemo = () => {
init()
}, [])
- const loadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = defaultList.length
- for (let i = curLen; i < curLen + 10; i++) {
- defaultList.push(`${i}`)
- }
- if (defaultList.length >= 100) {
- setHasMore(false)
- } else {
- setDefaultList([...defaultList])
- }
- done()
- }, 500)
+ const loadMore = async () => {
+ await sleep(2000)
+ const curLen = defaultList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ defaultList.push(`${i}`)
+ }
+ if (defaultList.length >= 100) {
+ setHasMore(false)
+ } else {
+ setDefaultList([...defaultList])
+ }
}
- const refresh = (done: () => void) => {
- setTimeout(() => {
- Taro.showToast({
- title: translated['83913e71'],
- icon: 'success',
- duration: 2000,
- })
- done()
- }, 1000)
+ const refresh = async () => {
+ await sleep(2000)
+ Taro.showToast({
+ title: translated['83913e71'],
+ icon: 'success',
+ duration: 2000,
+ })
}
const init = () => {
diff --git a/src/packages/infiniteloading/demo.tsx b/src/packages/infiniteloading/demo.tsx
index abe4e44ce4..d5aca9f141 100644
--- a/src/packages/infiniteloading/demo.tsx
+++ b/src/packages/infiniteloading/demo.tsx
@@ -5,6 +5,7 @@ import { InfiniteLoading } from './infiniteloading'
import Cell from '@/packages/cell'
import Toast from '@/packages/toast'
import './demo.scss'
+import { sleep } from '@/utils/sleep'
interface T {
'83913e71': string
@@ -14,6 +15,7 @@ interface T {
'1254a90a': string
'1254a90n': string
}
+
const InfiniteloadingDemo = () => {
const [translated] = useTranslate({
'zh-CN': {
@@ -55,71 +57,63 @@ const InfiniteloadingDemo = () => {
init()
}, [])
- const loadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = defaultList.length
- for (let i = curLen; i < curLen + 10; i++) {
- defaultList.push(`${i}`)
- }
- if (defaultList.length >= 30) {
- setHasMore(false)
- } else {
- setDefaultList([...defaultList])
- }
- done()
- }, 500)
+ const loadMore = async () => {
+ await sleep(2000)
+ // setTimeout(() => {
+ const curLen = defaultList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ defaultList.push(`${i}`)
+ }
+ if (defaultList.length >= 30) {
+ setHasMore(false)
+ } else {
+ setDefaultList([...defaultList])
+ }
+ // }, 500)
}
- const refreshLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = refreshList.length
- for (let i = curLen; i < curLen + 10; i++) {
- refreshList.push(`${i}`)
- }
- if (refreshList.length >= 30) {
- setRefreshHasMore(false)
- } else {
- setRefreshList([...refreshList])
- }
- done()
- }, 500)
+ const refreshLoadMore = async () => {
+ await sleep(2000)
+ const curLen = refreshList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ refreshList.push(`${i}`)
+ }
+ if (refreshList.length >= 30) {
+ setRefreshHasMore(false)
+ } else {
+ setRefreshList([...refreshList])
+ }
}
- const customLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = customList.length
- for (let i = curLen; i < curLen + 10; i++) {
- customList.push(`${i}`)
- }
- if (customList.length >= 30) {
- setCustomHasMore(false)
- } else {
- setCustomList([...customList])
- }
- done()
- }, 500)
+ const customLoadMore = async () => {
+ await sleep(2000)
+ const curLen = customList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ customList.push(`${i}`)
+ }
+ if (customList.length >= 30) {
+ setCustomHasMore(false)
+ } else {
+ setCustomList([...customList])
+ }
}
- const windowLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = windowList.length
- for (let i = curLen; i < curLen + 10; i++) {
- windowList.push(`${i}`)
- }
- if (windowList.length >= 300) {
- setWindowHasMore(false)
- } else {
- setWindowList([...windowList])
- }
- done()
- }, 500)
+ const windowLoadMore = async () => {
+ await sleep(2000)
+ const curLen = windowList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ windowList.push(`${i}`)
+ }
+ if (windowList.length >= 300) {
+ setWindowHasMore(false)
+ } else {
+ setWindowList([...windowList])
+ }
}
- const refresh = (done: () => void) => {
- setTimeout(() => {
- Toast.show(translated['83913e71'])
- done()
- }, 1000)
+ const refresh = async () => {
+ await sleep(1000)
+ Toast.show(translated['83913e71'])
}
const init = () => {
diff --git a/src/packages/infiniteloading/doc.en-US.md b/src/packages/infiniteloading/doc.en-US.md
index ade89976f4..5e5082b6ee 100644
--- a/src/packages/infiniteloading/doc.en-US.md
+++ b/src/packages/infiniteloading/doc.en-US.md
@@ -20,6 +20,8 @@ import { InfiniteLoading } from '@nutui/nutui-react'
import React, { useState, useEffect } from 'react'
import { Cell, InfiniteLoading } from '@nutui/nutui-react'
+const sleep = (time: number): Promise =>
+ new Promise((resolve) => {setTimeout(resolve, time)})
const InfiniteUlStyle = {
height: '300px',
width: '100%',
@@ -42,19 +44,17 @@ const App = () => {
init()
}, [])
- const loadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = defaultList.length
- for (let i = curLen; i < curLen + 10; i++) {
- defaultList.push(`${i}`)
- }
- if (defaultList.length >= 30) {
- setHasMore(false)
- } else {
- setDefaultList([...defaultList])
- }
- done()
- }, 500)
+ const loadMore = async () => {
+ await sleep(2000)
+ const curLen = defaultList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ defaultList.push(`${i}`)
+ }
+ if (defaultList.length >= 30) {
+ setHasMore(false)
+ } else {
+ setDefaultList([...defaultList])
+ }
}
const init = () => {
@@ -101,6 +101,8 @@ import React, { useState, useEffect } from 'react'
import { Cell, InfiniteLoading } from '@nutui/nutui-react'
import { Jd } from '@nutui/icons-react'
+const sleep = (time: number): Promise =>
+ new Promise((resolve) => {setTimeout(resolve, time)})
const InfiniteUlStyle = {
height: '300px',
width: '100%',
@@ -130,26 +132,22 @@ const App = () => {
setRefreshList([...refreshList])
}
- const refreshLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = refreshList.length
- for (let i = curLen; i < curLen + 10; i++) {
- refreshList.push(`${i}`)
- }
- if (refreshList.length >= 30) {
- setRefreshHasMore(false)
- } else {
- setRefreshList([...refreshList])
- }
- done()
- }, 500)
+ const refreshLoadMore = async () => {
+ await sleep(2000)
+ const curLen = refreshList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ refreshList.push(`${i}`)
+ }
+ if (refreshList.length >= 30) {
+ setRefreshHasMore(false)
+ } else {
+ setRefreshList([...refreshList])
+ }
}
- const refresh = (done: () => void) => {
- setTimeout(() => {
- Toast.show('Refresh success!')
- done()
- }, 1000)
+ const refresh = async () => {
+ await sleep(1000)
+ Toast.show('刷新成功')
}
return (
@@ -197,6 +195,8 @@ export default App
import React, { useState, useEffect } from 'react'
import { Cell, InfiniteLoading } from '@nutui/nutui-react'
+const sleep = (time: number): Promise =>
+ new Promise((resolve) => {setTimeout(resolve, time)})
const InfiniteUlStyle = {
height: '300px',
width: '100%',
@@ -226,19 +226,17 @@ const App = () => {
setCustomList([...customList])
}
- const customLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = customList.length
- for (let i = curLen; i < curLen + 10; i++) {
- customList.push(`${i}`)
- }
- if (customList.length >= 30) {
- setCustomHasMore(false)
- } else {
- setCustomList([...customList])
- }
- done()
- }, 500)
+ const customLoadMore = async () => {
+ await sleep(2000)
+ const curLen = customList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ customList.push(`${i}`)
+ }
+ if (customList.length >= 30) {
+ setCustomHasMore(false)
+ } else {
+ setCustomList([...customList])
+ }
}
return (
@@ -280,6 +278,8 @@ export default App
import React, { useState, useEffect } from 'react'
import { Cell, InfiniteLoading } from '@nutui/nutui-react'
+const sleep = (time: number): Promise =>
+ new Promise((resolve) => {setTimeout(resolve, time)})
const InfiniteUlStyle = {
width: '100%',
padding: '0',
@@ -308,19 +308,17 @@ const App = () => {
setCustomList([...customList])
}
- const customLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = customList.length
- for (let i = curLen; i < curLen + 10; i++) {
- customList.push(`${i}`)
- }
- if (customList.length >= 30) {
- setCustomHasMore(false)
- } else {
- setCustomList([...customList])
- }
- done()
- }, 500)
+ const customLoadMore = async () => {
+ await sleep(2000)
+ const curLen = customList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ customList.push(`${i}`)
+ }
+ if (customList.length >= 30) {
+ setCustomHasMore(false)
+ } else {
+ setCustomList([...customList])
+ }
}
return (
@@ -366,8 +364,8 @@ export default App
| pullRefresh | Enable pull refresh | `boolean` | `false` |
| pullingText | Pull refresh text | `ReactNode` | `Let go and refresh` |
| loadingText | Pull on loading text | `ReactNode` | `loading...` |
-| onRefresh | Pull down refresh event callback | `(param: () => void) => void` | `-` |
-| onLoadMore | Callback function to continue loading | `(param: () => void) => void` | `-` |
+| onRefresh | Pull down refresh event callback | `() => Promise` | `-` |
+| onLoadMore | Callback function to continue loading | `() => Promise` | `-` |
| onScroll | Monitor scroll height in real time | `(param: number) => void` | `-` |
## Theming
diff --git a/src/packages/infiniteloading/doc.md b/src/packages/infiniteloading/doc.md
index 9c5623e34c..61b17ae7e9 100644
--- a/src/packages/infiniteloading/doc.md
+++ b/src/packages/infiniteloading/doc.md
@@ -20,6 +20,8 @@ import { InfiniteLoading } from '@nutui/nutui-react'
import React, { useState, useEffect } from 'react'
import { Cell, InfiniteLoading } from '@nutui/nutui-react'
+const sleep = (time: number): Promise =>
+ new Promise((resolve) => {setTimeout(resolve, time)})
const InfiniteUlStyle = {
height: '300px',
width: '100%',
@@ -42,19 +44,17 @@ const App = () => {
init()
}, [])
- const loadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = defaultList.length
- for (let i = curLen; i < curLen + 10; i++) {
- defaultList.push(`${i}`)
- }
- if (defaultList.length >= 30) {
- setHasMore(false)
- } else {
- setDefaultList([...defaultList])
- }
- done()
- }, 500)
+ const loadMore = async () => {
+ await sleep(2000)
+ const curLen = defaultList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ defaultList.push(`${i}`)
+ }
+ if (defaultList.length >= 30) {
+ setHasMore(false)
+ } else {
+ setDefaultList([...defaultList])
+ }
}
const init = () => {
@@ -145,6 +145,8 @@ import React, { useState, useEffect } from 'react'
import { Cell, InfiniteLoading } from '@nutui/nutui-react'
import { Jd } from '@nutui/icons-react'
+const sleep = (time: number): Promise =>
+ new Promise((resolve) => {setTimeout(resolve, time)})
const InfiniteUlStyle = {
height: '300px',
width: '100%',
@@ -174,26 +176,22 @@ const App = () => {
setRefreshList([...refreshList])
}
- const refreshLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = refreshList.length
- for (let i = curLen; i < curLen + 10; i++) {
- refreshList.push(`${i}`)
- }
- if (refreshList.length >= 30) {
- setRefreshHasMore(false)
- } else {
- setRefreshList([...refreshList])
- }
- done()
- }, 500)
+ const refreshLoadMore = async () => {
+ await sleep(2000)
+ const curLen = refreshList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ refreshList.push(`${i}`)
+ }
+ if (refreshList.length >= 30) {
+ setRefreshHasMore(false)
+ } else {
+ setRefreshList([...refreshList])
+ }
}
- const refresh = (done: () => void) => {
- setTimeout(() => {
- Toast.show('刷新成功')
- done()
- }, 1000)
+ const refresh = async () => {
+ await sleep(1000)
+ Toast.show('刷新成功')
}
return (
@@ -254,6 +252,8 @@ export default App
import React, { useState, useEffect } from 'react'
import { Cell, InfiniteLoading } from '@nutui/nutui-react'
+const sleep = (time: number): Promise =>
+ new Promise((resolve) => {setTimeout(resolve, time)})
const InfiniteUlStyle = {
height: '300px',
width: '100%',
@@ -283,30 +283,28 @@ const App = () => {
setCustomList([...customList])
}
- const customLoadMore = (done: () => void) => {
- setTimeout(() => {
- const curLen = customList.length
- for (let i = curLen; i < curLen + 10; i++) {
- customList.push(`${i}`)
- }
- if (customList.length >= 30) {
- setCustomHasMore(false)
- } else {
- setCustomList([...customList])
- }
- done()
- }, 500)
+ const customLoadMore = async () => {
+ await sleep(2000)
+ const curLen = customList.length
+ for (let i = curLen; i < curLen + 10; i++) {
+ customList.push(`${i}`)
+ }
+ if (customList.length >= 30) {
+ setCustomHasMore(false)
+ } else {
+ setCustomList([...customList])
+ }
}
return (
<>
自定义加载文案
- |