Un esempio con la strategia
Mi piacciono le soluzioni fornite che usano per fare la stessa cosa creando un wrapper attorno al componente.
Dato che si tratta più di un comportamento, ho pensato alla strategia e ho pensato a quanto segue.
Sono nuovo con React e ho bisogno di un po 'di aiuto per salvare un po' di scaldabagno nei casi d'uso
Per favore, rivedi e dimmi cosa ne pensi.
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)
}
}
}
Esempio di utilizzo
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() {...}
}
Appunti
Ho pensato di conservare i component
ganci del ciclo di vita passati e sostituirli con metodi simili a questo:
const baseDidMount = component.componentDidMount;
component.componentDidMount = () => {
this.enable();
baseDidMount.call(component)
}
component
è il componente passato al costruttore di ClickOutsideBehavior
.
Ciò rimuoverà l'abilitazione / disabilitazione del boilerplate dall'utente di questo comportamento, ma non sembra molto carino