File tree Expand file tree Collapse file tree 5 files changed +119
-0
lines changed
Expand file tree Collapse file tree 5 files changed +119
-0
lines changed Original file line number Diff line number Diff line change @@ -35,6 +35,7 @@ export { default as useDebounce } from './useDebounce';
3535export { default as useIntersectionObserver } from './useIntersectionObserver' ;
3636export { default as useList } from './useList' ;
3737export { default as useMeasure } from './useMeasure' ;
38+ export { default as useMergeOption } from './useMergeOption' ;
3839export { default as useModal } from './useModal' ;
3940export { default as useTyping } from './useTyping' ;
4041export { default as useWindowSwitchListener } from './useWindowSwitchListener' ;
Original file line number Diff line number Diff line change 1+ import { renderHook } from '@testing-library/react-hooks' ;
2+
3+ import useMergeOption from '..' ;
4+
5+ describe ( 'Test useMergeOption' , ( ) => {
6+ test ( 'should return default value when state is false' , ( ) => {
7+ const { result } = renderHook ( ( ) => useMergeOption ( false , { day : true } ) ) ;
8+ expect ( result . current ) . toEqual ( { disabled : true , options : { day : true } } ) ;
9+ } ) ;
10+
11+ test ( 'should return default value when state is true' , ( ) => {
12+ const { result } = renderHook ( ( ) => useMergeOption ( true , { day : true } ) ) ;
13+ expect ( result . current ) . toEqual ( { disabled : false , options : { day : true } } ) ;
14+ } ) ;
15+
16+ test ( 'should return merged value when state is an object' , ( ) => {
17+ const { result } = renderHook ( ( ) => useMergeOption ( { day : false } , { day : true } ) ) ;
18+ expect ( result . current ) . toEqual ( { disabled : false , options : { day : false } } ) ;
19+ } ) ;
20+ } ) ;
Original file line number Diff line number Diff line change 1+ import React , { useState } from 'react' ;
2+ import { Segmented } from 'antd' ;
3+ import { useMergeOption } from 'dt-react-component' ;
4+ import type { MergeOption } from 'dt-react-component/useMergeOption' ;
5+
6+ type ExampleState = MergeOption < { day ?: boolean } > ;
7+
8+ export default function Basic ( ) {
9+ const [ state , setState ] = useState < ExampleState > ( false ) ;
10+
11+ const merged = useMergeOption ( state , { day : true } ) ;
12+
13+ const getValue = ( ) => {
14+ if ( state === false ) return 0 ;
15+ if ( state === true ) return 2 ;
16+ return 1 ;
17+ } ;
18+ const setValue = ( value : number ) => {
19+ setState ( [ false , { day : false } , true ] [ value ] ) ;
20+ } ;
21+
22+ return (
23+ < >
24+ < label > Change value:</ label >
25+ < Segmented
26+ value = { getValue ( ) }
27+ options = { [
28+ {
29+ label : 'false' ,
30+ value : 0 ,
31+ } ,
32+ {
33+ label : `{ day: false }` ,
34+ value : 1 ,
35+ } ,
36+ {
37+ label : 'true' ,
38+ value : 2 ,
39+ } ,
40+ ] }
41+ onChange = { ( val ) => setValue ( val as number ) }
42+ />
43+ < pre style = { { marginTop : 8 , border : '1px solid #eee' , padding : 8 } } >
44+ { JSON . stringify ( merged , null , 2 ) }
45+ </ pre >
46+ </ >
47+ ) ;
48+ }
Original file line number Diff line number Diff line change 1+ ---
2+ title : useMergeOption 合并配置项
3+ group : Hooks
4+ toc : content
5+ ---
6+
7+ # useMergeOption
8+
9+ ## 何时使用
10+
11+ 需要合并配置项
12+
13+ ## 示例
14+
15+ <code src =" ./demos/basic.tsx " title =" 基础使用 " ></code >
16+
17+ ## API
18+
19+ ### Returns
20+
21+ | 参数 | 说明 | 类型 | 默认值 |
22+ | -------- | -------------- | ------------------------------- | ------ |
23+ | disabled | 是否禁用 | ` boolean ` | - |
24+ | options | 合并后的配置项 | ` T extends Record<string, any> ` | - |
Original file line number Diff line number Diff line change 1+ import { useMemo } from 'react' ;
2+
3+ export type MergeOption < T extends Record < string , any > > = boolean | T ;
4+
5+ export type ReturnMergeOption < T extends Record < string , any > > = {
6+ disabled : boolean ;
7+ options : T ;
8+ } ;
9+
10+ export default function useMergeOption < T extends Record < string , any > > (
11+ opt : MergeOption < T > ,
12+ defaultOpt ?: T
13+ ) : ReturnMergeOption < T > {
14+ return useMemo ( ( ) => {
15+ if ( typeof opt === 'object' && ! ! opt ) {
16+ return {
17+ disabled : false ,
18+ options : { ...defaultOpt , ...opt } ,
19+ } ;
20+ }
21+ return {
22+ disabled : ! opt ,
23+ options : < T > { ...defaultOpt } ,
24+ } ;
25+ } , [ opt ] ) ;
26+ }
You can’t perform that action at this time.
0 commit comments