1.0.3 • Published 3 months ago

react-cloner v1.0.3

Weekly downloads
1
License
MIT
Repository
github
Last release
3 months ago

react-cloner

Add/Remove Form Fields or other Components Dynamically

NPM JavaScript Style Guide

Demo

React Cloner Demo

Install

npm install --save react-cloner

OR

yarn add react-cloner

Usage

import Cloner from 'react-cloner'

export default function ContactPeopleForm() {
  function handleSubmit(event) {
    event.preventDefault()
    let form = {},
      formData = new FormData(event.target)
    for (let pair of formData.entries()) {
      let key = pair[0],
        value = pair[1]
      form[key] = value
    }
    alert(JSON.stringify(form, 0, 2))
  }
  return (
    <div className='col py-3'>
      <form onSubmit={handleSubmit}>
        <Cloner
          title='Contact Person'
          addButtonClassName='btn btn-outline-primary'
          deleteButtonClassName='btn btn-outline-danger'
          deleteButtonWrapperClassName='form-group'
          component={<ContactPerson />}
          componentWrapperClassName='d-flex w-100 align-items-end justify-content-between mb-3'
        />
        <button type='submit' className='btn btn-primary'>
          Submit
        </button>
      </form>
    </div>
  )
}

// increment prop is passed onto the Cloner component by default
// it counts the number of the cloned component from 1 onwards
function ContactPerson({ increment }) {
  return (
    <div className='row w-100 mx-auto'>
      <div className='pl-0 col col-12 col-md-4 form-group'>
        <label>Name</label>
        <input
          name={`contact-person-name-${increment}`}
          className='form-control'
        />
      </div>
      <div className='px-0 col col-12 col-md-5 form-group'>
        <label>Email</label>
        <input
          name={`contact-person-email-${increment}`}
          className='form-control'
        />
      </div>
      <div
        className={`${
          increment === 1 ? 'pr-0' : ''
        } col col-12 col-md-3 form-group`}
      >
        <label>Phone</label>
        <input
          name={`contact-person-phone-${increment}`}
          className='form-control'
        />
      </div>
    </div>
  )
}

Props

PropExplanationData Type(Sample) ValuesDefault
titlesemantic name of component to be clonedStringContact PersonReferralnull
initialItemsnumber of times component specified to appear initiallyNumber521
componentreact component to be clonedReactconst Example = () => { return <div/> }class Example extends Component { render(){ return(<div/>) }} => { return <div/> }null
onDeletecallback on each cloned component deleteFunc(index) => console.log("deleted %s", index)null
shouldHideLabelhide cloned component label?Booltruefalsetrue
addButtonPositionhorizontal alignment of add buttonStringleftrightright
componentWrapperStyleCloner parent wrapper styleObject{}{background: "red"}null
componentWrapperClassNameCloner parent wrapper classStringmargin-autopy-3null
labelClassNamecloned component label classStringtext-mutednull
addButtonClassNameadd (component) button classStringbtnbutton-primary""
deleteButtonClassNamecloned component delete button classStringbtn-dangerb-rednull
deleteButtonWrapperClassNamecloned component delete button parent wrapper classStringd-inlinepy-3null
shouldRemoveDeleteWrapperwhether to remove the wrapper component around delete buttonBooltruefalsefalse

License

MIT © BossBele

1.0.3

3 months ago

1.0.2

4 months ago

1.0.1

9 months ago

1.0.0

9 months ago

0.7.0

3 years ago

0.6.0

4 years ago

0.5.0

4 years ago