যারা বড় আকারের লাইব্রেরি ব্যবহার না করে সম্পূর্ণ নিয়ন্ত্রিত ফর্ম উপাদান তৈরি করতে চান তাদের জন্য কেবল একটি জিনিস thing
রেডাক্সফর্মহেল্পার - একটি ছোট ES6 শ্রেণি, 100 লাইনের চেয়ে কম:
class ReduxFormHelper {
constructor(props = {}) {
let {formModel, onUpdateForm} = props
this.props = typeof formModel === 'object' &&
typeof onUpdateForm === 'function' && {formModel, onUpdateForm}
}
resetForm (defaults = {}) {
if (!this.props) return false
let {formModel, onUpdateForm} = this.props
let data = {}, errors = {_flag: false}
for (let name in formModel) {
data[name] = name in defaults? defaults[name] :
('default' in formModel[name]? formModel[name].default : '')
errors[name] = false
}
onUpdateForm(data, errors)
}
processField (event) {
if (!this.props || !event.target) return false
let {formModel, onUpdateForm} = this.props
let {name, value, error, within} = this._processField(event.target, formModel)
let data = {}, errors = {_flag: false}
if (name) {
value !== false && within && (data[name] = value)
errors[name] = error
}
onUpdateForm(data, errors)
return !error && data
}
processForm (event) {
if (!this.props || !event.target) return false
let form = event.target
if (!form || !form.elements) return false
let fields = form.elements
let {formModel, onUpdateForm} = this.props
let data = {}, errors = {}, ret = {}, flag = false
for (let n = fields.length, i = 0; i < n; i++) {
let {name, value, error, within} = this._processField(fields[i], formModel)
if (name) {
value !== false && within && (data[name] = value)
value !== false && !error && (ret[name] = value)
errors[name] = error
error && (flag = true)
}
}
errors._flag = flag
onUpdateForm(data, errors)
return !flag && ret
}
_processField (field, formModel) {
if (!field || !field.name || !('value' in field))
return {name: false, value: false, error: false, within: false}
let name = field.name
let value = field.value
if (!formModel || !formModel[name])
return {name, value, error: false, within: false}
let model = formModel[name]
if (model.required && value === '')
return {name, value, error: 'missing', within: true}
if (model.validate && value !== '') {
let fn = model.validate
if (typeof fn === 'function' && !fn(value))
return {name, value, error: 'invalid', within: true}
}
if (model.numeric && isNaN(value = Number(value)))
return {name, value: 0, error: 'invalid', within: true}
return {name, value, error: false, within: true}
}
}
এটি আপনার জন্য সমস্ত কাজ করে না। তবে এটি নিয়ন্ত্রিত ফর্ম উপাদানটি তৈরি, বৈধকরণ এবং পরিচালনা করার সুবিধার্থে। আপনি কেবল উপরের কোডটি আপনার প্রকল্পে অনুলিপি করতে বা তার পরিবর্তে সম্পর্কিত লাইব্রেরি - redux-form-helper
(প্লাগ!) অন্তর্ভুক্ত করতে পারেন।
ব্যবহারবিধি
প্রথম পদক্ষেপটি হ'ল রেডাক্স রাজ্যে নির্দিষ্ট ডেটা যুক্ত করা যা আমাদের ফর্মের রাজ্যের প্রতিনিধিত্ব করবে। এই ডেটাগুলির মধ্যে বর্তমান ক্ষেত্রের মানগুলি পাশাপাশি ফর্মের প্রতিটি ক্ষেত্রের জন্য ত্রুটিযুক্ত পতাকাগুলির সেট অন্তর্ভুক্ত থাকবে।
ফর্ম রাজ্যটি কোনও বিদ্যমান রিডুসারে যুক্ত করা যেতে পারে বা একটি পৃথক রিডুসারে সংজ্ঞায়িত করা যেতে পারে।
তদ্ব্যতীত ফর্মের রাজ্যের পাশাপাশি স্বতন্ত্র ক্রিয়া নির্মাতাকে নির্দিষ্ট ক্রিয়াকলাপের আপডেটের সংজ্ঞা দেওয়া প্রয়োজন।
ক্রিয়া উদাহরণ :
export const FORM_UPDATE = 'FORM_UPDATE'
export const doFormUpdate = (data, errors) => {
return { type: FORM_UPDATE, data, errors }
}
...
হ্রাস উদাহরণ :
...
const initialState = {
formData: {
field1: '',
...
},
formErrors: {
},
...
}
export default function reducer (state = initialState, action) {
switch (action.type) {
case FORM_UPDATE:
return {
...ret,
formData: Object.assign({}, formData, action.data || {}),
formErrors: Object.assign({}, formErrors, action.errors || {})
}
...
}
}
দ্বিতীয় এবং চূড়ান্ত পদক্ষেপটি হ'ল আমাদের ফর্মের জন্য একটি ধারক উপাদান তৈরি করা এবং এটি রেডাক্স রাজ্য এবং ক্রিয়াগুলির সংশ্লিষ্ট অংশের সাথে সংযুক্ত করুন।
এছাড়াও আমাদের ফর্ম ক্ষেত্রগুলির বৈধতা উল্লেখ করে একটি ফর্ম মডেল নির্ধারণ করতে হবে। এখন আমরা ReduxFormHelper
উপাদানটির সদস্য হিসাবে অবজেক্টটি ইনস্ট্যান্ট করি এবং সেখানে আমাদের ফর্ম মডেল এবং ফর্মের স্থিতির একটি কলব্যাক প্রেরণযোগ্য আপডেটটি পাস করি।
তারপরে উপাদানটির render()
পদ্ধতিতে আমাদের প্রতিটি ক্ষেত্রের onChange
এবং ফর্মের onSubmit
ইভেন্টগুলি যথাযথভাবে processField()
এবং processForm()
পদ্ধতিগুলির সাথে আবদ্ধ করতে হবে এবং রাজ্যের ফর্ম ত্রুটির পতাকাগুলির উপর নির্ভর করে প্রতিটি ক্ষেত্রের জন্য ত্রুটি ব্লক প্রদর্শন করতে হবে।
নীচের উদাহরণটি টুইটার বুটস্ট্র্যাপ ফ্রেমওয়ার্ক থেকে সিএসএস ব্যবহার করে।
ধারক উপাদান উদাহরণ :
import React, {Component} from 'react';
import {connect} from 'react-redux'
import ReduxFormHelper from 'redux-form-helper'
class MyForm extends Component {
constructor(props) {
super(props);
this.helper = new ReduxFormHelper(props)
this.helper.resetForm();
}
onChange(e) {
this.helper.processField(e)
}
onSubmit(e) {
e.preventDefault()
let {onSubmitForm} = this.props
let ret = this.helper.processForm(e)
ret && onSubmitForm(ret)
}
render() {
let {formData, formErrors} = this.props
return (
<div>
{!!formErrors._flag &&
<div className="alert" role="alert">
Form has one or more errors.
</div>
}
<form onSubmit={this.onSubmit.bind(this)} >
<div className={'form-group' + (formErrors['field1']? ' has-error': '')}>
<label>Field 1 *</label>
<input type="text" name="field1" value={formData.field1} onChange={this.onChange.bind(this)} className="form-control" />
{!!formErrors['field1'] &&
<span className="help-block">
{formErrors['field1'] === 'invalid'? 'Must be a string of 2-50 characters' : 'Required field'}
</span>
}
</div>
...
<button type="submit" className="btn btn-default">Submit</button>
</form>
</div>
)
}
}
const formModel = {
field1: {
required: true,
validate: (value) => value.length >= 2 && value.length <= 50
},
...
}
function mapStateToProps (state) {
return {
formData: state.formData, formErrors: state.formErrors,
formModel
}
}
function mapDispatchToProps (dispatch) {
return {
onUpdateForm: (data, errors) => {
dispatch(doFormUpdate(data, errors))
},
onSubmitForm: (data) => {
// dispatch some action which somehow updates state with form data
}
}
}
export default connect(mapStateToProps, mapDispatchToProps)(MyForm)
ডেমো
redux-forms
? আমি ভাবছি কীভাবে সেই বয়লারপ্লেটগুলি স্কেলগুলি প্রতিক্রিয়া ফর্মগুলির সাথে তুলনা করে