Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

react-dynamic-inputs

TheProjectsX39MIT1.0.2TypeScript support: included

Lightweight component for creating dynamic inputs

dynamic-input, react, input-tag, multi-input

readme

React Dynamic Inputs Component

The react-dynamic-inputs component allows you to create a dynamic list of input fields where users can add or remove input items. It is highly customizable with support for a custom layout, input validation, and dynamic item addition/removal.

🌐 Demo

Checkout Demo of react-dynamic-inputs

Properties

Property Type Description
onChange (values: string[]) => void A callback function that is triggered when the values in the input fields change. It receives an array of updated values as a parameter.
children (inputProps: { handleOnChange: (e: React.ChangeEvent<HTMLInputElement>) => void; defaultValue: string }, removeButtonProps: { handleOnClick: (e: React.MouseEvent<HTMLElement>) => void; disabled: boolean }) => React.ReactElement A custom render function that allows you to pass custom input fields and remove buttons. The function receives inputProps and removeButtonProps for customization.
defaultValues string[] Give Default Values of the Input(s). If given value count is smaller than defaultItemsCount, no default Value will be given. Useful when component rendering based on condition
defaultItemsCount number The number of input fields to be initially displayed. Default is 2.
minItems number The minimum number of input fields that should be allowed. Default is 0.
maxItems number | null The maximum number of input fields allowed. If set to null, there's no upper limit.
className string A custom CSS class name that will be applied to the root element of the component.
style React.CSSProperties Inline styles that will be applied to the root element of the component.
inputWrapperStyle React.CSSProperties Inline styles that will be applied to each input wrapper element.
addButtonLabel React.ReactNode | null The label for the "Add More" button. Default is "Add More".
customAddButton React.ReactElement<any, any> | null A custom React element to render as the "Add More" button. If provided, this will replace the default button.

Example

import React, { useState } from "react";
import DynamicInputs from "react-dynamic-inputs";

const App = () => {
    const [inputValues, setInputValues] = useState([]);

    const handleValuesChange = (values) => {
        setInputValues(values);
    };

    return (
        <div>
            <h1>Dynamic Inputs Example</h1>

            <DynamicInputs
                onChange={handleValuesChange}
                defaultItems={3}
                minItems={1}
                maxItems={5}
                addButtonLabel="Add More Fields"
                className="my-custom-class"
            />

            <div>
                <h2>Current Input Values:</h2>
                <pre>{JSON.stringify(inputValues, null, 2)}</pre>
            </div>
        </div>
    );
};

export default App;

Key Notes:

  • onChange: This will update the parent component with the current values whenever any input field is updated.
  • defaultItems: You can specify how many input fields should be present when the component is first rendered.
  • minItems & maxItems: These properties ensure that the number of inputs stays within the allowed limits.
  • customAddButton: If you want to replace the default "Add More" button, pass in your custom button as a React element.

Custom Rendering

You can also pass a custom render function as the children prop, which allows you to have full control over how each input and remove button are rendered.

Example of using children:

import React, { useState } from "react";
import DynamicInputs from "react-dynamic-inputs";

const App = () => {
    const [inputValues, setInputValues] = useState([]);

    const handleValuesChange = (values) => {
        setInputValues(values);
    };

    return (
        <div>
            <h1>Dynamic Input Example</h1>

            <DynamicInputs
                onChange={handleValuesChange}
                defaultItems={2}
                minItems={1}
                maxItems={5}
            >
                {(inputProps, removeButtonProps) => (
                    <div className="custom-input-wrapper">
                        <input {...inputProps} className="custom-input" />
                        <button
                            {...removeButtonProps}
                            className="custom-remove-button"
                        >
                            Remove
                        </button>
                    </div>
                )}
            </DynamicInputs>
        </div>
    );
};

export default App;

In this example, the children function receives inputProps (for the input element) and removeButtonProps (for the remove button), allowing you to customize their appearance and behavior.

Example

There is also a useable Example in example folder. Feel free to check it out!