Ein Beispiel mit Strategie
Ich mag die bereitgestellten Lösungen, die das Gleiche tun, indem sie einen Wrapper um die Komponente erstellen.
Da dies eher ein Verhalten ist, dachte ich an Strategie und kam auf Folgendes.
Ich bin neu bei React und brauche ein bisschen Hilfe, um in den Anwendungsfällen etwas Boilerplate zu sparen
Bitte überprüfen Sie und sagen Sie mir, was Sie denken.
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)
}
}
}
Beispielnutzung
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() {...}
}
Anmerkungen
Ich dachte daran, die übergebenen component
Lifecycle-Hooks zu speichern und sie mit ähnlichen Methoden zu überschreiben:
const baseDidMount = component.componentDidMount;
component.componentDidMount = () => {
this.enable();
baseDidMount.call(component)
}
component
ist die Komponente, die an den Konstruktor von übergeben wird ClickOutsideBehavior
.
Dadurch wird das Aktivierungs- / Deaktivierungs-Boilerplate vom Benutzer dieses Verhaltens entfernt, aber es sieht nicht besonders gut aus