Ich versuche, Daten aus der API mit React + Redux zu holen, aber aus irgendeinem Grund können Daten nicht gerendert werden, obwohl ich sehe, dass es in der Konsole kommt (mit Redux-Logger) Es sieht so aus Aus irgendeinem Grund ändert Reducer den Wert von areLoading nicht auf false - und die Daten erreichen die Seite nicht. Aber ich kann uns nicht vorstellen, wo der Fehler ist, alles scheint richtig zu sein.Abgerufene Daten konnten die Komponente nicht erreichen
Komponente:
class Posts extends Component {
componentDidMount() {
this.props.postsFetch();
}
render() {
return (
<div>
{this.props.data.map(function(post, i) {
return (
<div className="tale" key={i}>
<p className="title" key={i}>{post.title}</p>
</div>
);
})
}
</div>
);
}
}
const mapStateToProps = (state) => {
return {
data: state.posts,
gotError: state.postsError,
areLoading: state.postsLoading
};
};
export default connect(mapStateToProps, { postsFetch })(Posts);
Reduzierungen:
const INITIAL_STATE = {
areLoading: false,
gotError: false,
items: []
}
export function postsError(state = INITIAL_STATE, action) {
switch (action.type) {
case "POSTS_REQUEST_FAILURE":
return {
...state,
gotError: true
}
default:
return state;
}
}
export function postsLoading(state = INITIAL_STATE, action) {
switch (action.type) {
case "POSTS_REQUEST_LOADING":
return {
...state,
areLoading: true
}
default:
return state;
}
}
export function posts(state = INITIAL_STATE, action) {
switch (action.type) {
case "POSTS_REQUEST_SUCCESS":
return {
...state,
areLoading: false,
items: action.data
}
default:
return state;
}
}
Wenn ich meine return-Anweisung ändern, und nach dieser Rückkehr action.data zu "action.areLoading = false zurückgeben", alles funktioniert. Aber diese Lösung scheint nicht richtig zu sein.
Aktionen:
export function postsError() {
return {
type: "POSTS_REQUEST_FAILURE",
};
}
export function postsLoading() {
return {
type: "POSTS_REQUEST_LOADING",
url: 'http://jsonplaceholder.typicode.com/posts/',
};
}
export function posts(data) {
return {
type: "POSTS_REQUEST_SUCCESS",
data
};
}
export function postsFetch() {
return function (dispatch) {
dispatch(postsLoading());
}
}
Middleware:
export const apiCallMiddleware = store => next => action => {
const { url, ...rest } = action;
if (!url) return next(action)
next({ type: "POSTS_REQUEST_LOADING" })
axios(url)
.then(response => {
const data = response.data
next({ type: "POSTS_REQUEST_SUCCESS", data })
})
.catch(err => {
next({ ...rest, type: "POSTS_REQUEST_FAILURE" })
})
}
ich für ein Lösung im Forum gesucht, aber keiner von ihnen scheint mir zu helfen. Ich bin auch neu in React + Redux, Entschuldigung für eine neue Frage.
Vielen Dank im Voraus.
Was ist in Ihrer Mähdrescher-Funktion? Funktionieren alle anderen Aktionen und Reduzierungen wie erwartet? –
Warum haben Sie drei Reduzierstücke für eine Ajax-Anfrage? – Shota
Ich hatte versucht, einen Reducer anstelle von drei zu schreiben, und es macht keinen Unterschied. – Duskload