Skip to main content

HOC with hooks - testing hooks

https://github.com/testing-library/react-hooks-testing-library

export const Foo = ({ bar }) => {
  const { result, loading, error } = useRequest(bar);
  if (error) {
    return <ErrorComponent />;
  } else if (loading) {
    return <LoadingComponent />;
  }
  return <ResultComponent result={result} />;
};

This looks reasonably good at a glance, but what about when we have to repeat this pattern for a dozen different requests? You would copy and paste this conditional block to each of those different implementations and in each of them, it would need to be tested on its own.
An HoC implementation could resemble something like this:
const Foo = ({ result }) => <ResultComponent result={result} />;const withRequest = BaseComponent => ({ bar, ...props }) => { const { result, loading, error } = useRequest(bar); return ( <BaseComponent {...props} result={result} loading={loading} error={error} /> ); };const withError = branch(({ error }) => error, ErrorComponent);const withLoading = branch(({ loading }) => loading, LoadingComponent);export default compose( withRequest, withLoading, withError )(Foo);

Prop Mutation

const Result = ({ bar }) => <ResultComponent result={bar} />;const withBar = BaseComponent => ({ foo, ...props }) => (
  <BaseComponent {...props} bar={transform(foo)} />
);export default withBar(Result);
const ResultComponent = (props) => {
const { hello } = props
return (
<div>
<h1>{hello}</h1>
</div>
)
}
ResultComponent.propTypes = {
hello: PropTypes.string.isRequired,
};
const withHello = BaseComponent => (props) => {
const { name } = props
const str = `Hi ${name}`
return <BaseComponent hello={str} />
}
const Hello = withHello(
ResultComponent
);
<Hello name='Joe' />

Comments

Popular posts from this blog

check variable undefined with quokka

// listingId = '', 0, null, undefined, false //let listingId if ( typeof listingId === 'undefined' ) console . log ( 'listingId is undefined' ) else console . log ( listingId ) if (!! listingId ) console . log ( listingId ) else console . log ( 'listingId does not found' ) if ( listingId ) console . log ( listingId ) else console . log ( 'listingId does not found' ) if ( listingId === undefined ) console . log ( 'listingId does not found' ) else console . log ( listingId )

apollo client v3 - clean up non-needed packages

v3: https://github.com/apollographql/apollo-client clean up: ApolloProvider useQuery, useMutation, useApolloClient Apollo Client >= 3 includes React hooks functionality out of the box. You don't need to install any additional packages. https://www.apollographql.com/docs/react/api/react/hooks/ //import { ApolloProvider } from '@apollo/react-hooks' import { ApolloProvider } from '@apollo/client/react' //import { useQuery, useMutation, useApolloClient } from '@apollo/react-hooks' import { useQuery, useMutation, useApolloClient } from '@apollo/client' How i can CATCH any error (network and graphql), and prevent promise.reject()  https://github.com/apollographql/apollo-client/issues/6469 npm uninstall @apollo/react-hooks https://github.com/apollographql/apollo-link npm uninstall apollo-link npm uninstall apollo-client npm uninstall apollo-link-error npm uninstall apollo-link-http npm uninstall apollo-link-ws npm uninstall apollo-cache-inmemory