2017-04-25 87 views
2

我有一個動態的屬性列表,我試圖用來爲列表中的每個對象實例化一個React組件。render()中的connect()?

這裏是我的mapStateToProps()mapDispatchToProps()的簡化版本:

export function mapStateToProps(id) { 
    return function(state) { 
    return state.widgets.find((widget) => id === widget.id); 
    }; 
} 

export function mapDispatchToProps(id) { 
    return function (dispatch) { 
    return { 
     fetchData: (path, props) => dispatch(fetchData(id, path, props)), 
    }; 
    }; 
}; 

然後在父組件:

render() { 

    const widgets = this.props.widgets.map((widget) => { 
    return connect(
     mapStateToProps(id), 
     mapDispatchToProps(id), 
    )(Widget); 
    }); 

    return <div>{ widgets }</div>; 
} 

它不拋出任何異常,但它不叫mapStateToProps()mapDispatchToProps()

我到目前爲止唯一的猜測是connect()需要早些時候調用,但我不知道如何使用動態列表道具做到這一點。任何人有任何想法如何使這項工作?

+1

你想在這裏實現什麼?你爲什麼不把通過'props.widgets'獲得的道具傳遞給一堆'Widget'組件? .e.g'return

{this.props.widgets.map(w =>)}
' – thedude

+0

小部件組件設置爲[容器組件](http://redux.js.org/docs/basics/UsageWithReact.html),因爲它們派發操作並觸發狀態更新。我可以看到你的建議將如何取代'mapStateToProps',但它對於'mapDispatchToProps'如何工作? – erock

+0

我同意@thedude,你可以將'fetchData'綁定到父組件,並將該函數作爲屬性傳遞給每個組件'',完成!不需要在'render'方法內使用連接。 – Crysfel

回答

1

mapStateToPropsmapDispatchToProps都有第二個參數ownProps。您可以抓取這些函數中傳遞的道具,並導出連接的Widget,就像您使用其他任何容器一樣。

// WidgetContainer.js 

function mapStateToProps(state, ownProps) { 
    return state.widgets.find((widget) => ownProps.id === widget.id); 
} 

function mapDispatchToProps(dispatch, ownProps) { 
    return { 
    fetchData: (path, props) => dispatch(fetchData(ownProps.id, path, props)), 
    }; 
} 

export default connect(mapStateToProps, mapDispatchToProps)(Widget); 

然後在循環做@thedude是在暗示:

return <div>{this.props.widgets.map(w => <Widget id={w.id} />)}</div> 

文檔:https://github.com/reactjs/react-redux/blob/master/docs/api.md

1

,請不要使用連接渲染方法內。相反,使用道具將所需的任何東西發送給孩子們。

@connect(state => ({ 
    widgets: state.yourReducer.widgets 
}), { 
    fetchData: yourFetchActionCreator, // <-- bind your action creator here 
}) 
class ParentComponent extends PureComponent { 

    render() { 
    return (
     <div> 
     { 
     this.props.widgets.map(widget => 
      <Widget {...widget} fetchData={this.props.fetchData} />) 
     } 
     </div> 
    ); 
    } 
} 

裏面Widget你將有ID和一切的每個widget對象內。

祝你好運!

+0

感謝您的回覆。我理解您的解決方案,但我很好奇 - 爲什麼不連接工作渲染的內部? – erock