ฉันมาจาก Angular เช่นกันและลองทำ React ณ ตอนนี้มีวิธีหนึ่งที่แนะนำ (?) ดูเหมือนว่าจะใช้ส่วนประกอบที่สั่งซื้อสูง :
ส่วนประกอบลำดับสูงกว่า (HOC) เป็นเทคนิคขั้นสูงใน React สำหรับการนำองค์ประกอบเชิงตรรกะกลับมาใช้ใหม่ HOCs ไม่ได้เป็นส่วนหนึ่งของ React API พวกเขาเป็นรูปแบบที่เกิดขึ้นจากธรรมชาติขององค์ประกอบของปฏิกิริยา
สมมติว่าคุณมี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>
)
จากนั้นเขียน HOC ที่ตรวจสอบและห่อองค์ประกอบ
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} />
}
}
}
ตอนนี้ HOC เหล่านั้นมีพฤติกรรมการตรวจสอบที่เหมือนกัน:
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]} />
Edit2 : React 16.8+ มอบฟีเจอร์ใหม่Hookซึ่งเป็นอีกวิธีที่ดีในการแบ่งปันตรรกะ
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