2017-10-12 96 views
0

我有一个名为PartyDetails的组件,它需要通过ajax调用获取数据。我想在ajax请求正在进行时显示Loading组件。有没有更好的方法来处理这个redux重构分支用例?

问题是,为了确定数据是否加载,我需要访问商店。这就是我的增强看起来像:

const enhance = compose(
    propSetter, 
    lifecycleEnhancer, 
    loading, 
) 

export default enhance(PartyDetails) 

其中propSetter是:

const propSetter = connect((state) => { 
    const { party } = state 
    const { dataLoaded } = party 
    // for some reason state does not contain match, and I'm resorting to routing 
    const { routing: {location: { pathname }}} = state 
    const involvedPartyId = pathname.substring(pathname.lastIndexOf('/') + 1) 
    return { dataLoaded, involvedPartyId } 
}, {loadParty}) 

lifecycleEnhancer是:

const lifecycleEnhancer = lifecycle({ 
    componentDidMount() { 
     this.props.loadParty(this.props.involvedPartyId) 
    } 
}) 

loading的(请注意,在这种情况下,dataLoaded来自已在propSetter中完成的前connect):

const loading = branch(
    ({dataLoaded}) => dataLoaded, 
    renderComponent(connect(mapStateToProps, mapDispatchToProps)(PartyDetails)), 
    renderComponent(Loading) 
) 

所以基本上,如果数据已经被提取,我使用第二个连接来获取PartyDetails的相关道具。

我刚刚开始学习recompose几天前,我找不到一个适合我的用例的例子。以上是我在阅读完文档后提出的,以及其他文章中的一些例子。

我正在做一个很好的处理方法?这是否可以以更好的方式完成,也许不需要拨打电话?

回答

0

你可以写映射状态和调度道具所有的逻辑在一个连接:

export default compose(
    connect(
    state => { 
     const { party } = state; 
     const { dataLoaded } = party; 
     const { routing: { location: { pathname } } } = state; 
     const involvedPartyId = pathname.substring(pathname.lastIndexOf("/") + 1); 

     // also put here your `mapStateToProps` code 

     return { dataLoaded, involvedPartyId }; 
    }, 
    { 
     loadParty 
     // the same here, append `mapDispatchToProps` logic 
    } 
), 
    lifecycle({ 
    componentDidMount() { 
     this.props.loadParty(this.props.involvedPartyId); 
    } 
    }), 
    branch(
    ({ dataLoaded }) => dataLoaded, 
    renderComponent(PartyDetails), 
    renderComponent(Loading) 
) 
    // as `branch` is returning HOC, we need to provide empty component to it in 
    // order to render whole component 
)(createSink()); 
+0

我没有在一个连接一切的原因是,数据不会在状态,当第一存在连接被调用。你的例子中有什么我想念的吗? – Geo

+0

@Geo它实际上不是问题。在我的例子中,首先渲染数据变量将是未定义的(因为它当时不存在),我们将呈现'Loading'组件,其中不需要该数据。在第二次渲染时,当从服务器获取数据时,我们将渲染“PartyDetails”并传递派生数据 – 1ven

相关问题