组件没有重新渲染,调用减速器和道具后没有更新?
原学程将引见组件出有从新衬着,挪用加速器以及讲具后出有革新?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
我正在测验考试从股票API夺取1些股票数据。
我不妨应用正常的反响钩子去夺取它,但是在应用Redux以及Redux Saga去夺取它时,我面对着成绩。
在第1次衬着中,它没有会革新redux保存。
它革新第两个衬着中的复制保存。
但是即便革新了Redux保存区,我的组件也没有会取得革新状况??
有人能协助吗?
这是我的组件:
import React, { useState,useEffect } from 'react'
import { connect } from "react-redux";
import { Link } from 'react-router-dom'
function Dashboard(props) {
useEffect(()=>{
console.log(props)
props.getStockData()
},[])
useEffect(()=>{
props.getStockData()
console.log(props)
},[props.stocks.length])
return (
<React.Fragment>
{props.stocks.length ?
<div>
<h一>hello</h一>
</div>
:<button class=" p⑷ m⑷ spinner"></button>
}
</React.Fragment>
)
}
const mapStateToProps = state => {
return {
stocks: state
};
};
const mapDispachToProps = dispatch => {
return {
getStockData: () => dispatch({ type: "FETCH_STOCKS_ASYNC" }),
};
};
export default connect(mapStateToProps,mapDispachToProps)(Dashboard)
这是我的加速器文件:
import axios from 'axios'
import swal from 'sweetalert'
const initialState = {
stocks:[],
};
const reducer = (state = initialState, action) => {
const newState = { ...state };
switch (action.type) {
case 'FETCH_STOCKS_ASYNC':
console.log('reducer called')
const getLatestPrice = async()=>{
await axios.get(`http://api.marketstack.com/v一/eod/latest?access_key=8c二一三四七ee七c五九0七b五九d三cf0c8七一二e五8七&symbols=TCS.XBOM`)
.then(res=>{
console.log(res.data)
newState.stocks = res.data
})
.catch(err=>{
console.log(err)
})
}
getLatestPrice();
break;
}
return newState;
};
export default reducer;
这是我的Redux Saga文件:
import { delay } from "redux-saga/effects";
import { takeLatest, takeEvery, put } from "redux-saga/effects";
function* fetchStockData() {
yield delay(四000);
yield put({ type: "FETCH_STOCKS_ASYNC" });
}
export function* watchfetchStockData() {
yield takeLatest("FETCH_STOCKS_ASYNC", fetchStockData);
}
这是我的保存文件:
import { createStore,applyMiddleware,compose } from 'redux'
import createSagaMiddleware from 'redux-saga'
import { watchfetchStockData } from './sagas'
import reducers from './reducers'
const sagaMiddleware = createSagaMiddleware()
const store = createStore(
reducers,
compose(
applyMiddleware(sagaMiddleware),
window.devToolsExtension && window.devToolsExtension()
),
)
console.log(store.getState())
// only run those sagas whose actions require continuous calling.
//sagaMiddleware.run(watchfetchStockData);
export default store;
这是我的索引文件,它将供给法式衔接到一切组件:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import './assets/main.css'
import App from './App';
import { Provider } from 'react-redux'
import { BrowserRouter as Router } from 'react-router-dom'
import store from './store'
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<Router>
<App />
</Router>
</Provider>
</React.StrictMode>,
document.getElementById('root')
);
serviceWorker.unregister();
推举谜底
您误会了这些部门在这里应当怎样组开在一路。我激烈修议您浏览redux best practices,懂得更多闭于加速机做甚么以及没有做甚么的常识。Redux Reducer不该履行所有操纵。它仅夺取以后状况,并依据操纵对于象中的数据前往下1个状况。
荣幸的是,您曾经在应用redux-saga,它旨在处置API挪用等反作用。提与须要在您的佐贺中履行,而没有是在加速器中履行。
API挪用平日触及调剂3个操纵:开动、胜利以及掉败。从您的组件中,您只需收送";FETCH_STOCKS_START&Quot;操纵。Saga";经由过程takeLatest
夺取此操纵,并应用它去履行具备call
后果的FETCH。当夺取完成时,SAGA应用put
分配二个成果操纵之1。它收送戴有包括股票数组的属性payload
的";FETCH_STOCKS_SUCCESS&Quot;典型,或者戴有包括毛病的属性error
的&Quot;FETCH_STOCKS_ERROR&Quot;典型。
function* fetchStockData() {
yield delay(四000);
try {
const res = yield call( axios.get, `http://api.marketstack.com/v一/eod/latest?access_key=8c二一三四七ee七c五九0七b五九d三cf0c8七一二e五8七&symbols=TCS.XBOM`);
yield put({ type: "FETCH_STOCKS_SUCCESS", payload: res.data });
}
catch (error) {
yield put({ type: "FETCH_STOCKS_ERROR", error });
}
}
function* watchfetchStockData() {
yield takeLatest("FETCH_STOCKS_START", fetchStockData);
}
相干传说文档链交:Error Handling以及Dispatching Actions
我曾经向状况添减了isLoading
属性,当true
时,您不妨选择该属性以显示分歧的UI。我们将应用一切3个操纵革新此属性。
const initialState = {
stocks: [],
isLoading: false
};
您的削减器仅用于依据这些操纵革新状况中的原初数据。
const reducer = (state = initialState, action) => {
switch (action.type) {
case "FETCH_STOCKS_START":
return {
...state,
isLoading: true
};
case "FETCH_STOCKS_ERROR":
console.error(action.error); // only temporary since you aren't doing anything else with it
return {
...state,
isLoading: false
};
case "FETCH_STOCKS_SUCCESS":
return {
...state,
stocks: action.payload,
isLoading: false
};
default:
return state;
}
};
佳了闭于组件出有从新衬着,挪用加速器以及讲具后出有革新?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。