আমিও কৌণিক থেকে এসেছি এবং প্রতিক্রিয়ার চেষ্টা করছি, এখন পর্যন্ত, প্রস্তাবিত (?) উপায়টি হাই-অর্ডার উপাদান ব্যবহার করছে বলে মনে হচ্ছে :
উপাদানগুলির যুক্তি পুনরায় ব্যবহারের জন্য একটি উচ্চ-অর্ডার উপাদান (এইচওসি) একটি প্রতিক্রিয়াযুক্ত একটি উন্নত প্রযুক্তি। HOCs প্রতিক্রিয়া এপিআই এর অংশ নয়, প্রতি সে। এগুলি এমন একটি প্যাটার্ন যা রিএ্যাক্টের গঠনমূলক প্রকৃতি থেকে উদ্ভূত হয়।
ধরা যাক আপনার আছে input
এবং textarea
একই বৈধতা যুক্তি প্রয়োগ করতে চান:
const Input = (props) => (
<input type="text"
style={props.style}
onChange={props.onChange} />
)
const TextArea = (props) => (
<textarea rows="3"
style={props.style}
onChange={props.onChange} >
</textarea>
)
তারপরে এমন একটি এইচওসি লিখুন যা মোড়ানো উপাদানকে বৈধতা দেয় এবং শৈলী করে:
function withValidator(WrappedComponent) {
return class extends React.Component {
constructor(props) {
super(props)
this.validateAndStyle = this.validateAndStyle.bind(this)
this.state = {
style: {}
}
}
validateAndStyle(e) {
const value = e.target.value
const valid = value && value.length > 3 // shared logic here
const style = valid ? {} : { border: '2px solid red' }
console.log(value, valid)
this.setState({
style: style
})
}
render() {
return <WrappedComponent
onChange={this.validateAndStyle}
style={this.state.style}
{...this.props} />
}
}
}
এখন H এইচওসিগুলি একই বৈধকরণের আচরণটি ভাগ করছে:
const InputWithValidator = withValidator(Input)
const TextAreaWithValidator = withValidator(TextArea)
render((
<div>
<InputWithValidator />
<TextAreaWithValidator />
</div>
), document.getElementById('root'));
আমি একটি সাধারণ ডেমো তৈরি করেছি ।
সম্পাদনা করুন : অন্য একটি ডেমো ক্রিয়াকলাপগুলির অ্যারে পাস করার জন্য প্রপস ব্যবহার করছে যাতে আপনি একাধিক বৈধতা ফাংশনগুলির দ্বারা রচিত লজিকগুলি HOC
এর মতো করে ভাগ করতে পারেন:
<InputWithValidator validators={[validator1,validator2]} />
<TextAreaWithValidator validators={[validator1,validator2]} />
সম্পাদনা 2 : প্রতিক্রিয়া 16.8+ একটি নতুন বৈশিষ্ট্য সরবরাহ করে, হুক , যুক্তি ভাগ করার আরও একটি দুর্দান্ত উপায়।
const Input = (props) => {
const inputValidation = useInputValidation()
return (
<input type="text"
{...inputValidation} />
)
}
function useInputValidation() {
const [value, setValue] = useState('')
const [style, setStyle] = useState({})
function handleChange(e) {
const value = e.target.value
setValue(value)
const valid = value && value.length > 3 // shared logic here
const style = valid ? {} : { border: '2px solid red' }
console.log(value, valid)
setStyle(style)
}
return {
value,
style,
onChange: handleChange
}
}
https://stackblitz.com/edit/react-shared-validation-logic-using-hook?file=index.js