대시 보드에는 다음과 같은 간단한 구성 요소가 있습니다. 대시 보드 객체는 소품을 통해 주입됩니다. handleDeleteDashboard 액션은 대시 보드가 마지막으로 사용 가능한 것이 아닌지를 확인합니다. 그럴 경우 삭제할 수 없습니다. 이 검사를 위해 mapStateToProps의 저장소에서 얻는 nrOfDashboards가 필요합니다. 그래서 컴포넌트를 redux 스토어에 연결했습니다. onClick 처리기에서 context.store.getState()를 안티 패턴으로 사용하고 있습니까?
class Dashboard extends Component {
constructor(props) {
super(props);
this.handleDeleteDashboard = this.handleDeleteDashboard.bind(this);
}
handleDeleteDashboard() {
const { dashboardDeleteAction, dashboard, nrOfDashboards } = this.props;
if (nrOfDashboards < 2) {
// NOT Allowed to delete
} else {
dashboardDeleteAction(dashboard.id);
}
}
render() {
const { dashboard } = this.props;
return (
<Content>
<h1>{dashboard.name}</h1>
<Button onButtonClick={this.handleDeleteDashboard}>Delete</Button>
</Content>
);
}
}
Dashboard.propTypes = {
dashboard: customPropTypes.dashboard.isRequired,
nrOfDashboards: PropTypes.number.isRequired
};
function mapStateToProps(state) {
return {
nrOfDashboards: selectNrOfDashboards(state)
}
}
export default connect(mapStateToProps, { dashboardDeleteAction: dashboardActionCreators.dashboardDelete })(Dashboard);
하지만 지금은 구성 요소가 저장하고 업데이트에 가입 할 때마다 nrOfDashboards 변경 (내가 다시 렌더링의 경우에 방지하기 위해 여기에 shouldComponentUpdate을 수행 할 수 있습니다 알고 있지만 그 지점하지 않습니다). 그래서 기본적으로 삭제 버튼을 클릭 할 때만이 정보가 필요하지만 기본적으로 nrOfDashboards의 변경 사항을 구독하고 있습니다.
그래서 저는 대체 솔루션을 생각해 보았습니다. 저장소에서 Component를 연결 해제하고 handleDeleteDashboard 메소드의 컨텍스트를 통해 저장소에 액세스했습니다.
이 기능은 저에게 잘 돌아가며 적극적으로 버튼을 클릭 할 때마다 저장소에서 새로운 상태를 유지합니다. 어쨌든, 전에이 기술을 다른 곳에서 본 적이 없으며 저장소에 액세스하는 것이 mapStateToProps 외부에서 수행되어서는 안됩니다. 하지만 제 질문은 주문형 상점에 직접 액세스하는 것이 안티 패턴이고, 구성 요소를 상점에 연결하는 코드 예제 1을 따라야하는 것이 더 나은가요?