ตัวอย่างกับกลยุทธ์
ฉันชอบโซลูชันที่มีให้ซึ่งใช้ในการทำสิ่งเดียวกันโดยการสร้างเสื้อคลุมรอบองค์ประกอบ
เนื่องจากนี่เป็นพฤติกรรมที่มากกว่าฉันคิดถึงกลยุทธ์และทำสิ่งต่อไปนี้
ฉันใหม่กับ React และฉันต้องการความช่วยเหลือเล็กน้อยเพื่อบันทึกแผ่นเหล็กบางส่วนในกรณีการใช้งาน
โปรดตรวจสอบและบอกสิ่งที่คุณคิด
ClickOutsideBehavior
import ReactDOM from 'react-dom';
export default class ClickOutsideBehavior {
constructor({component, appContainer, onClickOutside}) {
// Can I extend the passed component's lifecycle events from here?
this.component = component;
this.appContainer = appContainer;
this.onClickOutside = onClickOutside;
}
enable() {
this.appContainer.addEventListener('click', this.handleDocumentClick);
}
disable() {
this.appContainer.removeEventListener('click', this.handleDocumentClick);
}
handleDocumentClick = (event) => {
const area = ReactDOM.findDOMNode(this.component);
if (!area.contains(event.target)) {
this.onClickOutside(event)
}
}
}
ตัวอย่างการใช้งาน
import React, {Component} from 'react';
import {APP_CONTAINER} from '../const';
import ClickOutsideBehavior from '../ClickOutsideBehavior';
export default class AddCardControl extends Component {
constructor() {
super();
this.state = {
toggledOn: false,
text: ''
};
this.clickOutsideStrategy = new ClickOutsideBehavior({
component: this,
appContainer: APP_CONTAINER,
onClickOutside: () => this.toggleState(false)
});
}
componentDidMount () {
this.setState({toggledOn: !!this.props.toggledOn});
this.clickOutsideStrategy.enable();
}
componentWillUnmount () {
this.clickOutsideStrategy.disable();
}
toggleState(isOn) {
this.setState({toggledOn: isOn});
}
render() {...}
}
หมายเหตุ
ฉันคิดถึงการจัดเก็บcomponent
hooks lifecycle ที่ผ่านไปและแทนที่พวกเขาด้วย method simillar ในสิ่งนี้:
const baseDidMount = component.componentDidMount;
component.componentDidMount = () => {
this.enable();
baseDidMount.call(component)
}
component
ClickOutsideBehavior
เป็นส่วนประกอบที่ผ่านมาคอนสตรัคของ
สิ่งนี้จะลบการเปิดใช้งาน / ปิดใช้งาน boilerplate จากผู้ใช้ของพฤติกรรมนี้ แต่มันก็ดูไม่ค่อยดีนัก