2017-11-27 6 views
0

기본적으로 내가 달성하고자하는 것은 누군가가 제출을 시작할 때 모든 확장기를 여는 것입니다. 꽤 쉽게 들릴지 모르겠지만 내가 얻은 해결책은 꽤 못생긴다. 액션이 전달되면 redux의 상태가 확장기를 열어야한다는 신호 구성 요소로 변경된 후 즉시 다른 액션을 호출하여 감속기 상태를 재설정합니다. 나는 관측 가능한 redux를 사용하고 있기 때문에 신호를 보내기 위해서 서사시에서 시작과 끝을 부를 수 있습니다. 그러나이 방법은 상당히 이상하게 보입니다. 구성 요소에 신호를 보내어 더 나은 작업을 수행 할 수있는 더 좋은 방법이 있습니까? 다음은 위의 코드입니다.반응, 특정 redux 작업을 호출 할 때 모든 확장기를 엽니 다.

+0

당신은 응 당신의 전 인생에서 C++를 썼다? = D – jayphelps

+0

그냥 대학 :) "의사 코드"때문에? – MistyK

+0

'class Derived : Base' 구문과 중괄호 (newline)에 – jayphelps

답변

1

여기에 질문은 추가 상태가 필요없는 경우 구성 요소가 응용 프로그램 관련 이벤트/신호를 관찰하는 방법입니다.

해결 방법에는 응용 프로그램 상태에 forceExpand 신호 (추악함이있는 곳)를 추가하는 작업이 포함됩니다. 해당 신호를 얻기 위해 상태 트리에 연결해야하고 현재 렌더링 된 각 <Expander>에 대해 다시 설정해야합니다.

대신에 redux-observable없이 RxJS를 사용할 수 있습니다. 이 솔루션을 사용하면 을 생성하고 관련 작업을 redux 저장소에 푸시 할 때마다이를 내 보냅니다. 그런 다음 구성 요소에있는 Observable에 가입하고 가입을 취소합니다.

신속하고 더러운 예 :

// in some module 
export const ExpandSignal = new Rx.Subject(); 
export const ExpandSignalActionTypes = [ ... ]; 

// middleware that looks at the redux actions 
const signalMiddleware = store => next => action => { 
    if (ExpandSignalActionTypes.includes(action.type)) 
    ExpandSignal.next(); 

    return next(action); 
}; 

// implement with wrapper, or integrate into existing component 
class ExpandWrapper extends React.Component { 
    state = { expanded: false }; 

    componentDidMount() { 
    this.subscription = ExpandSignal.subscribe(() => this.setState({ expanded: true }); 
    } 

    componentWillUnmount() { 
    this.subscription.unsubscribe(); 
    } 

    render() { 
    return (
     <Expander expanded={this.state.expanded} 
       onExpandedChanged={() => this.setState({ expanded: false })} /> 
    ) 
    } 
} 
+0

나는 그것을 좋아한다, 훨씬 깨끗하다. 그게 어떻게 형편없는 원칙에 부합합니까? 그것은 redux 규칙을 무시하지 않습니까? – MistyK

+0

귀하의 ''상태가 귀하의 redux 상태 (각 ''는 자체 내부 상태를 관리함)와 별개라고 가정 할 때, 나는 그것이 희박 규칙을 어 기지 않는 것이라고 말할 것입니다. –

+0

감사합니다. 내가 redux에 연결 한 유일한 이유는이 알림입니다. – MistyK