+
+
+
+
+ 南京市
+
+
+ 无锡市
+
+
+ 海北藏族自治区
+
+
+ 北京市
+
+
+ 连云港市
+
+
+ 大庆市
+
+
+ 绥化市
+
+
+ 潍坊市
+
+
+ 乌鲁木齐市
+
+
+
+
+
+
+
+`;
+
exports[`should match snapshot 1`] = `
{
)
expect(container).toMatchSnapshot()
+ expect(screen.getByText('南京市')).toBeInTheDocument()
})
test('should render tiled', () => {
@@ -115,7 +116,17 @@ test('should render with Multi Column', () => {
const { container } = render(
)
- expect(container.querySelectorAll('.nut-pickerview-list').length).toBe(2)
+ const columns = container.querySelectorAll('.nut-pickerview-list')
+ expect(columns.length).toBe(2)
+
+ // 检查列内容
+ const firstColumn = columns[0]
+ expect(firstColumn.textContent).toContain('周一')
+ expect(firstColumn.textContent).toContain('周二')
+
+ const secondColumn = columns[1]
+ expect(secondColumn.textContent).toContain('上午')
+ expect(secondColumn.textContent).toContain('下午')
expect(container).toMatchSnapshot()
})
@@ -123,15 +134,29 @@ test('should match onchange', async () => {
const PenderContent = () => {
const [value, setValue] = useState([1])
- setTimeout(() => {
- setValue([2])
- }, 1000)
+ useEffect(() => {
+ setTimeout(() => {
+ setValue([3])
+ }, 1000)
+ }, [])
- return
+ return (
+
{
+ if (value[0] === 3) {
+ setValue([1])
+ }
+ }}
+ />
+ )
}
const container = render()
- expect(container).toMatchSnapshot()
+ await waitFor(() => {
+ expect(container).toMatchSnapshot()
+ })
})
test('should match cascade', () => {
diff --git a/src/packages/pickerview/demo.taro.tsx b/src/packages/pickerview/demo.taro.tsx
index 73487d67b0..8f34000096 100644
--- a/src/packages/pickerview/demo.taro.tsx
+++ b/src/packages/pickerview/demo.taro.tsx
@@ -9,6 +9,7 @@ import Demo3 from './demos/taro/demo3'
import Demo4 from './demos/taro/demo4'
import Demo5 from './demos/taro/demo5'
import Demo6 from './demos/taro/demo6'
+import Demo7 from './demos/taro/demo7'
const PickerViewDemo = () => {
const [translated] = useTranslate({
@@ -19,6 +20,7 @@ const PickerViewDemo = () => {
controlled: '受控',
tiled: '平铺',
cascade: '级联',
+ asynchronous: '异步数据',
},
'en-US': {
title: 'Basic Usage',
@@ -27,6 +29,7 @@ const PickerViewDemo = () => {
controlled: 'Controlled',
tiled: 'Tiled',
cascade: 'Cascade',
+ asynchronous: 'Asynchronous',
},
'zh-TW': {
title: '基礎用法',
@@ -35,6 +38,7 @@ const PickerViewDemo = () => {
controlled: '受控',
tiled: '平鋪',
cascade: '級聯',
+ asynchronous: '異步數據',
},
})
return (
@@ -53,6 +57,8 @@ const PickerViewDemo = () => {
{translated.cascade}
+ {translated.asynchronous}
+
>
)
diff --git a/src/packages/pickerview/demo.tsx b/src/packages/pickerview/demo.tsx
index b94f91de80..8d95022679 100644
--- a/src/packages/pickerview/demo.tsx
+++ b/src/packages/pickerview/demo.tsx
@@ -6,6 +6,7 @@ import Demo3 from './demos/h5/demo3'
import Demo4 from './demos/h5/demo4'
import Demo5 from './demos/h5/demo5'
import Demo6 from './demos/h5/demo6'
+import Demo7 from './demos/h5/demo7'
const PickerViewDemo = () => {
const [translated] = useTranslate({
@@ -16,6 +17,7 @@ const PickerViewDemo = () => {
controlled: '受控',
tiled: '平铺',
cascade: '级联',
+ asynchronous: '异步数据',
},
'en-US': {
title: 'Basic Usage',
@@ -24,6 +26,7 @@ const PickerViewDemo = () => {
controlled: 'Controlled',
tiled: 'Tiled',
cascade: 'Cascade',
+ asynchronous: 'Asynchronous',
},
'zh-TW': {
title: '基礎用法',
@@ -32,6 +35,7 @@ const PickerViewDemo = () => {
controlled: '受控',
tiled: '平鋪',
cascade: '級聯',
+ asynchronous: '異步數據',
},
})
return (
@@ -48,6 +52,8 @@ const PickerViewDemo = () => {
{translated.cascade}
+ {translated.asynchronous}
+
)
}
diff --git a/src/packages/pickerview/demos/h5/demo7.tsx b/src/packages/pickerview/demos/h5/demo7.tsx
new file mode 100644
index 0000000000..d245a189c5
--- /dev/null
+++ b/src/packages/pickerview/demos/h5/demo7.tsx
@@ -0,0 +1,38 @@
+import React, { useEffect, useState } from 'react'
+import { PickerView, Cell, PickerOptions } from '@nutui/nutui-react'
+
+const Demo7 = () => {
+ const [columnsList, setColumnsList] = useState([] as PickerOptions[])
+
+ useEffect(() => {
+ setTimeout(() => {
+ setColumnsList([
+ [
+ { value: 1, label: '南京市' },
+ { value: 2, label: '无锡市' },
+ { value: 3, label: '海北藏族自治区' },
+ { value: 4, label: '北京市' },
+ { value: 5, label: '连云港市' },
+ { value: 8, label: '大庆市' },
+ { value: 9, label: '绥化市' },
+ { value: 10, label: '潍坊市' },
+ { value: 12, label: '乌鲁木齐市' },
+ ],
+ ])
+ }, 3000)
+ }, [])
+ return (
+ <>
+
+ {
+ console.log('onChange', value, selectedOptions)
+ }}
+ />
+ |
+ >
+ )
+}
+export default Demo7
diff --git a/src/packages/pickerview/demos/taro/demo7.tsx b/src/packages/pickerview/demos/taro/demo7.tsx
new file mode 100644
index 0000000000..a32defecfc
--- /dev/null
+++ b/src/packages/pickerview/demos/taro/demo7.tsx
@@ -0,0 +1,38 @@
+import React, { useEffect, useState } from 'react'
+import { PickerView, Cell, PickerOptions } from '@nutui/nutui-react-taro'
+
+const Demo7 = () => {
+ const [columnsList, setColumnsList] = useState([] as PickerOptions[])
+
+ useEffect(() => {
+ setTimeout(() => {
+ setColumnsList([
+ [
+ { value: 1, label: '南京市' },
+ { value: 2, label: '无锡市' },
+ { value: 3, label: '海北藏族自治区' },
+ { value: 4, label: '北京市' },
+ { value: 5, label: '连云港市' },
+ { value: 8, label: '大庆市' },
+ { value: 9, label: '绥化市' },
+ { value: 10, label: '潍坊市' },
+ { value: 12, label: '乌鲁木齐市' },
+ ],
+ ])
+ }, 3000)
+ }, [])
+ return (
+ <>
+
+ {
+ console.log('onChange', value, selectedOptions)
+ }}
+ />
+ |
+ >
+ )
+}
+export default Demo7
diff --git a/src/packages/pickerview/pickerview.taro.tsx b/src/packages/pickerview/pickerview.taro.tsx
index c13a3c052b..a1ba018910 100644
--- a/src/packages/pickerview/pickerview.taro.tsx
+++ b/src/packages/pickerview/pickerview.taro.tsx
@@ -118,7 +118,8 @@ const InternalPickerView: ForwardRefRenderFunction<
}, [innerValue, options, columnsType])
useEffect(() => {
- if (props.options !== innerOptions) {
+ const options = props.options
+ if (Array.isArray(options) && options.length && options !== innerOptions) {
setInnerOptions(formatOptions as PickerOptions[])
}
}, [props.options, innerValue])
@@ -207,8 +208,12 @@ const InternalPickerView: ForwardRefRenderFunction<
threeDimensional={threeDimensional}
/>
))}
-
-
+ {innerOptions?.length ? (
+ <>
+
+
+ >
+ ) : null}
)
}
diff --git a/src/packages/pickerview/pickerview.tsx b/src/packages/pickerview/pickerview.tsx
index 60b98efe85..66770248c0 100644
--- a/src/packages/pickerview/pickerview.tsx
+++ b/src/packages/pickerview/pickerview.tsx
@@ -117,7 +117,8 @@ const InternalPickerView: ForwardRefRenderFunction<
}, [innerValue, options, columnsType])
useEffect(() => {
- if (props.options !== innerOptions) {
+ const options = props.options
+ if (Array.isArray(options) && options.length && options !== innerOptions) {
setInnerOptions(formatOptions as PickerOptions[])
}
}, [props.options, innerValue])
@@ -206,8 +207,12 @@ const InternalPickerView: ForwardRefRenderFunction<
threeDimensional={threeDimensional}
/>
))}
-
-
+ {innerOptions?.length ? (
+ <>
+
+
+ >
+ ) : null}
)
}
From fe66362d4d9bd81e29569e9591a9e48d385aafaf Mon Sep 17 00:00:00 2001
From: songchenglin3 <353833373@qq.com>
Date: Wed, 12 Feb 2025 14:51:56 +0800
Subject: [PATCH 19/54] fix: update doc
---
src/packages/pickerview/doc.en-US.md | 6 +++---
src/packages/pickerview/doc.md | 5 +++--
src/packages/pickerview/doc.taro.md | 5 +++--
src/packages/pickerview/doc.zh-TW.md | 5 +++--
4 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/src/packages/pickerview/doc.en-US.md b/src/packages/pickerview/doc.en-US.md
index 6ec4aa0aa8..a66464c311 100644
--- a/src/packages/pickerview/doc.en-US.md
+++ b/src/packages/pickerview/doc.en-US.md
@@ -64,20 +64,20 @@ import { Picker } from '@nutui/nutui-react'
| Property | Description | Type | Default |
| --- | --- | --- | --- |
-| options | Tabular data | `Array` | `[]` |
+| options | Tabular data | `PickerOptionItem[][]` | `[]` |
| value | Selected value, controlled | `Array` | `[]` |
| defaultValue | Default value | `Array` | `[]` |
| threeDimensional | Whether to enable 3D effect | `boolean` | `true` |
| duration | The duration of inertial rolling during rapid sliding, in ms | `string` \| `number` | `1000` |
| onChange | Called when the value of each column changes | `({value, index, selectedOptions}) => void` | `-` |
-### options
+### PickerOptionItem
| Property | Description | Type | Default |
| --- | --- | --- | --- |
| label | Text of column | `string` \| `number` | `-` |
| value | Value of column | `string` \| `number` | `-` |
-| children | Cascader Option | `Array` | `-` |
+| children | Cascader Option | `PickerOptionItem[]` | `-` |
## Theming
diff --git a/src/packages/pickerview/doc.md b/src/packages/pickerview/doc.md
index ba0979c327..0ba9af80dc 100644
--- a/src/packages/pickerview/doc.md
+++ b/src/packages/pickerview/doc.md
@@ -64,19 +64,20 @@ import { PickerView } from '@nutui/nutui-react'
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
-| options | 列表数据 | `Array` | `[]` |
+| options | 列表数据 | `PickerOptionItem[][]` | `[]` |
| value | 选中值,受控 | `Array` | `[]` |
| defaultValue | 默认选中 | `Array` | `[]` |
| threeDimensional | 是否开启3D效果 | `boolean` | `true` |
| duration | 快速滑动时惯性滚动的时长,单位 ms | `string` \| `number` | `1000` |
| onChange | 每一列值变更时调用 | `({value, index, selectedOptions}) => void` | `-` |
-### options 数据结构
+### PickerOptionItem
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| label | 选项的文字内容 | `string` \| `number` | `-` |
| value | 选项对应的值,且唯一 | `string` \| `number` | `-` |
+| children | 用于级联选项 | `PickerOptionItem[]` | `-` |
## 主题定制
diff --git a/src/packages/pickerview/doc.taro.md b/src/packages/pickerview/doc.taro.md
index 03fdff98cc..fe1a838aca 100644
--- a/src/packages/pickerview/doc.taro.md
+++ b/src/packages/pickerview/doc.taro.md
@@ -64,19 +64,20 @@ import { PickerView } from '@nutui/nutui-react-taro'
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
-| options | 列表数据 | `Array` | `[]` |
+| options | 列表数据 | `PickerOptionItem[][]` | `[]` |
| value | 选中值,受控 | `Array` | `[]` |
| defaultValue | 默认选中 | `Array` | `[]` |
| threeDimensional | 是否开启3D效果 | `boolean` | `true` |
| duration | 快速滑动时惯性滚动的时长,单位 ms | `string` \| `number` | `1000` |
| onChange | 每一列值变更时调用 | `({value, index, selectedOptions}) => void` | `-` |
-### options 数据结构
+### PickerOptionItem
| 属性 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| label | 选项的文字内容 | `string` \| `number` | `-` |
| value | 选项对应的值,且唯一 | `string` \| `number` | `-` |
+| children | 用于级联选项 | `PickerOptionItem[]` | `-` |
## 主题定制
diff --git a/src/packages/pickerview/doc.zh-TW.md b/src/packages/pickerview/doc.zh-TW.md
index 155b4fc341..aecd67eaff 100644
--- a/src/packages/pickerview/doc.zh-TW.md
+++ b/src/packages/pickerview/doc.zh-TW.md
@@ -64,19 +64,20 @@ import { PickerView } from '@nutui/nutui-react-taro'
| 屬性 | 說明 | 類型 | 默認值 |
| --- | --- | --- | --- |
-| options | 列錶數據 | `Array` | `[]` |
+| options | 列錶數據 | `PickerOptionItem[][]` | `[]` |
| value | 選中值,受控 | `Array` | `[]` |
| defaultValue | 默認選中 | `Array` | `[]` |
| threeDimensional | 是否開啟3D效果 | `boolean` | `true` |
| duration | 快速滑動時慣性滾動的時長,單位 ms | `string` \| `number` | `1000` |
| onChange | 每一列值變更時調用 | `({value, index, selectedOptions}) => void` | `-` |
-### options 數據結構
+### PickerOptionItem
| 屬性 | 說明 | 類型 | 默認值 |
| --- | --- | --- | --- |
| label | 選項的文字內容 | `string` \| `number` | `-` |
| value | 選項對應的值,且唯一 | `string` \| `number` | `-` |
+| children | 用於級聯選項 | `PickerOptionItem[]` | `-` |
## 主題定制
From aa5f2ea93320cf5cb252609ea37269fdb40c151e Mon Sep 17 00:00:00 2001
From: songchenglin3 <353833373@qq.com>
Date: Wed, 12 Feb 2025 15:23:37 +0800
Subject: [PATCH 20/54] =?UTF-8?q?fix:=20=E5=90=8C=E6=AD=A5pickerview?=
=?UTF-8?q?=E5=8F=98=E6=9B=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../__snapshots__/pickerview.spec.tsx.snap | 690 ++++++++++++++++++
.../pickerview/__test__/pickerview.spec.tsx | 169 ++++-
src/packages/pickerview/demo.taro.tsx | 8 +-
src/packages/pickerview/demo.tsx | 6 +
src/packages/pickerview/demos/h5/demo2.tsx | 4 +-
src/packages/pickerview/demos/h5/demo4.tsx | 4 +-
src/packages/pickerview/demos/h5/demo5.tsx | 4 +-
src/packages/pickerview/demos/h5/demo7.tsx | 38 +
src/packages/pickerview/demos/taro/demo2.tsx | 4 +-
src/packages/pickerview/demos/taro/demo4.tsx | 4 +-
src/packages/pickerview/demos/taro/demo5.tsx | 4 +-
src/packages/pickerview/demos/taro/demo7.tsx | 38 +
src/packages/pickerview/doc.en-US.md | 6 +-
src/packages/pickerview/doc.md | 7 +-
src/packages/pickerview/doc.taro.md | 7 +-
src/packages/pickerview/doc.zh-TW.md | 7 +-
src/packages/pickerview/pickerroller.taro.tsx | 2 +-
src/packages/pickerview/pickerroller.tsx | 2 +-
src/packages/pickerview/pickerview.taro.tsx | 19 +-
src/packages/pickerview/pickerview.tsx | 19 +-
20 files changed, 1002 insertions(+), 40 deletions(-)
create mode 100644 src/packages/pickerview/__test__/__snapshots__/pickerview.spec.tsx.snap
create mode 100644 src/packages/pickerview/demos/h5/demo7.tsx
create mode 100644 src/packages/pickerview/demos/taro/demo7.tsx
diff --git a/src/packages/pickerview/__test__/__snapshots__/pickerview.spec.tsx.snap b/src/packages/pickerview/__test__/__snapshots__/pickerview.spec.tsx.snap
new file mode 100644
index 0000000000..0ab994d585
--- /dev/null
+++ b/src/packages/pickerview/__test__/__snapshots__/pickerview.spec.tsx.snap
@@ -0,0 +1,690 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`should handle empty options 1`] = `
+
+`;
+
+exports[`should handle invalid defaultValue 1`] = `
+
+
+
+
+
+ 南京市
+
+
+ 无锡市
+
+
+ 海北藏族自治区
+
+
+ 北京市
+
+
+ 连云港市
+
+
+ 大庆市
+
+
+ 绥化市
+
+
+ 潍坊市
+
+
+ 乌鲁木齐市
+
+
+
+
+
+
+
+`;
+
+exports[`should match cascade 1`] = `
+
+
+
+
+
+ 北京 | 测试
+
+
+ 上海 | 测试
+
+
+
+
+
+
+ 朝阳区 | 测试
+
+
+ 海淀区 | 测试
+
+
+ 大兴区 | 测试
+
+
+ 东城区 | 测试
+
+
+ 西城区 | 测试
+
+
+ 丰台区 | 测试
+
+
+
+
+
+
+
+`;
+
+exports[`should match onchange 1`] = `
+{
+ "asFragment": [Function],
+ "baseElement":
+
+
+
+
+
+ 南京市
+
+
+ 无锡市
+
+
+ 海北藏族自治区
+
+
+ 北京市
+
+
+ 连云港市
+
+
+ 大庆市
+
+
+ 绥化市
+
+
+ 潍坊市
+
+
+ 乌鲁木齐市
+
+
+
+
+
+
+
+ ,
+ "container":
+
+
+
+
+ 南京市
+
+
+ 无锡市
+
+
+ 海北藏族自治区
+
+
+ 北京市
+
+
+ 连云港市
+
+
+ 大庆市
+
+
+ 绥化市
+
+
+ 潍坊市
+
+
+ 乌鲁木齐市
+
+
+
+
+
+
+
,
+ "debug": [Function],
+ "findAllByAltText": [Function],
+ "findAllByDisplayValue": [Function],
+ "findAllByLabelText": [Function],
+ "findAllByPlaceholderText": [Function],
+ "findAllByRole": [Function],
+ "findAllByTestId": [Function],
+ "findAllByText": [Function],
+ "findAllByTitle": [Function],
+ "findByAltText": [Function],
+ "findByDisplayValue": [Function],
+ "findByLabelText": [Function],
+ "findByPlaceholderText": [Function],
+ "findByRole": [Function],
+ "findByTestId": [Function],
+ "findByText": [Function],
+ "findByTitle": [Function],
+ "getAllByAltText": [Function],
+ "getAllByDisplayValue": [Function],
+ "getAllByLabelText": [Function],
+ "getAllByPlaceholderText": [Function],
+ "getAllByRole": [Function],
+ "getAllByTestId": [Function],
+ "getAllByText": [Function],
+ "getAllByTitle": [Function],
+ "getByAltText": [Function],
+ "getByDisplayValue": [Function],
+ "getByLabelText": [Function],
+ "getByPlaceholderText": [Function],
+ "getByRole": [Function],
+ "getByTestId": [Function],
+ "getByText": [Function],
+ "getByTitle": [Function],
+ "queryAllByAltText": [Function],
+ "queryAllByDisplayValue": [Function],
+ "queryAllByLabelText": [Function],
+ "queryAllByPlaceholderText": [Function],
+ "queryAllByRole": [Function],
+ "queryAllByTestId": [Function],
+ "queryAllByText": [Function],
+ "queryAllByTitle": [Function],
+ "queryByAltText": [Function],
+ "queryByDisplayValue": [Function],
+ "queryByLabelText": [Function],
+ "queryByPlaceholderText": [Function],
+ "queryByRole": [Function],
+ "queryByTestId": [Function],
+ "queryByText": [Function],
+ "queryByTitle": [Function],
+ "rerender": [Function],
+ "unmount": [Function],
+}
+`;
+
+exports[`should match onchange 2`] = `
+
+
+
+
+
+ 南京市
+
+
+ 无锡市
+
+
+ 海北藏族自治区
+
+
+ 北京市
+
+
+ 连云港市
+
+
+ 大庆市
+
+
+ 绥化市
+
+
+ 潍坊市
+
+
+ 乌鲁木齐市
+
+
+
+
+
+
+
+`;
+
+exports[`should match snapshot 1`] = `
+
+
+
+
+
+ 南京市
+
+
+ 无锡市
+
+
+ 海北藏族自治区
+
+
+ 北京市
+
+
+ 连云港市
+
+
+ 大庆市
+
+
+ 绥化市
+
+
+ 潍坊市
+
+
+ 乌鲁木齐市
+
+
+
+
+
+
+
+`;
+
+exports[`should render tiled 1`] = `
+
+
+
+
+
+ 南京市
+
+
+ 无锡市
+
+
+ 海北藏族自治区
+
+
+ 北京市
+
+
+ 连云港市
+
+
+ 大庆市
+
+
+ 绥化市
+
+
+ 潍坊市
+
+
+ 乌鲁木齐市
+
+
+
+
+
+
+
+`;
+
+exports[`should render with Multi Column 1`] = `
+
+
+
+
+
+ 周一
+
+
+ 周二
+
+
+ 周三
+
+
+ 周四
+
+
+ 周五
+
+
+
+
+
+
+ 上午
+
+
+ 下午
+
+
+ 晚上
+
+
+
+
+
+
+
+`;
diff --git a/src/packages/pickerview/__test__/pickerview.spec.tsx b/src/packages/pickerview/__test__/pickerview.spec.tsx
index 089e995187..85c48a0cfd 100644
--- a/src/packages/pickerview/__test__/pickerview.spec.tsx
+++ b/src/packages/pickerview/__test__/pickerview.spec.tsx
@@ -1,9 +1,172 @@
-import React from 'react'
-import { render } from '@testing-library/react'
+import React, { useEffect, useState } from 'react'
+import { render, waitFor, screen } from '@testing-library/react'
import '@testing-library/jest-dom'
import PickerView from '../pickerview'
+const listData = [
+ [
+ { value: 1, label: '南京市' },
+ { value: 2, label: '无锡市' },
+ { value: 3, label: '海北藏族自治区' },
+ { value: 4, label: '北京市' },
+ { value: 5, label: '连云港市' },
+ { value: 8, label: '大庆市' },
+ { value: 9, label: '绥化市' },
+ { value: 10, label: '潍坊市' },
+ { value: 12, label: '乌鲁木齐市' },
+ ],
+]
+
+const MultiColumnData = [
+ [
+ { label: '周一', value: 'Monday' },
+ { label: '周二', value: 'Tuesday' },
+ { label: '周三', value: 'Wednesday' },
+ { label: '周四', value: 'Thursday' },
+ { label: '周五', value: 'Friday' },
+ ],
+ [
+ { label: '上午', value: 'Morning' },
+ { label: '下午', value: 'Afternoon' },
+ { label: '晚上', value: 'Evening' },
+ ],
+]
+
+const cascadeData = [
+ [
+ {
+ value: 1,
+ label: '北京',
+ children: [
+ {
+ value: 1,
+ label: '朝阳区',
+ },
+ {
+ value: 2,
+ label: '海淀区',
+ },
+ {
+ value: 3,
+ label: '大兴区',
+ },
+ {
+ value: 4,
+ label: '东城区',
+ },
+ {
+ value: 5,
+ label: '西城区',
+ },
+ {
+ value: 6,
+ label: '丰台区',
+ },
+ ],
+ },
+ {
+ value: 2,
+ label: '上海',
+ children: [
+ {
+ value: 1,
+ label: '黄埔区',
+ },
+ {
+ value: 2,
+ label: '长宁区',
+ },
+ {
+ value: 3,
+ label: '普陀区',
+ },
+ {
+ value: 4,
+ label: '杨浦区',
+ },
+ {
+ value: 5,
+ label: '浦东新区',
+ },
+ ],
+ },
+ ],
+]
+
test('should match snapshot', () => {
- const { container } = render(
)
+ const { container } = render(
+
+ )
+ expect(container).toMatchSnapshot()
+ expect(screen.getByText('南京市')).toBeInTheDocument()
+})
+
+test('should render tiled', () => {
+ const { container } = render(
+
+ )
+ expect(container).toMatchSnapshot()
+})
+
+test('should render with Multi Column', () => {
+ const { container } = render(
+
+ )
+ const columns = container.querySelectorAll('.nut-pickerview-list')
+ expect(columns.length).toBe(2)
+
+ // 检查列内容
+ const firstColumn = columns[0]
+ expect(firstColumn.textContent).toContain('周一')
+ expect(firstColumn.textContent).toContain('周二')
+
+ const secondColumn = columns[1]
+ expect(secondColumn.textContent).toContain('上午')
+ expect(secondColumn.textContent).toContain('下午')
+ expect(container).toMatchSnapshot()
+})
+
+test('should match onchange', async () => {
+ const PenderContent = () => {
+ const [value, setValue] = useState([1])
+
+ useEffect(() => {
+ setTimeout(() => {
+ setValue([3])
+ }, 1000)
+ }, [])
+
+ return (
+
{
+ if (value[0] === 3) {
+ setValue([1])
+ }
+ }}
+ />
+ )
+ }
+ const container = render()
+
+ await waitFor(() => {
+ expect(container).toMatchSnapshot()
+ })
+})
+
+test('should match cascade', () => {
+ const { container } = render(
+ `${item.label} | 测试`}
+ options={cascadeData}
+ onChange={() => {}}
+ />
+ )
expect(container).toMatchSnapshot()
})
diff --git a/src/packages/pickerview/demo.taro.tsx b/src/packages/pickerview/demo.taro.tsx
index 854ebb089d..8f34000096 100644
--- a/src/packages/pickerview/demo.taro.tsx
+++ b/src/packages/pickerview/demo.taro.tsx
@@ -9,6 +9,7 @@ import Demo3 from './demos/taro/demo3'
import Demo4 from './demos/taro/demo4'
import Demo5 from './demos/taro/demo5'
import Demo6 from './demos/taro/demo6'
+import Demo7 from './demos/taro/demo7'
const PickerViewDemo = () => {
const [translated] = useTranslate({
@@ -19,6 +20,7 @@ const PickerViewDemo = () => {
controlled: '受控',
tiled: '平铺',
cascade: '级联',
+ asynchronous: '异步数据',
},
'en-US': {
title: 'Basic Usage',
@@ -27,6 +29,7 @@ const PickerViewDemo = () => {
controlled: 'Controlled',
tiled: 'Tiled',
cascade: 'Cascade',
+ asynchronous: 'Asynchronous',
},
'zh-TW': {
title: '基礎用法',
@@ -35,6 +38,7 @@ const PickerViewDemo = () => {
controlled: '受控',
tiled: '平鋪',
cascade: '級聯',
+ asynchronous: '異步數據',
},
})
return (
@@ -51,8 +55,10 @@ const PickerViewDemo = () => {
{translated.tiled}
- {translated.cascade}
+ {translated.cascade}
+ {translated.asynchronous}
+
>
)
diff --git a/src/packages/pickerview/demo.tsx b/src/packages/pickerview/demo.tsx
index b94f91de80..8d95022679 100644
--- a/src/packages/pickerview/demo.tsx
+++ b/src/packages/pickerview/demo.tsx
@@ -6,6 +6,7 @@ import Demo3 from './demos/h5/demo3'
import Demo4 from './demos/h5/demo4'
import Demo5 from './demos/h5/demo5'
import Demo6 from './demos/h5/demo6'
+import Demo7 from './demos/h5/demo7'
const PickerViewDemo = () => {
const [translated] = useTranslate({
@@ -16,6 +17,7 @@ const PickerViewDemo = () => {
controlled: '受控',
tiled: '平铺',
cascade: '级联',
+ asynchronous: '异步数据',
},
'en-US': {
title: 'Basic Usage',
@@ -24,6 +26,7 @@ const PickerViewDemo = () => {
controlled: 'Controlled',
tiled: 'Tiled',
cascade: 'Cascade',
+ asynchronous: 'Asynchronous',
},
'zh-TW': {
title: '基礎用法',
@@ -32,6 +35,7 @@ const PickerViewDemo = () => {
controlled: '受控',
tiled: '平鋪',
cascade: '級聯',
+ asynchronous: '異步數據',
},
})
return (
@@ -48,6 +52,8 @@ const PickerViewDemo = () => {
{translated.cascade}
+ {translated.asynchronous}
+
)
}
diff --git a/src/packages/pickerview/demos/h5/demo2.tsx b/src/packages/pickerview/demos/h5/demo2.tsx
index dff4a404b0..894b633b01 100644
--- a/src/packages/pickerview/demos/h5/demo2.tsx
+++ b/src/packages/pickerview/demos/h5/demo2.tsx
@@ -1,7 +1,7 @@
import React from 'react'
import { PickerView, Cell } from '@nutui/nutui-react'
-const Demo1 = () => {
+const Demo2 = () => {
const listData = [
[
{ value: 1, label: '南京市' },
@@ -31,4 +31,4 @@ const Demo1 = () => {
>
)
}
-export default Demo1
+export default Demo2
diff --git a/src/packages/pickerview/demos/h5/demo4.tsx b/src/packages/pickerview/demos/h5/demo4.tsx
index 320c7cc39e..cfa2ab063e 100644
--- a/src/packages/pickerview/demos/h5/demo4.tsx
+++ b/src/packages/pickerview/demos/h5/demo4.tsx
@@ -1,7 +1,7 @@
import React, { useState } from 'react'
import { PickerView, Cell } from '@nutui/nutui-react'
-const Demo1 = () => {
+const Demo4 = () => {
const listData = [
[
{ value: 1, label: '南京市' },
@@ -35,4 +35,4 @@ const Demo1 = () => {
>
)
}
-export default Demo1
+export default Demo4
diff --git a/src/packages/pickerview/demos/h5/demo5.tsx b/src/packages/pickerview/demos/h5/demo5.tsx
index 4bf68a2261..e9795b79f4 100644
--- a/src/packages/pickerview/demos/h5/demo5.tsx
+++ b/src/packages/pickerview/demos/h5/demo5.tsx
@@ -1,7 +1,7 @@
import React from 'react'
import { PickerView, Cell } from '@nutui/nutui-react'
-const Demo1 = () => {
+const Demo5 = () => {
const listData = [
[
{ value: 1, label: '南京市' },
@@ -32,4 +32,4 @@ const Demo1 = () => {
>
)
}
-export default Demo1
+export default Demo5
diff --git a/src/packages/pickerview/demos/h5/demo7.tsx b/src/packages/pickerview/demos/h5/demo7.tsx
new file mode 100644
index 0000000000..d245a189c5
--- /dev/null
+++ b/src/packages/pickerview/demos/h5/demo7.tsx
@@ -0,0 +1,38 @@
+import React, { useEffect, useState } from 'react'
+import { PickerView, Cell, PickerOptions } from '@nutui/nutui-react'
+
+const Demo7 = () => {
+ const [columnsList, setColumnsList] = useState([] as PickerOptions[])
+
+ useEffect(() => {
+ setTimeout(() => {
+ setColumnsList([
+ [
+ { value: 1, label: '南京市' },
+ { value: 2, label: '无锡市' },
+ { value: 3, label: '海北藏族自治区' },
+ { value: 4, label: '北京市' },
+ { value: 5, label: '连云港市' },
+ { value: 8, label: '大庆市' },
+ { value: 9, label: '绥化市' },
+ { value: 10, label: '潍坊市' },
+ { value: 12, label: '乌鲁木齐市' },
+ ],
+ ])
+ }, 3000)
+ }, [])
+ return (
+ <>
+