使用react-redux實現異步請求


第一步驟:安裝react-redux(前提已經安裝了redux)

npm install react-redux 

建立一個store文件夾,里面放置和store有關的文件

第二步驟:創建store.js

store.js

//react-redux import {createStore} from 'redux' import reducer from './reducer'; const store = createStore(reducer) export default store; 

我們看到store.js中引入了一個reducer.js,所以我們也要創建一個reducer.js,里面暫時內容先寫成如下默認格式:

reducer.js

const defaultState = { tableList:[] } //reducer 可以接受state但是不可以修改state 只有store才能改變 //純函數值得是,制定固定的輸入,就一定會有固定的輸出,而且不會有任何副作用 export default (state = defaultState, action)=> { console.log(state,action); return state; } 

 

第三步驟:用connect建立連接

react中的index.js

import React from 'react'; import ReactDOM from 'react-dom'; import 'antd/dist/antd.css'; import Tablelist from './testTable' import { Provider } from 'react-redux' import * as serviceWorker from './serviceWorker'; const App = ( <Provider store={store}> <Tablelist /> </Provider> ) ReactDOM.render(App, document.getElementById('root')); serviceWorker.unregister(); 

注意:

1.最后的寫法是變量App,而不是組件<App/>,千萬不要寫錯了

2. Provider提供器連接到store,內部的所有組件都能連接到store

其中Tablelist.js包裹着header組件和table組件

import React from 'react' import TestHeader from './testHeader' import TestTable from './testTable' class Tablelist extends React.Component{ render(){ return( <div> <TestHeader /> <TestTable /> </div> ) } } export default Tablelist 

第四步驟:去組件中實現請求

看前須知:

connect能夠將store中的數據和組件連接起來,其中connect接收兩個參數

第一個參數是:mapStateToProps:把store中的數據映射到這個組件變成props,所以如果要取store中的數據就需要通過this.props.參數

第二個參數是:mapDispatchToProps:將store.dispatch方法掛載到props上

督導這里,大家一定不難發現,其實后者是可以改變store中的數據,然后通過第一個方法能夠獲取到store中改變的數據,既然改變數據,大多是需要一些方法,所以mapDispatchToProps中常常返回一個方法

header.js

import React from 'react'; import {DatePicker} from 'antd'; import axios from 'axios'; import { connect } from 'react-redux' const { RangePicker, } = DatePicker; const dateFormat = 'YYYY-MM-DD HH:mm'||undefined; class TestHeader extends React.Component{ render(){ return( <div> <RangePicker onChange={this.props.onPickerChange} //注意:由於方法掛載到了props上,所以通過this.props  showTime={{ format: 'HH:mm' }} format={dateFormat} placeholder={['開始時間','結束時間']} /> </div> ) } } // //將store.dispatch方法掛載到props上  const mapDispatchToProps =(dispatch)=> { return { onPickerChange (date, dateString) { let obj={ beginDate: dateString[0], endDate: dateString[1], } axios .post("safemgmt/api/queryDeviceInfos", { deviceType:"MOBILE", ...obj }, .then(res=>{ if(res.data.code==="0"){ const data = res.data.result.list const action = { type: 'get_params', tableListdata: data } dispatch(action) } }) } } } export default connect(null,mapDispatchToProps)(TestHeader) 

注意:onChange中的寫法一般為{this. onPickerChange}但是由於放在了connect的mapDispatchToProps上,所以變成了this.props.onPickerChange

header請求完數據之后,將table中的數據傳遞給store,reducer.js會接收到新的狀態,所以reducer.js中需要加入處理代碼

const defaultState = { tableList:[] } //reducer 可以接受state但是不可以修改state 只有store才能改變 export default (state = defaultState, action)=> { console.log(state,action); if(action.type === 'get_params'){ const newState = JSON.parse(JSON.stringify(state)) newState.tableList = action.tableListdata return newState //返回給了store  } return state; } 

第五步驟:接收store中改變的狀態

Table.js

import React, { Component } from 'react'; import {Table} from 'antd'; import { connect } from 'react-redux' class TestTable extends Component { render() { const columns=[{ //省略內容........  }]; return ( <div> <Table columns={columns} dataSource={this.props.list} /> </div> ); } } //把store中的數據映射到這個組件變成props const mapStateToProps = (state)=> { console.log(state) return { list: state.tableList } } export default connect(mapStateToProps,null)(TestTable); 

通過connect的mapStateToProps方法將數據映射到這個組件變成props,所以dataSource={this.props.list}

 

推薦一個 測試工具 學習網站 推薦: https://testing-library.com/docs/react-testing-library/intro 

推薦一個 REACT學習網站: https://www.code-boost.com/tags/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM