Skip to content

Commit a15adf3

Browse files
committed
feat: 添加手动控制选中值的功能到 Picker 组件
1 parent 8600d5f commit a15adf3

2 files changed

Lines changed: 61 additions & 19 deletions

File tree

src/components/picker/demos/demo1.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,45 @@ function RenderChildrenDemo() {
7272
)
7373
}
7474

75+
// 手动控制选中值
76+
function SelectedDemo() {
77+
const [value, setValue] = useState<(string | null)[]>([])
78+
79+
const [selectValue, setSelectValue] = useState<(string | null)[]>([])
80+
return (
81+
<Picker
82+
columns={basicColumns}
83+
value={value}
84+
title={
85+
<div
86+
onClick={() => {
87+
setSelectValue(['Fri', 'pm'])
88+
}}
89+
>
90+
设置为星期五下午
91+
</div>
92+
}
93+
selectValue={selectValue}
94+
onConfirm={setValue}
95+
onSelect={(val, extend) => {
96+
console.log('onSelect', val, extend.items)
97+
setSelectValue(val)
98+
}}
99+
>
100+
{(items, { open }) => {
101+
return (
102+
<Space align='center'>
103+
<Button onClick={open}>选择</Button>
104+
{items.every(item => item === null)
105+
? '未选择'
106+
: items.map(item => item?.label ?? '未选择').join(' - ')}
107+
</Space>
108+
)
109+
}}
110+
</Picker>
111+
)
112+
}
113+
75114
export default () => {
76115
return (
77116
<>
@@ -83,6 +122,10 @@ export default () => {
83122
<RenderChildrenDemo />
84123
</DemoBlock>
85124

125+
<DemoBlock title='使用 selectValue 来控制选择值'>
126+
<SelectedDemo />
127+
</DemoBlock>
128+
86129
<DemoBlock title='使用 actions 来控制显示/隐藏'>
87130
<Space direction='vertical' block>
88131
<ActionsDemo />

src/components/picker/picker.tsx

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,24 @@
1-
import React, {
2-
useState,
3-
useEffect,
4-
forwardRef,
5-
useImperativeHandle,
6-
memo,
7-
} from 'react'
8-
import type { ReactNode, CSSProperties } from 'react'
1+
import { useMemoizedFn } from 'ahooks'
92
import classNames from 'classnames'
10-
import Popup, { PopupProps } from '../popup'
11-
import { mergeProps } from '../../utils/with-default-props'
3+
import type { CSSProperties, ReactNode } from 'react'
4+
import React, { forwardRef, memo, useEffect, useImperativeHandle } from 'react'
125
import { NativeProps, withNativeProps } from '../../utils/native-props'
136
import { usePropsValue } from '../../utils/use-props-value'
14-
import {
15-
PickerColumn,
16-
PickerColumnItem,
17-
PickerValue,
18-
PickerValueExtend,
19-
} from './index'
7+
import { mergeProps } from '../../utils/with-default-props'
8+
import { useConfig } from '../config-provider'
209
import PickerView from '../picker-view'
2110
import {
2211
generateColumnsExtend,
2312
useColumnsExtend,
2413
} from '../picker-view/columns-extend'
25-
import { useConfig } from '../config-provider'
26-
import { useMemoizedFn } from 'ahooks'
14+
import Popup, { PopupProps } from '../popup'
2715
import SafeArea from '../safe-area'
16+
import {
17+
PickerColumn,
18+
PickerColumnItem,
19+
PickerValue,
20+
PickerValueExtend,
21+
} from './index'
2822
import { defaultRenderLabel } from './picker-utils'
2923

3024
export type PickerActions = {
@@ -40,6 +34,7 @@ export type PickerProps = {
4034
columns: PickerColumn[] | ((value: PickerValue[]) => PickerColumn[])
4135
value?: PickerValue[]
4236
defaultValue?: PickerValue[]
37+
selectValue?: PickerValue[]
4338
loading?: boolean
4439
loadingContent?: ReactNode
4540
onSelect?: (value: PickerValue[], extend: PickerValueExtend) => void
@@ -130,7 +125,11 @@ export const Picker = memo(
130125

131126
const extend = useColumnsExtend(props.columns, value)
132127

133-
const [innerValue, setInnerValue] = useState<PickerValue[]>(value)
128+
const [innerValue, setInnerValue] = usePropsValue({
129+
value: props.selectValue,
130+
defaultValue: value,
131+
})
132+
134133
useEffect(() => {
135134
if (innerValue !== value) {
136135
setInnerValue(value)

0 commit comments

Comments
 (0)