mirror of
https://github.com/streamich/react-use.git
synced 2026-01-25 14:17:16 +00:00
feat: 🎸 add useAdopt hook
This commit is contained in:
parent
2d85c61ba8
commit
91bee9a3c2
@ -77,6 +77,7 @@
|
||||
<br/>
|
||||
- [**State**](./docs/State.md)
|
||||
- [`createMemo`](./docs/createMemo.md) — factory of memoized hooks.
|
||||
- [`useAdopt`](./docs/useAdopt.md) — extract value from multiple render-prop (or FaCC) components.
|
||||
- [`useCallbag`](./docs/useCallbag.md) — tracks latest value of a callbag.
|
||||
- [`useGetSet`](./docs/useGetSet.md) — returns state getter `get()` instead of raw state.
|
||||
- [`useGetSetState`](./docs/useGetSetState.md) — as if [`useGetSet`](./docs/useGetSet.md) and [`useSetState`](./docs/useSetState.md) had a baby.
|
||||
|
||||
35
docs/useAdopt.md
Normal file
35
docs/useAdopt.md
Normal file
@ -0,0 +1,35 @@
|
||||
# `useAdopt`
|
||||
|
||||
Extracts a values from multiple render-prop or FaCC components.
|
||||
This hook is similar to [`useRenderProp`](./useRenderProp.md), but
|
||||
it allows to specify a named map of multiple render-prop elements
|
||||
from which to extract values.
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```jsx
|
||||
import {useAdopt} from 'react-use';
|
||||
|
||||
const FaCC = ({children}) => {
|
||||
return children('VALUE-FaCC');
|
||||
};
|
||||
const RenderProp = ({render}) => {
|
||||
return render('VALUE-RenderProp');
|
||||
};
|
||||
|
||||
const Demo = () => {
|
||||
const [fragment, result] = useAdopt({
|
||||
facc: <FaCC/>,
|
||||
renderProp: <RenderProp/>,
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
{fragment}
|
||||
<div>FaCC: {result.facc[0]}</div>
|
||||
<div>Render prop: {result.renderProp[0]}</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
```
|
||||
32
src/__stories__/useAdopt.story.tsx
Normal file
32
src/__stories__/useAdopt.story.tsx
Normal file
@ -0,0 +1,32 @@
|
||||
import {storiesOf} from '@storybook/react';
|
||||
import * as React from 'react';
|
||||
import {useAdopt} from '..';
|
||||
import ShowDocs from '../util/ShowDocs';
|
||||
|
||||
const FaCC = ({children}) => {
|
||||
return children('VALUE-FaCC');
|
||||
};
|
||||
const RenderProp = ({render}) => {
|
||||
return render('VALUE-RenderProp');
|
||||
};
|
||||
|
||||
const Demo = () => {
|
||||
const [fragment, result] = useAdopt({
|
||||
facc: <FaCC/>,
|
||||
renderProp: <RenderProp/>,
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
{fragment}
|
||||
<div>FaCC: {result.facc[0]}</div>
|
||||
<div>Render prop: {result.renderProp[0]}</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
storiesOf('useAdopt', module)
|
||||
.add('Docs', () => <ShowDocs md={require('../../docs/useAdopt.md')} />)
|
||||
.add('Demo', () =>
|
||||
<Demo/>
|
||||
)
|
||||
@ -1,4 +1,5 @@
|
||||
import createMemo from './createMemo';
|
||||
import useAdopt from './useAdopt';
|
||||
import useAsync from './useAsync';
|
||||
import useAudio from './useAudio';
|
||||
import useBattery from './useBattery';
|
||||
@ -44,6 +45,7 @@ import useWindowSize from './useWindowSize';
|
||||
|
||||
export {
|
||||
createMemo,
|
||||
useAdopt,
|
||||
useAsync,
|
||||
useAudio,
|
||||
useBattery,
|
||||
|
||||
19
src/useAdopt.ts
Normal file
19
src/useAdopt.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import * as React from 'react';
|
||||
import useRenderProp from './useRenderProp';
|
||||
|
||||
const useAdopt = <T extends {[key: string]: any[]}>(map: {[key in keyof T]: React.ReactElement<any>}): [React.ReactElement<any>, T] => {
|
||||
const keys = Object.keys(map);
|
||||
const fragments: React.ReactElement<any>[] = [];
|
||||
const result: T = {} as T;
|
||||
|
||||
keys.sort();
|
||||
for (const key of keys) {
|
||||
const [fragment, value] = useRenderProp(map[key]);
|
||||
fragments.push(React.cloneElement(fragment, {key}));
|
||||
result[key] = value;
|
||||
}
|
||||
|
||||
return [React.createElement(React.Fragment, null, ...fragments), result];
|
||||
};
|
||||
|
||||
export default useAdopt;
|
||||
Loading…
x
Reference in New Issue
Block a user