2017-01-26 1 views
2

저는 mapStateToProps 인수가 connect 인 것에 대해 이야기하고 있습니다.mapStateToProps에서 강제로 업데이트하는 방법은 무엇입니까?

내 구성 요소 중 하나에는 기능 배열 인 rules이라는 속성이 있습니다. mapStateToProps에서 나는 그 규칙을 호출하여 현재 상태를 전달합니다. 오류가없는 경우 규칙은 오류 메시지 또는 true을 반환합니다. 최종 구성 요소가 일련의 함수 대신 오류 메시지 배열을 수신하도록 이러한 오류 메시지를 새 소품에 넣습니다.

지금까지이 기능이 훌륭하게 작동했지만 지금은 비동기 규칙에 대한 지원을 추가하려고합니다. 내 계획은 지금 규칙이 오류 문자열 대신 Promise를 반환 할 때마다 오류 메시지 배열에 "Checking ..."과 같은 메시지를 푸시하지만 일단 약속이 완료되면 "새로 고침"해야합니다. 이 배열을 삽입하고 해결 된 메시지를 삽입하십시오.

내가 할 수있는 경우 force an update 그러면 redux는 mapStateToProps을 다시 호출해야합니다. 그러한 경우, 모든 규칙이 재평가 될 것이지만, 신중하지 않으면 나는 새로운 약속을 받게 될 것입니다. 그러나 이러한 규칙을 메모하면 이전과 같은 Promise 인스턴스를 다시 가져올 수 있으며 check ifit's settled 그 값을 대신 내 오류 배열에 넣을 수 있습니다.

이제 문제는 현재 상태와 소품에만 액세스 할 수있는 mapStateToProps 컨텍스트 내에서 구성 요소 인스턴스에 대한 참조를 얻는 방법을 찾는 것입니다.

약속이 해결되면 다시 렌더링 할 수있는 방법이 있습니까?

또는 해결할 때 수행 할 작업이 있다면, 그 작업도 가능합니다.

+0

나는 생각한다. * 이것은'connectAdvanced'로 할 수있다. 이를 통해 상태, 소품 및 파견 기능에 대한 액세스 권한을 한 번에 얻을 수 있으므로 약속이 해결 될 때 새로 고침을 시작할 수있는 충분한 권한을 얻을 수 있습니다. – mpen

답변

2

mapState에서이를 수행 할 수 없습니다. mapState 함수는 완전히 동기식입니다. 비동기 작업을 수행해야하는 경우 mapState 외부에서 트리거하고 상태에 일부 값을 저장 한 다음 결과를 업데이트하여 mapState을 다시 실행하십시오.

+0

'mapStateToProps' 밖에서 어떻게해야할지 모르겠습니다. 이 규칙을 평가하려면 구성 요소의 상태와 소품이 모두 필요합니다. 내 감속기에서 국가를 얻을 수 있지만 그때 나는 소품을 놓치고있어. 내가 파견 한 모든 행동과 함께 모든 소품을 보냈지 만 그 행동을 촉발 한 필드 만 재 검증 할 수 있었기 때문에 도움이되지는 않았지만 다른 필드의 가치에 따라 유효성을 변경할 수있는 조건부 필드가 있습니다. – mpen

+0

당신이 원하는 것을하기 위해 어떤 종류의 미들웨어가 필요합니다. Redux-saga https://github.com/redux-saga/redux-saga 또는 Redux Thunk https://github.com/gaearon/redux-thunk가 인기가 있습니다 – AnilRedshift

+0

@AnilRedshift 그 라이브러리 중 하나가 도움이되지 않는다고 생각합니다. 내가 설명한 문제. 필자는 필요한 곳에서 '파견'에 대한 액세스 권한이 없으므로 파견 된 작업을 처리하는 미들웨어가 도움이되지 않습니다. – mpen

1

상태 기반 구성 요소를 만드는 방법은 어떻습니까? 구성 요소의 상태에서 약속 결과를 유지하면 약속이 해결되면 구성 요소가 자동으로 다시 렌더링됩니다.

import React, {Component} from 'react'; 
import {connect} from 'react-redux; 
import Promise from 'promise'; 

class MyStatefulComponent extends Component { 
    constructor(props) { 
     this.state = { 
      messages: [] // initialize empty, or with the synchronous rules 
     }; 
    } 

    componentWillMount() { 
     const setState = this.setState; 
     const rules = this.props.rules; // rules contains a list of either evaluated rules or promises 
     Promise.all(rules).then(results => { 
      // this is executed once all the promises in rules have resolved 
      // setState will trigger a re-render of this component 
      setState({ 
       messages: [] // construct your array of messages here from the results 
      }); 
     } 
    } 

    render() { 
     // render your list of messages 
     return <ul> 
      {this.state.messages.map(message => <li>{message}</li>)} 
     </ul>; 
    } 
} 

export default connect(
    (state, ownProps) => ({ 
     rules: ownProps.rules.map(rule => rule(state)) 
    }) 
)(MyStatefulComponent); 
+0

나는 그것을 고려하지 않았다! 나는 그 모든 주를 HOC로 일해야한다. 나는 입력을위한 래퍼 (wrapper)를 만들고 있는데, 반복하기에는 너무 많은 상용구가있다.또한, 나는 더 이상 상태 비 저장 기능적 구성 요소를 래핑 할 수 없을 것이다. 하지만 ... 내 계획이 잘 풀리지 않으면 아이디어를 가져 주셔서 고맙습니다. – mpen

관련 문제