Задать вопрос
@nikitapremium

SetUsers в ComponentDidMount дважды сетает одни и те же данные. Как это можно исправить?

Сразу извиняюсь за плохо сформулированный вопрос, не знаю, как его правильно построить.
Прилагаю код контейнерной компоненты, редьюсера и презентационной компоненты.
Users.jsx

import React from "react";
import avatar from "../../assets/img/avatar.png";
import styles from "./users.module.css";
import axios from "axios";

class Users extends React.Component{
    componentDidMount() {
        axios.get('https://social-network.samuraijs.com/api/1.0/users')
            .then(response => this.props.setUsers(response.data.items))
    }

    render() {
        return (
            <div className={styles.users}>
                {
                    this.props.users.map(user =>
                        <div className={styles.inner}>
                            <div className={styles.user}>
                                <img src={user.photos.small ? user.photos.small : avatar} alt="avatar" width={60} height={60}/>
                                {
                                    user.followed ? 
                                        <button className={styles.following} onClick={() => this.props.unfollow(user.id)}>Отписаться</button> : 
                                        <button className={styles.following} onClick={() => this.props.follow(user.id)}>Подписаться</button>
                                }
                            </div>
    
                            <div className={styles.info}>
                                <div className={styles.about}>
                                    <h3 className={styles.name}>
                                        {user.name}
                                    </h3>
                                    <p className={styles.status}>
                                        {user.status}
                                    </p>
                                </div>
    
                                <div className={styles.location}>
                                    <p className={styles.city}>
                                        Vladivostok
                                    </p>
                                    <p className={styles.country}>
                                        Russia
                                    </p>
                                </div>
                            </div>
                        </div>
                    )
                }
            </div>
        )
    }
}

export default Users;


usersReducer.js

const FOLLOW = 'FOLLOW';
const UNFOLLOW = 'UNFOLLOW';
const SET_USERS = 'SET_USERS';

const initialState = {
    users: []
}

const usersReducer = (state = initialState, action) => {
    switch (action.type){
        case FOLLOW: {
            return {
                ...state,
                users: state.users.map(user => {
                    if (user.id === action.userId){
                        return {...user, followed: true};
                    }
                    return user;
                })
            }
        }

        case UNFOLLOW: {
            return {
                ...state,
                users: state.users.map(user => {
                    if (user.id === action.userId){
                        return {...user, followed: false};
                    }
                    return user;
                })
            }
        }

        case SET_USERS: {
            return {
                ...state,
                users: [...state.users, ...action.users]
            }
        }

        default:
            return state;
    }
}

export const followCreator = (userId) => ({type: FOLLOW, userId});
export const unfollowCreator = (userId) => ({type: UNFOLLOW, userId});
export const setUsersCreator = (users) => ({type: SET_USERS, users});

export default usersReducer;


UsersContainer.js

import { connect } from "react-redux";
import { followCreator, setUsersCreator, unfollowCreator } from "../../redux/usersReducer";
import Users from "./Users";

const mapStateToProps = (state) => {
    return {
        users: state.USERS_PAGE.users
    }
}

const mapDispatchToProps = (dispatch) => {
    return {
        follow: (userId) => {
            dispatch(followCreator(userId));
        },
        unfollow: (userId) => {
            dispatch(unfollowCreator(userId));
        },
        setUsers: (users) => {
            dispatch(setUsersCreator(users));
        }
    }
}

const UsersContainer = connect(mapStateToProps, mapDispatchToProps)(Users);

export default UsersContainer;

  • Вопрос задан
  • 91 просмотр
Подписаться 1 Средний 11 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Merion Academy
    Frontend-разработка на React
    4 месяца
    Далее
  • ProductStar
    React: отточите навыки интерфейсной разработки
    6 недель
    Далее
Решения вопроса 1
Seasle
@Seasle Куратор тега React
При использовании <React.StrictMode> метод жизненного цикла ComponentDidMount отрабатывает дважды. Документация.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽