javascript - react router 匹配路由組件后如何在組件中 dispatch action 一次?
問題描述
用到了 react, react-router 4.1.1, redux 3.7.0, react-redux 5.0.5
Route配置為 <Route path='/:id' component={ Datagrid }/>,其中 id 為 path 路徑,Datagrid 為一個展示數據表格的容器組件,主體內容為antd的 Table 組件,其中 columns 和 dataSource 要求能根據 path 切換,我想實現當點擊 /user 時加載 user 的 columns 和 dataSource,當點擊/odm 時加載 odm 的 columns 和 dataSource。
Datagrid 組件如下
import React, { Component } from ’react’import { Table, Button } from ’antd’import ’./index.less’import { fetchColumn } from ’../../actions/column’import { connect } from ’react-redux’import { withRouter } from ’react-router-dom’class Datagrid extends Component { render() { let id = this.props.match.params.id console.log(id) this.props.dispatch(fetchColumn(id)) return ( <p><Table columns={this.props.column}/> </p> ) }}const mapStateToProps = (state) => { return state}export default withRouter(connect(mapStateToProps)(Datagrid))
當點擊 /user path 時確實可以加載 user 的 column,但是dispatch(fetchColumn(id))會無限循環,如果把dispatch(fetchColumn(id))放在componentDidMount中,只會加載一次,當點擊 /odm 時 Datagrid 組件又不會重新渲染了,不知道該怎么搞。
問題解答
回答1:class Datagrid extends Component { //用于第一次掛載時請求 componentDidMount() { let id = this.props.match.params.id console.log(id) this.props.dispatch(fetchColumn(id)) } //當props發生改變時請求 componentWillReceiveProps(nextProps) { let id = this.props.match.params.id console.log(id) if(this.props.match.params.id != nextProps.match.params.id) {this.props.dispatch(fetchColumn(nextProps.match.params.id)) } } render() { return ( <p><Table columns={this.props.column}/> </p> ) }}回答2:
當點擊/odm 時加載 odm 的 columns 和 dataSource。
那就在點擊事件里 dispatch 唄。
說錯了,試試 componentDidUpdate。
相關文章:
1. java - HashSet<int> 為何有錯誤?2. angular.js - angularjs如何傳遞id給另一個視圖 根據id獲取json數據?3. 數據庫無法進入4. docker images顯示的鏡像過多,狗眼被亮瞎了,怎么辦?5. 使用text-shadow可以給圖片加陰影嗎?6. java - StringBuffer轉成String,可以不同過tostring,而是通過+“”的方式轉換嗎?7. mysql - 記得以前在哪里看過一個估算時間的網站8. boot2docker無法啟動9. python - linux怎么在每天的凌晨2點執行一次這個log.py文件10. 請問一下各位老鳥 我一直在學習獨孤九賤 現在是在tp5 今天發現 這個系列視頻沒有實戰
