react-dynamic-inputs
v1.0.2
Published
Lightweight component for creating dynamic inputs
Maintainers
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!
