Skip to content

Commit

Permalink
enhance: (Picker & PickerView) add cache for generateColumnsExtend
Browse files Browse the repository at this point in the history
  • Loading branch information
awmleer committed Mar 16, 2022
1 parent 2e654ce commit 0293ee9
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 25 deletions.
4 changes: 2 additions & 2 deletions src/components/cascade-picker/demos/demo1.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ function CascadePickerDemo() {
onClose={() => {
setVisible(false)
}}
onConfirm={val => {
console.log('onConfirm', val)
onConfirm={(val, extend) => {
console.log('onConfirm', val, extend.items)
}}
onSelect={val => {
console.log('onSelect', val)
Expand Down
43 changes: 24 additions & 19 deletions src/components/picker-view/columns-extend.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,44 @@ import type {
PickerValue,
PickerValueExtend,
} from './picker-view'
import { withCache } from '../../utils/with-cache'

export function generateColumnsExtend(
rawColumns: PickerViewProps['columns'],
val: PickerValue[]
) {
// let columns: PickerColumn[] | null = null
const columns = withCache(() => {
const c = typeof rawColumns === 'function' ? rawColumns(val) : rawColumns
return c.map(column =>
column.map(item =>
typeof item === 'string'
? {
label: item,
value: item,
}
: item
)
)
})
const items = withCache(() => {
return val.map((v, index) => {
const column = columns()[index]
if (!column) return null
return column.find(item => item.value === v) ?? null
})
})
const extend: PickerValueExtend = {
get columns() {
const c = typeof rawColumns === 'function' ? rawColumns(val) : rawColumns
return c.map(column =>
column.map(item =>
typeof item === 'string'
? {
label: item,
value: item,
}
: item
)
)
return columns()
},
get items() {
console.log('items')
return val.map((v, index) => {
const column = extend.columns[index]
if (!column) return null
return column.find(item => item.value === v) ?? null
})
return items()
},
}
return extend
}

export function useColumnsAndExtend(
export function useColumnsExtend(
rawColumns: PickerViewProps['columns'],
value: PickerValue[]
) {
Expand Down
4 changes: 2 additions & 2 deletions src/components/picker-view/picker-view.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { memo, ReactNode, useCallback, useEffect, useState } from 'react'
import { mergeProps } from '../../utils/with-default-props'
import { Wheel } from './wheel'
import { useColumnsAndExtend } from './columns-extend'
import { useColumnsExtend } from './columns-extend'
import { NativeProps, withNativeProps } from '../../utils/native-props'
import { useDebounceEffect } from 'ahooks'

Expand Down Expand Up @@ -58,7 +58,7 @@ export const PickerView = memo<PickerViewProps>(p => {
}
}, [props.value, innerValue])

const extend = useColumnsAndExtend(props.columns, innerValue)
const extend = useColumnsExtend(props.columns, innerValue)
const columns = extend.columns

useDebounceEffect(
Expand Down
4 changes: 2 additions & 2 deletions src/components/picker/picker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
import PickerView from '../picker-view'
import {
generateColumnsExtend,
useColumnsAndExtend,
useColumnsExtend,
} from '../picker-view/columns-extend'
import { useConfig } from '../config-provider'
import { useMemoizedFn } from 'ahooks'
Expand Down Expand Up @@ -69,7 +69,7 @@ export const Picker = memo<PickerProps>(p => {
},
})

const extend = useColumnsAndExtend(props.columns, value)
const extend = useColumnsExtend(props.columns, value)

const [innerValue, setInnerValue] = useState<PickerValue[]>(value)
useEffect(() => {
Expand Down
9 changes: 9 additions & 0 deletions src/utils/with-cache.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export function withCache<T>(generate: () => T) {
let cache: T | null = null
return () => {
if (cache === null) {
cache = generate()
}
return cache
}
}

0 comments on commit 0293ee9

Please sign in to comment.