Strateji ile bir örnek
Bileşenin etrafında bir sarıcı oluşturarak aynı şeyi yapmak için kullanılan çözümleri seviyorum.
Bu daha çok bir davranış olduğundan, Stratejiyi düşündüm ve aşağıdakileri buldum.
React ile yeniyim ve kullanım durumlarında bazı kazanları kaydetmek için biraz yardıma ihtiyacım var
Lütfen bana ne düşündüğünü söyle.
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)
}
}
}
Örnek Kullanımı
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() {...}
}
notlar
Geçilen component
yaşam döngüsü kancalarını saklamayı ve buna benzeyen yöntemlerle geçersiz kılmayı düşündüm :
const baseDidMount = component.componentDidMount;
component.componentDidMount = () => {
this.enable();
baseDidMount.call(component)
}
component
'nin yapıcısına iletilen bileşendir ClickOutsideBehavior
.
Bu, bu davranışın kullanıcıdan etkinleştirme / devre dışı bırakma plakasını kaldıracak, ancak çok hoş görünmüyor