Repository files navigation

⚠️ As of React 16.8 it is recommended to use hooks instead of this package.

Extended Components

Extend functional React.js components with default props, advanced local state (presets for common use cases like toggle, counter, ...) and lifecycle hooks.

This package is not meant as a replacement for state management libraries like Redux, it should be used for local state only (i.e. state that is used by not really more than one component).

Problem

There are two problems that motivated me to create this package:

  1. Functional components don't support local state and lifecycle hooks.
  2. There were no presets for common local state use cases (toggles, counters, ...).

Solution

This package consists of some higher order components (HOC), which let you define default props, state and lifecycle methods for a functional component. Also you can define state presets like useCounterState or useToggleState that can be used with the withState HOC perfectly. If you define state, extended-components will pass a second argument to your functional component (as described by Andrew Clark).

This package uses HOCs and not render props. Don't get me wrong, I use render props a lot, but I think in this case HOCs have slightly advantages like a good separation of concerns and clean code.

Technically extended-components makes use of component squashing, so the original functional component will be squashed by the HOCs to improve performance.

Installation

npm install extended-components
# or
yarn add extended-components

Usage

importReactfrom'react';import{compose,withState,lifecycle,pure}from'extended-components';importuseCounterStatefrom'./useCounterState';constenhance=compose(// Use state helpers to define statewithState({counter: useCounterState(),}),// Use React.js lifecycle hooks with props and statelifecycle((props,{ counter })=>{componentDidUpdate(){counter.increment();},}),// Component is a pure componentpure(),});// Use defined statefunctionComponent(props,state){const{ counter }=state;return(<div><p>This component was updated {counter.count} times.</p><p><buttononClick={()=>{counter.reset()}}>Reset counter</button></p></div>);}exportdefaultenhance(Component);

Hint: You can use the HOCs of extended-components in conjunction with other higher order components, but thus these higher order components don't expect a functional component with two arguments, HOCs of extended-components should always be placed last, e.g.:

constenhance=compose(withRouter(...),connect(...),graphql(...),mapProps(...),// Use extended-components HOCs lastwithState(...),);

Create state helpers

The purpose of this package is to enable a convient way to define state for specific use cases, but not to implement all these use cases. So it is up to you to define state helpers. A state helper is simply an object with the keys initial (for initial state) and mutators (for state mutator functions):

functionuseCounterState(){return{initial: {count: 0,},mutators: setState=>({increment: ()=>{setState(({ count })=>({count: count+1}));},decrement: ()=>{setState(({ count })=>({count: count-1}));},reset: ()=>{setState({count: 0});},}),};}

Then you can reuse this state helper over and over like shown in the example above. For more examples have a look at the examples folder.

Docs

defaultProps

Defines the default props of a component.

typeDefaultProps=((defaultProps: $Shape<Props>)=>void)=>HOC

getDerivedStateFromProps

Defines the static lifecycle hook getDerivedStateFromProps (introduced in React 16.3). Notice that this hook returns void (in comparison to the original hook, which returns a state object), because you can update the state via the state mutators.

typeGetDerivedStateFromProps=((nextProps: Props,prevState?: State)=>void)=>HOC

lifecycle

Defines lifecycle hooks.

typeLifecycle=((props: Props,state?: State,)=>{componentDidMount?: ()=>void,shouldComponentUpdate?: (nextProps: Props,nextState?: State)=>boolean,componentDidUpdate?: (prevProps: Props,prevState?: State)=>void,componentWillUnmount?: ()=>void,},)=>HOC;

pure

Equivalent to React.PureComponent, but instead of a basic shallow state comparison this function makes a shallow comparison for the state of every state helper.

typePure=()=>HOC;

withState

Defines state with state helpers.

typeWithState=({[string]: StateHelper<SubStateValues,SubStateMutators,Props>,})=>HOC;

statics

Defines static properties of a component.

typeStatics=Object=>HOC;

State helpers

As stated above you can define your own state helpers that should be of the following type:

typeSetState<SubStateValues,Props>=($Shape<SubStateValues>|((SubStateValues,Props)=>$Shape<SubStateValues>),)=>void;typeStateHelper<SubStateValues,SubStateMutators,Props>={initial: SubStateValues,mutators: (SetState<SubStateValues,Props>)=>SubStateMutators,};

The definitions above might differ from the real Flow definitions, because the definitions in this section should just demonstrate what you can do with this package.

Flow support

For more information about the usage with Flow see Flow support.

Inspiration

This package is heavily inspired by Andrew Clark's great library recompose. And I think you can perfectly use recompose and extended-components together, because extended-components just mimics all class features and recompose offers a lot more utils. You can use extended-components for state and lifecycle hooks and recompose for props manipulation and more.

Future

Currently there are only two arguments that are passed to a functional component, but you can think of more arguments. So it might be that someday this package will offer an api for higher order components like withTheme, withIntl, withRouter and so on, which add more arguments to the component. Each argument for a specific use case.

License

This package is released under the MIT License.

About

🌟 React.js functional components with default props, advanced local state and lifecycle hooks

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

⚠️ As of React 16.8 it is recommended to use hooks instead of this package.

Extended Components

Extend functional React.js components with default props, advanced local state (presets for common use cases like toggle, counter, ...) and lifecycle hooks.

This package is not meant as a replacement for state management libraries like Redux, it should be used for local state only (i.e. state that is used by not really more than one component).

Problem

There are two problems that motivated me to create this package:

  1. Functional components don't support local state and lifecycle hooks.
  2. There were no presets for common local state use cases (toggles, counters, ...).

Solution

This package consists of some higher order components (HOC), which let you define default props, state and lifecycle methods for a functional component. Also you can define state presets like useCounterState or useToggleState that can be used with the withState HOC perfectly. If you define state, extended-components will pass a second argument to your functional component (as described by Andrew Clark).

This package uses HOCs and not render props. Don't get me wrong, I use render props a lot, but I think in this case HOCs have slightly advantages like a good separation of concerns and clean code.

Technically extended-components makes use of component squashing, so the original functional component will be squashed by the HOCs to improve performance.

Installation

npm install extended-components
# or
yarn add extended-components

Usage

importReactfrom'react';import{compose,withState,lifecycle,pure}from'extended-components';importuseCounterStatefrom'./useCounterState';constenhance=compose(// Use state helpers to define statewithState({counter: useCounterState(),}),// Use React.js lifecycle hooks with props and statelifecycle((props,{ counter })=>{componentDidUpdate(){counter.increment();},}),// Component is a pure componentpure(),});// Use defined statefunctionComponent(props,state){const{ counter }=state;return(<div><p>This component was updated {counter.count} times.</p><p><buttononClick={()=>{counter.reset()}}>Reset counter</button></p></div>);}exportdefaultenhance(Component);

Hint: You can use the HOCs of extended-components in conjunction with other higher order components, but thus these higher order components don't expect a functional component with two arguments, HOCs of extended-components should always be placed last, e.g.:

constenhance=compose(withRouter(...),connect(...),graphql(...),mapProps(...),// Use extended-components HOCs lastwithState(...),);

Create state helpers

The purpose of this package is to enable a convient way to define state for specific use cases, but not to implement all these use cases. So it is up to you to define state helpers. A state helper is simply an object with the keys initial (for initial state) and mutators (for state mutator functions):

functionuseCounterState(){return{initial: {count: 0,},mutators: setState=>({increment: ()=>{setState(({ count })=>({count: count+1}));},decrement: ()=>{setState(({ count })=>({count: count-1}));},reset: ()=>{setState({count: 0});},}),};}

Then you can reuse this state helper over and over like shown in the example above. For more examples have a look at the examples folder.

Docs

defaultProps

Defines the default props of a component.

typeDefaultProps=((defaultProps: $Shape<Props>)=>void)=>HOC

getDerivedStateFromProps

Defines the static lifecycle hook getDerivedStateFromProps (introduced in React 16.3). Notice that this hook returns void (in comparison to the original hook, which returns a state object), because you can update the state via the state mutators.

typeGetDerivedStateFromProps=((nextProps: Props,prevState?: State)=>void)=>HOC

lifecycle

Defines lifecycle hooks.

typeLifecycle=((props: Props,state?: State,)=>{componentDidMount?: ()=>void,shouldComponentUpdate?: (nextProps: Props,nextState?: State)=>boolean,componentDidUpdate?: (prevProps: Props,prevState?: State)=>void,componentWillUnmount?: ()=>void,},)=>HOC;

pure

Equivalent to React.PureComponent, but instead of a basic shallow state comparison this function makes a shallow comparison for the state of every state helper.

typePure=()=>HOC;

withState

Defines state with state helpers.

typeWithState=({[string]: StateHelper<SubStateValues,SubStateMutators,Props>,})=>HOC;

statics

Defines static properties of a component.

typeStatics=Object=>HOC;

State helpers

As stated above you can define your own state helpers that should be of the following type:

typeSetState<SubStateValues,Props>=($Shape<SubStateValues>|((SubStateValues,Props)=>$Shape<SubStateValues>),)=>void;typeStateHelper<SubStateValues,SubStateMutators,Props>={initial: SubStateValues,mutators: (SetState<SubStateValues,Props>)=>SubStateMutators,};

The definitions above might differ from the real Flow definitions, because the definitions in this section should just demonstrate what you can do with this package.

Flow support

For more information about the usage with Flow see Flow support.

Inspiration

This package is heavily inspired by Andrew Clark's great library recompose. And I think you can perfectly use recompose and extended-components together, because extended-components just mimics all class features and recompose offers a lot more utils. You can use extended-components for state and lifecycle hooks and recompose for props manipulation and more.

Future

Currently there are only two arguments that are passed to a functional component, but you can think of more arguments. So it might be that someday this package will offer an api for higher order components like withTheme, withIntl, withRouter and so on, which add more arguments to the component. Each argument for a specific use case.

License

This package is released under the MIT License.

About

🌟 React.js functional components with default props, advanced local state and lifecycle hooks

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

⚠️ As of React 16.8 it is recommended to use hooks instead of this package.

Extended Components

Extend functional React.js components with default props, advanced local state (presets for common use cases like toggle, counter, ...) and lifecycle hooks.

This package is not meant as a replacement for state management libraries like Redux, it should be used for local state only (i.e. state that is used by not really more than one component).

Problem

There are two problems that motivated me to create this package:

  1. Functional components don't support local state and lifecycle hooks.
  2. There were no presets for common local state use cases (toggles, counters, ...).

Solution

This package consists of some higher order components (HOC), which let you define default props, state and lifecycle methods for a functional component. Also you can define state presets like useCounterState or useToggleState that can be used with the withState HOC perfectly. If you define state, extended-components will pass a second argument to your functional component (as described by Andrew Clark).

This package uses HOCs and not render props. Don't get me wrong, I use render props a lot, but I think in this case HOCs have slightly advantages like a good separation of concerns and clean code.

Technically extended-components makes use of component squashing, so the original functional component will be squashed by the HOCs to improve performance.

Installation

npm install extended-components
# or
yarn add extended-components

Usage

importReactfrom'react';import{compose,withState,lifecycle,pure}from'extended-components';importuseCounterStatefrom'./useCounterState';constenhance=compose(// Use state helpers to define statewithState({counter: useCounterState(),}),// Use React.js lifecycle hooks with props and statelifecycle((props,{ counter })=>{componentDidUpdate(){counter.increment();},}),// Component is a pure componentpure(),});// Use defined statefunctionComponent(props,state){const{ counter }=state;return(<div><p>This component was updated {counter.count} times.</p><p><buttononClick={()=>{counter.reset()}}>Reset counter</button></p></div>);}exportdefaultenhance(Component);

Hint: You can use the HOCs of extended-components in conjunction with other higher order components, but thus these higher order components don't expect a functional component with two arguments, HOCs of extended-components should always be placed last, e.g.:

constenhance=compose(withRouter(...),connect(...),graphql(...),mapProps(...),// Use extended-components HOCs lastwithState(...),);

Create state helpers

The purpose of this package is to enable a convient way to define state for specific use cases, but not to implement all these use cases. So it is up to you to define state helpers. A state helper is simply an object with the keys initial (for initial state) and mutators (for state mutator functions):

functionuseCounterState(){return{initial: {count: 0,},mutators: setState=>({increment: ()=>{setState(({ count })=>({count: count+1}));},decrement: ()=>{setState(({ count })=>({count: count-1}));},reset: ()=>{setState({count: 0});},}),};}

Then you can reuse this state helper over and over like shown in the example above. For more examples have a look at the examples folder.

Docs

defaultProps

Defines the default props of a component.

typeDefaultProps=((defaultProps: $Shape<Props>)=>void)=>HOC

getDerivedStateFromProps

Defines the static lifecycle hook getDerivedStateFromProps (introduced in React 16.3). Notice that this hook returns void (in comparison to the original hook, which returns a state object), because you can update the state via the state mutators.

typeGetDerivedStateFromProps=((nextProps: Props,prevState?: State)=>void)=>HOC

lifecycle

Defines lifecycle hooks.

typeLifecycle=((props: Props,state?: State,)=>{componentDidMount?: ()=>void,shouldComponentUpdate?: (nextProps: Props,nextState?: State)=>boolean,componentDidUpdate?: (prevProps: Props,prevState?: State)=>void,componentWillUnmount?: ()=>void,},)=>HOC;

pure

Equivalent to React.PureComponent, but instead of a basic shallow state comparison this function makes a shallow comparison for the state of every state helper.

typePure=()=>HOC;

withState

Defines state with state helpers.

typeWithState=({[string]: StateHelper<SubStateValues,SubStateMutators,Props>,})=>HOC;

statics

Defines static properties of a component.

typeStatics=Object=>HOC;

State helpers

As stated above you can define your own state helpers that should be of the following type:

typeSetState<SubStateValues,Props>=($Shape<SubStateValues>|((SubStateValues,Props)=>$Shape<SubStateValues>),)=>void;typeStateHelper<SubStateValues,SubStateMutators,Props>={initial: SubStateValues,mutators: (SetState<SubStateValues,Props>)=>SubStateMutators,};

The definitions above might differ from the real Flow definitions, because the definitions in this section should just demonstrate what you can do with this package.

Flow support

For more information about the usage with Flow see Flow support.

Inspiration

This package is heavily inspired by Andrew Clark's great library recompose. And I think you can perfectly use recompose and extended-components together, because extended-components just mimics all class features and recompose offers a lot more utils. You can use extended-components for state and lifecycle hooks and recompose for props manipulation and more.

Future

Currently there are only two arguments that are passed to a functional component, but you can think of more arguments. So it might be that someday this package will offer an api for higher order components like withTheme, withIntl, withRouter and so on, which add more arguments to the component. Each argument for a specific use case.

License

This package is released under the MIT License.

About

🌟 React.js functional components with default props, advanced local state and lifecycle hooks

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

⚠️ As of React 16.8 it is recommended to use hooks instead of this package.

Extended Components

Extend functional React.js components with default props, advanced local state (presets for common use cases like toggle, counter, ...) and lifecycle hooks.

This package is not meant as a replacement for state management libraries like Redux, it should be used for local state only (i.e. state that is used by not really more than one component).

Problem

There are two problems that motivated me to create this package:

  1. Functional components don't support local state and lifecycle hooks.
  2. There were no presets for common local state use cases (toggles, counters, ...).

Solution

This package consists of some higher order components (HOC), which let you define default props, state and lifecycle methods for a functional component. Also you can define state presets like useCounterState or useToggleState that can be used with the withState HOC perfectly. If you define state, extended-components will pass a second argument to your functional component (as described by Andrew Clark).

This package uses HOCs and not render props. Don't get me wrong, I use render props a lot, but I think in this case HOCs have slightly advantages like a good separation of concerns and clean code.

Technically extended-components makes use of component squashing, so the original functional component will be squashed by the HOCs to improve performance.

Installation

npm install extended-components
# or
yarn add extended-components

Usage

importReactfrom'react';import{compose,withState,lifecycle,pure}from'extended-components';importuseCounterStatefrom'./useCounterState';constenhance=compose(// Use state helpers to define statewithState({counter: useCounterState(),}),// Use React.js lifecycle hooks with props and statelifecycle((props,{ counter })=>{componentDidUpdate(){counter.increment();},}),// Component is a pure componentpure(),});// Use defined statefunctionComponent(props,state){const{ counter }=state;return(<div><p>This component was updated {counter.count} times.</p><p><buttononClick={()=>{counter.reset()}}>Reset counter</button></p></div>);}exportdefaultenhance(Component);

Hint: You can use the HOCs of extended-components in conjunction with other higher order components, but thus these higher order components don't expect a functional component with two arguments, HOCs of extended-components should always be placed last, e.g.:

constenhance=compose(withRouter(...),connect(...),graphql(...),mapProps(...),// Use extended-components HOCs lastwithState(...),);

Create state helpers

The purpose of this package is to enable a convient way to define state for specific use cases, but not to implement all these use cases. So it is up to you to define state helpers. A state helper is simply an object with the keys initial (for initial state) and mutators (for state mutator functions):

functionuseCounterState(){return{initial: {count: 0,},mutators: setState=>({increment: ()=>{setState(({ count })=>({count: count+1}));},decrement: ()=>{setState(({ count })=>({count: count-1}));},reset: ()=>{setState({count: 0});},}),};}

Then you can reuse this state helper over and over like shown in the example above. For more examples have a look at the examples folder.

Docs

defaultProps

Defines the default props of a component.

typeDefaultProps=((defaultProps: $Shape<Props>)=>void)=>HOC

getDerivedStateFromProps

Defines the static lifecycle hook getDerivedStateFromProps (introduced in React 16.3). Notice that this hook returns void (in comparison to the original hook, which returns a state object), because you can update the state via the state mutators.

typeGetDerivedStateFromProps=((nextProps: Props,prevState?: State)=>void)=>HOC

lifecycle

Defines lifecycle hooks.

typeLifecycle=((props: Props,state?: State,)=>{componentDidMount?: ()=>void,shouldComponentUpdate?: (nextProps: Props,nextState?: State)=>boolean,componentDidUpdate?: (prevProps: Props,prevState?: State)=>void,componentWillUnmount?: ()=>void,},)=>HOC;

pure

Equivalent to React.PureComponent, but instead of a basic shallow state comparison this function makes a shallow comparison for the state of every state helper.

typePure=()=>HOC;

withState

Defines state with state helpers.

typeWithState=({[string]: StateHelper<SubStateValues,SubStateMutators,Props>,})=>HOC;

statics

Defines static properties of a component.

typeStatics=Object=>HOC;

State helpers

As stated above you can define your own state helpers that should be of the following type:

typeSetState<SubStateValues,Props>=($Shape<SubStateValues>|((SubStateValues,Props)=>$Shape<SubStateValues>),)=>void;typeStateHelper<SubStateValues,SubStateMutators,Props>={initial: SubStateValues,mutators: (SetState<SubStateValues,Props>)=>SubStateMutators,};

The definitions above might differ from the real Flow definitions, because the definitions in this section should just demonstrate what you can do with this package.

Flow support

For more information about the usage with Flow see Flow support.

Inspiration

This package is heavily inspired by Andrew Clark's great library recompose. And I think you can perfectly use recompose and extended-components together, because extended-components just mimics all class features and recompose offers a lot more utils. You can use extended-components for state and lifecycle hooks and recompose for props manipulation and more.

Future

Currently there are only two arguments that are passed to a functional component, but you can think of more arguments. So it might be that someday this package will offer an api for higher order components like withTheme, withIntl, withRouter and so on, which add more arguments to the component. Each argument for a specific use case.

License

This package is released under the MIT License.

About

🌟 React.js functional components with default props, advanced local state and lifecycle hooks

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

⚠️ As of React 16.8 it is recommended to use hooks instead of this package.

Extended Components

Extend functional React.js components with default props, advanced local state (presets for common use cases like toggle, counter, ...) and lifecycle hooks.

This package is not meant as a replacement for state management libraries like Redux, it should be used for local state only (i.e. state that is used by not really more than one component).

Problem

There are two problems that motivated me to create this package:

  1. Functional components don't support local state and lifecycle hooks.
  2. There were no presets for common local state use cases (toggles, counters, ...).

Solution

This package consists of some higher order components (HOC), which let you define default props, state and lifecycle methods for a functional component. Also you can define state presets like useCounterState or useToggleState that can be used with the withState HOC perfectly. If you define state, extended-components will pass a second argument to your functional component (as described by Andrew Clark).

This package uses HOCs and not render props. Don't get me wrong, I use render props a lot, but I think in this case HOCs have slightly advantages like a good separation of concerns and clean code.

Technically extended-components makes use of component squashing, so the original functional component will be squashed by the HOCs to improve performance.

Installation

npm install extended-components
# or
yarn add extended-components

Usage

importReactfrom'react';import{compose,withState,lifecycle,pure}from'extended-components';importuseCounterStatefrom'./useCounterState';constenhance=compose(// Use state helpers to define statewithState({counter: useCounterState(),}),// Use React.js lifecycle hooks with props and statelifecycle((props,{ counter })=>{componentDidUpdate(){counter.increment();},}),// Component is a pure componentpure(),});// Use defined statefunctionComponent(props,state){const{ counter }=state;return(<div><p>This component was updated {counter.count} times.</p><p><buttononClick={()=>{counter.reset()}}>Reset counter</button></p></div>);}exportdefaultenhance(Component);

Hint: You can use the HOCs of extended-components in conjunction with other higher order components, but thus these higher order components don't expect a functional component with two arguments, HOCs of extended-components should always be placed last, e.g.:

constenhance=compose(withRouter(...),connect(...),graphql(...),mapProps(...),// Use extended-components HOCs lastwithState(...),);

Create state helpers

The purpose of this package is to enable a convient way to define state for specific use cases, but not to implement all these use cases. So it is up to you to define state helpers. A state helper is simply an object with the keys initial (for initial state) and mutators (for state mutator functions):

functionuseCounterState(){return{initial: {count: 0,},mutators: setState=>({increment: ()=>{setState(({ count })=>({count: count+1}));},decrement: ()=>{setState(({ count })=>({count: count-1}));},reset: ()=>{setState({count: 0});},}),};}

Then you can reuse this state helper over and over like shown in the example above. For more examples have a look at the examples folder.

Docs

defaultProps

Defines the default props of a component.

typeDefaultProps=((defaultProps: $Shape<Props>)=>void)=>HOC

getDerivedStateFromProps

Defines the static lifecycle hook getDerivedStateFromProps (introduced in React 16.3). Notice that this hook returns void (in comparison to the original hook, which returns a state object), because you can update the state via the state mutators.

typeGetDerivedStateFromProps=((nextProps: Props,prevState?: State)=>void)=>HOC

lifecycle

Defines lifecycle hooks.

typeLifecycle=((props: Props,state?: State,)=>{componentDidMount?: ()=>void,shouldComponentUpdate?: (nextProps: Props,nextState?: State)=>boolean,componentDidUpdate?: (prevProps: Props,prevState?: State)=>void,componentWillUnmount?: ()=>void,},)=>HOC;

pure

Equivalent to React.PureComponent, but instead of a basic shallow state comparison this function makes a shallow comparison for the state of every state helper.

typePure=()=>HOC;

withState

Defines state with state helpers.

typeWithState=({[string]: StateHelper<SubStateValues,SubStateMutators,Props>,})=>HOC;

statics

Defines static properties of a component.

typeStatics=Object=>HOC;

State helpers

As stated above you can define your own state helpers that should be of the following type:

typeSetState<SubStateValues,Props>=($Shape<SubStateValues>|((SubStateValues,Props)=>$Shape<SubStateValues>),)=>void;typeStateHelper<SubStateValues,SubStateMutators,Props>={initial: SubStateValues,mutators: (SetState<SubStateValues,Props>)=>SubStateMutators,};

The definitions above might differ from the real Flow definitions, because the definitions in this section should just demonstrate what you can do with this package.

Flow support

For more information about the usage with Flow see Flow support.

Inspiration

This package is heavily inspired by Andrew Clark's great library recompose. And I think you can perfectly use recompose and extended-components together, because extended-components just mimics all class features and recompose offers a lot more utils. You can use extended-components for state and lifecycle hooks and recompose for props manipulation and more.

Future

Currently there are only two arguments that are passed to a functional component, but you can think of more arguments. So it might be that someday this package will offer an api for higher order components like withTheme, withIntl, withRouter and so on, which add more arguments to the component. Each argument for a specific use case.

License

This package is released under the MIT License.

About

🌟 React.js functional components with default props, advanced local state and lifecycle hooks

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

⚠️ As of React 16.8 it is recommended to use hooks instead of this package.

Extended Components

Extend functional React.js components with default props, advanced local state (presets for common use cases like toggle, counter, ...) and lifecycle hooks.

This package is not meant as a replacement for state management libraries like Redux, it should be used for local state only (i.e. state that is used by not really more than one component).

Problem

There are two problems that motivated me to create this package:

  1. Functional components don't support local state and lifecycle hooks.
  2. There were no presets for common local state use cases (toggles, counters, ...).

Solution

This package consists of some higher order components (HOC), which let you define default props, state and lifecycle methods for a functional component. Also you can define state presets like useCounterState or useToggleState that can be used with the withState HOC perfectly. If you define state, extended-components will pass a second argument to your functional component (as described by Andrew Clark).

This package uses HOCs and not render props. Don't get me wrong, I use render props a lot, but I think in this case HOCs have slightly advantages like a good separation of concerns and clean code.

Technically extended-components makes use of component squashing, so the original functional component will be squashed by the HOCs to improve performance.

Installation

npm install extended-components
# or
yarn add extended-components

Usage

importReactfrom'react';import{compose,withState,lifecycle,pure}from'extended-components';importuseCounterStatefrom'./useCounterState';constenhance=compose(// Use state helpers to define statewithState({counter: useCounterState(),}),// Use React.js lifecycle hooks with props and statelifecycle((props,{ counter })=>{componentDidUpdate(){counter.increment();},}),// Component is a pure componentpure(),});// Use defined statefunctionComponent(props,state){const{ counter }=state;return(<div><p>This component was updated {counter.count} times.</p><p><buttononClick={()=>{counter.reset()}}>Reset counter</button></p></div>);}exportdefaultenhance(Component);

Hint: You can use the HOCs of extended-components in conjunction with other higher order components, but thus these higher order components don't expect a functional component with two arguments, HOCs of extended-components should always be placed last, e.g.:

constenhance=compose(withRouter(...),connect(...),graphql(...),mapProps(...),// Use extended-components HOCs lastwithState(...),);

Create state helpers

The purpose of this package is to enable a convient way to define state for specific use cases, but not to implement all these use cases. So it is up to you to define state helpers. A state helper is simply an object with the keys initial (for initial state) and mutators (for state mutator functions):

functionuseCounterState(){return{initial: {count: 0,},mutators: setState=>({increment: ()=>{setState(({ count })=>({count: count+1}));},decrement: ()=>{setState(({ count })=>({count: count-1}));},reset: ()=>{setState({count: 0});},}),};}

Then you can reuse this state helper over and over like shown in the example above. For more examples have a look at the examples folder.

Docs

defaultProps

Defines the default props of a component.

typeDefaultProps=((defaultProps: $Shape<Props>)=>void)=>HOC

getDerivedStateFromProps

Defines the static lifecycle hook getDerivedStateFromProps (introduced in React 16.3). Notice that this hook returns void (in comparison to the original hook, which returns a state object), because you can update the state via the state mutators.

typeGetDerivedStateFromProps=((nextProps: Props,prevState?: State)=>void)=>HOC

lifecycle

Defines lifecycle hooks.

typeLifecycle=((props: Props,state?: State,)=>{componentDidMount?: ()=>void,shouldComponentUpdate?: (nextProps: Props,nextState?: State)=>boolean,componentDidUpdate?: (prevProps: Props,prevState?: State)=>void,componentWillUnmount?: ()=>void,},)=>HOC;

pure

Equivalent to React.PureComponent, but instead of a basic shallow state comparison this function makes a shallow comparison for the state of every state helper.

typePure=()=>HOC;

withState

Defines state with state helpers.

typeWithState=({[string]: StateHelper<SubStateValues,SubStateMutators,Props>,})=>HOC;

statics

Defines static properties of a component.

typeStatics=Object=>HOC;

State helpers

As stated above you can define your own state helpers that should be of the following type:

typeSetState<SubStateValues,Props>=($Shape<SubStateValues>|((SubStateValues,Props)=>$Shape<SubStateValues>),)=>void;typeStateHelper<SubStateValues,SubStateMutators,Props>={initial: SubStateValues,mutators: (SetState<SubStateValues,Props>)=>SubStateMutators,};

The definitions above might differ from the real Flow definitions, because the definitions in this section should just demonstrate what you can do with this package.

Flow support

For more information about the usage with Flow see Flow support.

Inspiration

This package is heavily inspired by Andrew Clark's great library recompose. And I think you can perfectly use recompose and extended-components together, because extended-components just mimics all class features and recompose offers a lot more utils. You can use extended-components for state and lifecycle hooks and recompose for props manipulation and more.

Future

Currently there are only two arguments that are passed to a functional component, but you can think of more arguments. So it might be that someday this package will offer an api for higher order components like withTheme, withIntl, withRouter and so on, which add more arguments to the component. Each argument for a specific use case.

License

This package is released under the MIT License.

About

🌟 React.js functional components with default props, advanced local state and lifecycle hooks

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

⚠️ As of React 16.8 it is recommended to use hooks instead of this package.

Extended Components

Extend functional React.js components with default props, advanced local state (presets for common use cases like toggle, counter, ...) and lifecycle hooks.

This package is not meant as a replacement for state management libraries like Redux, it should be used for local state only (i.e. state that is used by not really more than one component).

Problem

There are two problems that motivated me to create this package:

  1. Functional components don't support local state and lifecycle hooks.
  2. There were no presets for common local state use cases (toggles, counters, ...).

Solution

This package consists of some higher order components (HOC), which let you define default props, state and lifecycle methods for a functional component. Also you can define state presets like useCounterState or useToggleState that can be used with the withState HOC perfectly. If you define state, extended-components will pass a second argument to your functional component (as described by Andrew Clark).

This package uses HOCs and not render props. Don't get me wrong, I use render props a lot, but I think in this case HOCs have slightly advantages like a good separation of concerns and clean code.

Technically extended-components makes use of component squashing, so the original functional component will be squashed by the HOCs to improve performance.

Installation

npm install extended-components
# or
yarn add extended-components

Usage

importReactfrom'react';import{compose,withState,lifecycle,pure}from'extended-components';importuseCounterStatefrom'./useCounterState';constenhance=compose(// Use state helpers to define statewithState({counter: useCounterState(),}),// Use React.js lifecycle hooks with props and statelifecycle((props,{ counter })=>{componentDidUpdate(){counter.increment();},}),// Component is a pure componentpure(),});// Use defined statefunctionComponent(props,state){const{ counter }=state;return(<div><p>This component was updated {counter.count} times.</p><p><buttononClick={()=>{counter.reset()}}>Reset counter</button></p></div>);}exportdefaultenhance(Component);

Hint: You can use the HOCs of extended-components in conjunction with other higher order components, but thus these higher order components don't expect a functional component with two arguments, HOCs of extended-components should always be placed last, e.g.:

constenhance=compose(withRouter(...),connect(...),graphql(...),mapProps(...),// Use extended-components HOCs lastwithState(...),);

Create state helpers

The purpose of this package is to enable a convient way to define state for specific use cases, but not to implement all these use cases. So it is up to you to define state helpers. A state helper is simply an object with the keys initial (for initial state) and mutators (for state mutator functions):

functionuseCounterState(){return{initial: {count: 0,},mutators: setState=>({increment: ()=>{setState(({ count })=>({count: count+1}));},decrement: ()=>{setState(({ count })=>({count: count-1}));},reset: ()=>{setState({count: 0});},}),};}

Then you can reuse this state helper over and over like shown in the example above. For more examples have a look at the examples folder.

Docs

defaultProps

Defines the default props of a component.

typeDefaultProps=((defaultProps: $Shape<Props>)=>void)=>HOC

getDerivedStateFromProps

Defines the static lifecycle hook getDerivedStateFromProps (introduced in React 16.3). Notice that this hook returns void (in comparison to the original hook, which returns a state object), because you can update the state via the state mutators.

typeGetDerivedStateFromProps=((nextProps: Props,prevState?: State)=>void)=>HOC

lifecycle

Defines lifecycle hooks.

typeLifecycle=((props: Props,state?: State,)=>{componentDidMount?: ()=>void,shouldComponentUpdate?: (nextProps: Props,nextState?: State)=>boolean,componentDidUpdate?: (prevProps: Props,prevState?: State)=>void,componentWillUnmount?: ()=>void,},)=>HOC;

pure

Equivalent to React.PureComponent, but instead of a basic shallow state comparison this function makes a shallow comparison for the state of every state helper.

typePure=()=>HOC;

withState

Defines state with state helpers.

typeWithState=({[string]: StateHelper<SubStateValues,SubStateMutators,Props>,})=>HOC;

statics

Defines static properties of a component.

typeStatics=Object=>HOC;

State helpers

As stated above you can define your own state helpers that should be of the following type:

typeSetState<SubStateValues,Props>=($Shape<SubStateValues>|((SubStateValues,Props)=>$Shape<SubStateValues>),)=>void;typeStateHelper<SubStateValues,SubStateMutators,Props>={initial: SubStateValues,mutators: (SetState<SubStateValues,Props>)=>SubStateMutators,};

The definitions above might differ from the real Flow definitions, because the definitions in this section should just demonstrate what you can do with this package.

Flow support

For more information about the usage with Flow see Flow support.

Inspiration

This package is heavily inspired by Andrew Clark's great library recompose. And I think you can perfectly use recompose and extended-components together, because extended-components just mimics all class features and recompose offers a lot more utils. You can use extended-components for state and lifecycle hooks and recompose for props manipulation and more.

Future

Currently there are only two arguments that are passed to a functional component, but you can think of more arguments. So it might be that someday this package will offer an api for higher order components like withTheme, withIntl, withRouter and so on, which add more arguments to the component. Each argument for a specific use case.

License

This package is released under the MIT License.

About

🌟 React.js functional components with default props, advanced local state and lifecycle hooks

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

⚠️ As of React 16.8 it is recommended to use hooks instead of this package.

Extended Components

Extend functional React.js components with default props, advanced local state (presets for common use cases like toggle, counter, ...) and lifecycle hooks.

This package is not meant as a replacement for state management libraries like Redux, it should be used for local state only (i.e. state that is used by not really more than one component).

Problem

There are two problems that motivated me to create this package:

  1. Functional components don't support local state and lifecycle hooks.
  2. There were no presets for common local state use cases (toggles, counters, ...).

Solution

This package consists of some higher order components (HOC), which let you define default props, state and lifecycle methods for a functional component. Also you can define state presets like useCounterState or useToggleState that can be used with the withState HOC perfectly. If you define state, extended-components will pass a second argument to your functional component (as described by Andrew Clark).

This package uses HOCs and not render props. Don't get me wrong, I use render props a lot, but I think in this case HOCs have slightly advantages like a good separation of concerns and clean code.

Technically extended-components makes use of component squashing, so the original functional component will be squashed by the HOCs to improve performance.

Installation

npm install extended-components
# or
yarn add extended-components

Usage

importReactfrom'react';import{compose,withState,lifecycle,pure}from'extended-components';importuseCounterStatefrom'./useCounterState';constenhance=compose(// Use state helpers to define statewithState({counter: useCounterState(),}),// Use React.js lifecycle hooks with props and statelifecycle((props,{ counter })=>{componentDidUpdate(){counter.increment();},}),// Component is a pure componentpure(),});// Use defined statefunctionComponent(props,state){const{ counter }=state;return(<div><p>This component was updated {counter.count} times.</p><p><buttononClick={()=>{counter.reset()}}>Reset counter</button></p></div>);}exportdefaultenhance(Component);

Hint: You can use the HOCs of extended-components in conjunction with other higher order components, but thus these higher order components don't expect a functional component with two arguments, HOCs of extended-components should always be placed last, e.g.:

constenhance=compose(withRouter(...),connect(...),graphql(...),mapProps(...),// Use extended-components HOCs lastwithState(...),);

Create state helpers

The purpose of this package is to enable a convient way to define state for specific use cases, but not to implement all these use cases. So it is up to you to define state helpers. A state helper is simply an object with the keys initial (for initial state) and mutators (for state mutator functions):

functionuseCounterState(){return{initial: {count: 0,},mutators: setState=>({increment: ()=>{setState(({ count })=>({count: count+1}));},decrement: ()=>{setState(({ count })=>({count: count-1}));},reset: ()=>{setState({count: 0});},}),};}

Then you can reuse this state helper over and over like shown in the example above. For more examples have a look at the examples folder.

Docs

defaultProps

Defines the default props of a component.

typeDefaultProps=((defaultProps: $Shape<Props>)=>void)=>HOC

getDerivedStateFromProps

Defines the static lifecycle hook getDerivedStateFromProps (introduced in React 16.3). Notice that this hook returns void (in comparison to the original hook, which returns a state object), because you can update the state via the state mutators.

typeGetDerivedStateFromProps=((nextProps: Props,prevState?: State)=>void)=>HOC

lifecycle

Defines lifecycle hooks.

typeLifecycle=((props: Props,state?: State,)=>{componentDidMount?: ()=>void,shouldComponentUpdate?: (nextProps: Props,nextState?: State)=>boolean,componentDidUpdate?: (prevProps: Props,prevState?: State)=>void,componentWillUnmount?: ()=>void,},)=>HOC;

pure

Equivalent to React.PureComponent, but instead of a basic shallow state comparison this function makes a shallow comparison for the state of every state helper.

typePure=()=>HOC;

withState

Defines state with state helpers.

typeWithState=({[string]: StateHelper<SubStateValues,SubStateMutators,Props>,})=>HOC;

statics

Defines static properties of a component.

typeStatics=Object=>HOC;

State helpers

As stated above you can define your own state helpers that should be of the following type:

typeSetState<SubStateValues,Props>=($Shape<SubStateValues>|((SubStateValues,Props)=>$Shape<SubStateValues>),)=>void;typeStateHelper<SubStateValues,SubStateMutators,Props>={initial: SubStateValues,mutators: (SetState<SubStateValues,Props>)=>SubStateMutators,};

The definitions above might differ from the real Flow definitions, because the definitions in this section should just demonstrate what you can do with this package.

Flow support

For more information about the usage with Flow see Flow support.

Inspiration

This package is heavily inspired by Andrew Clark's great library recompose. And I think you can perfectly use recompose and extended-components together, because extended-components just mimics all class features and recompose offers a lot more utils. You can use extended-components for state and lifecycle hooks and recompose for props manipulation and more.

Future

Currently there are only two arguments that are passed to a functional component, but you can think of more arguments. So it might be that someday this package will offer an api for higher order components like withTheme, withIntl, withRouter and so on, which add more arguments to the component. Each argument for a specific use case.

License

This package is released under the MIT License.

About

🌟 React.js functional components with default props, advanced local state and lifecycle hooks

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages