Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including hook2hoc with all npm packages installed. Try it out:

require("react/package.json"); // react is a peer dependency. var hook2hoc = require("hook2hoc")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

hook2hoc v1.0.0

Typesafe converter of React hooks to React hocs 🤓

hook2hoc

Typesafe converter of React hooks to React hocs 🤓

What and why

Main purpose of this project is making integration of hooks to existing project much easier. This is an automate and type-safe converter of React hooks to React HOCs. Just move your logic to hook, create a HOC for compatability and go.

Installation

npm install hook2hoc

Usage

The main purpose of this project is to easily reuse your custom hooks logic in class components.

function useFormInput(defaultValue) {
  const [value, setValue] = React.useState(defaultValue);
  return {
    value,
    onChange: e => setValue(e.target.value)
  };
}

class ClassComponent extends React.Component {
  ...
  
  render() {
    const { value, onChange } = this.props.formInput;
    return <input value={value} onChange={onChange} />;
  }
}

export default hook2hoc("formInput", useFormInput)(ClassComponent)
// or with default args
export default hook2hoc("formInput", useFormInput, ["initalValue"])(ClassComponent)

Dynamic props

It is also possible to pass arguments to your hooks directly from the props. Just use function instead of array in last argument.

hook2hoc("formInput", useFormInput, (props) => props.someValueFromOutside)(ClassComponent)

Type safety

This helper was created with static typing in mind. For typescript users it will infer the types properly. One thing is required for dynamic props

import { hook2hoc, tuple } from "hook2hoc"

type Props = {
  someAnotherProp: string;
  input: {
    value: string | undefined;
    onChange: (value: React.ChangeEvent<HTMLInputElement>) => void;
  };
};

class ClassComponent extends React.Component<Props> {
  render() {
    const { value, onChange } = this.props.input;
    return <input value={value} onChange={onChange} />;
  }
}

function useFormInput(defaultValue: string, foo?: number) {
  const [value, setValue] = React.useState(defaultValue);
  return {
    value,
    onChange: (e: React.ChangeEvent<HTMLInputElement>) => setValue(e.target.value)
  };
}

// tuple required for strict parameters type casting
const WithHook = hook2hoc("formInput", useFormInput, props => tuple(["initialValue"]))

<WithHook someAnotherProp="required as well" />

Metadata

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free