Я понимаю, что проблема довольно тривиальна, но я не могу с ней справиться, мне нужна ваша помощь.
Я перепробовал все решения в подобных вопросах, но у меня это не сработало
Суть в том, что когда я монтирую компонент, я запускаю fetch и получаю список статей из моего API, но это меня не устраивает, так как я не сохраняю их в локальном состоянии.
Кроме того, мои ужасные знания React, у меня есть еще 2 проблемы: 1) Когда я перемещаюсь по страницам, когда я возвращаюсь на страницу статей, количество результатов дублируется в арифметической последовательности, насколько я понимаюЭто проблема, что я держу статьи в подпорках, но мне нужно сохранить его в локальном состоянии.2) Отсюда истекает моя вторая проблема.Я попробовал все, но я не мог сделать props.articles -> state.articles, чтобы применить this.state.articles.map в будущем
// actions
import {FETCH_ALL_ARTICLES} from "../constants";
export const fetchAllArticles = () => {
return (dispatch) => {
let headers = {"Content-Type": "application/json"};
return fetch("/api/articles/", {headers, })
.then(res => {
if (res.status < 500) {
return res.json().then(data => {
return {status: res.status, data};
})
} else {
console.log("Server Error!");
throw res;
}
})
.then(res => {
if (res.status === 200) {
return dispatch({type: FETCH_ALL_ARTICLES, articles: res.data});
}
})
}
};
// компонент
import React, { Component } from 'react';
import {connect} from 'react-redux';
import {Link} from 'react-router-dom';
import {articles} from "../actions";
class Home extends Component {
constructor(props) {
super(props);
this.state = {
articles: []
}
console.log(this.props.articles)
};
componentDidMount() {
this.props.fetchAllArticles()
};
render() {
return (
<div>
<Link to='/notes'>Notes</Link>
<h2>All articles</h2>
<hr />
<table>
<tbody>
{this.state.articles.map((article, id) => (
<tr key={`article_${id}`}>
<td>{article.headline}</td>
<td>{article.description}</td>
<td>{article.created}</td>
<td>{article.author.username}</td>
<td>{article.image}</td>
</tr>
))}
</tbody>
</table>
</div>
)
}
}
const mapStateToProps = state => {
return {
articles: state.articles,
}
};
const mapDispatchToProps = dispatch => {
return {
fetchAllArticles: () => {
dispatch(articles.fetchAllArticles())
}
}
};
export default connect(mapStateToProps, mapDispatchToProps)(Home);
// редуктор
import {FETCH_ALL_ARTICLES} from "../constants";
const initialState = [];
export default function articles(state=initialState, action) {
switch (action.type) {
case FETCH_ALL_ARTICLES:
return [...state, ...action.articles];
default:
return state;
}
}