Как зависимости react redux работают с redux

#reactjs #redux #react-redux #redux-form #reducers

#reactjs #redux #react-redux #redux-форма #редукторы

Вопрос:

Я написал код для управления профилем пользователя с помощью JWT, я использовал useState для управления входными данными формы и работал с redux для управления данными. Входные данные не обновляются данными, которые мы получаем от api / action

 import React, { useEffect, useState } from 'react'
import {useDispatch, useSelector} from 'react-redux'
import {getUser , updateUser} from '../actions/userActions'
import '../css/profile.css'
import {listMyOrders} from '../actions/orderActions'
import { Link } from 'react-router-dom'

const Profile = ({history}) => {

    const dispatch = useDispatch();
    const [name , setName] = useState('');
    const [email , setEmail] = useState('');
    const [password , setPassword] = useState('');
    const [confirmPassword , setConfirmPassword] = useState('');

    const userLogin = useSelector((state) => state.userLogin);

    
    const userProfile = useSelector((state) => state.userProfile);
    const {userData , loading , error} = userProfile;

    const myOrders = useSelector(state => state.orderListMy);
    const {orders , loading:loadingOrders} = myOrders;

    useEffect(
        async () => {
            if (!userLogin.userData) {
                history.push('/login')
            } else {
                if (!userData || !userData.name) {
                    dispatch(getUser());
                    dispatch(listMyOrders());
                }
                if(!myOrders.order){
                    dispatch(listMyOrders());
                }
                else {
                    setName(userData.name);
                    setEmail(userData.email);
                }
            }
            }
        , [dispatch, history , userData , userLogin.userData]);

        const handleUpdate = () => {
            if(password == confirmPassword) {
                dispatch(updateUser( userData._id , loading , name , email , password));
            }
        }


    return (
        <section id="profile">
            <div className="inside">
                <div className="user-profile">
                <p className="title">User Profile</p>
                <div className="msg-container">
                </div>
                <div className="name-container">
                    <label className="name-label">Name</label>
                    <input type="name" onLoad={ (e) =>
                        setTimeout(console.log('hello') , 1000)
                    } onChange={(e) => setName(e.target.value)} value={name} placeholder="Your Name" htmlFor="name" />
                </div>
                <div className="email-container">
                    <label className="email-label">Email Address</label>
                    <input type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="email address" htmlFor="email" />
                </div>
                <div className="password-container">
                    <label className="password-label">Password</label>
                    <input type="password" placeholder="Password" htmlFor="password" />
                </div>
                <div className="password-container">
                    <label className="password-label">Confirm Password</label>
                    <input type="password" placeholder="Confirm Password" htmlFor="password" />
                </div>
                <button onClick={handleUpdate} className="submit">Update</button>
                </div>
                <div className="my-orders">
                <div className="title">My Orders</div>
                    <table>
                    <thead>
                        <tr>
                        <td>ID</td>
                        <td>DATE</td>
                        <td>TOTAL</td>
                        <td>PAID</td>
                        <td>DELIVERED</td>
                        <td />
                        </tr>
                    </thead>
                    <tbody>
                        {!loadingOrders amp;amp; orders.map(order => (
                        <tr key={order._id}>
                        <td>{order._id}</td>
                        <td>{order.createdAt.substring(0, 10)}</td>
                        <td>{order.totalPrice}</td>
                        <td>{order.isPaid ? (
                      order.paidAt.substring(0, 10)
                    ) : (
                      <i className='fas fa-times' style={{ color: 'red' }}></i>
                    )}</td>
                        <td>{order.isDelivered ? (
                      order.deliveredAt.substring(0, 10)
                    ) : (
                      <i className='fas fa-times' style={{ color: 'red' }}></i>
                    )}</td>
                        <td><Link to={`/order/${order._id}`}><button className="details">Details</button></Link></td>
                        </tr>
                    ))}
                    </tbody>
                    </table>
                </div>
            </div>
        </section>

    )
}

export default Profile 

вот код для редукторов и действий, которые я написал

 //reducer
//state - userProfile
export const userGetProfileReducer = (state = {userData : {}} , action) => {
    switch(action.type) {
        case USER_GET_REQUEST :
            return { loading : true , state};
        case USER_GET_SUCCESS :
            return ({ loading : false , userData : action.payload });
        case USER_GET_ERROR : 
            return ({ loading : false , error : action.payload });
        default : 
            return state;
    }
} 
 //action - getUser
export const getUser = () => async(dispatch , getState) => {

    dispatch({type : USER_GET_REQUEST , loading : true })

    const headers = {headers : {
        'Content-Type' : 'application/json',
        'AUTHORIZATION' : `Bearer ${getState().userLogin.userData.token}`
    }}
    

    try {
        const {data} = await axios.get('http://localhost:5000/api/users/profile', headers);
        dispatch({type : USER_GET_SUCCESS , payload : data , loading : false});

    } catch (error) {
        console.log(error);
        dispatch({type : USER_GET_ERROR , loading : false , payload: error.response amp;amp; error.response.data.message
          ? error.response.data.message
          : error.message})
    }
} 

Функциональность Note — Orders работает отлично. Поля ввода не обновляются данными ответа. Я уверен, что я ошибся с зависимостями useEffect. Было бы хорошо, если бы кто-нибудь мог мне помочь……

Комментарии:

1. Подключался ли к хранилищу redux? react-redux.js.org/api/connect

2. Что говорят инструменты redux devtools? Какие действия отправляются, какие данные у них есть и как они изменяют состояние? Затем вы можете добавить в свой вопрос некоторую соответствующую информацию, например: следующее действие отправлено и состояние изменено

3. Данные вызываются и успешно сохраняются в редукторе хранилища. Я считаю, что все в порядке, кроме начального состояния редуктора и зависимостей от крючка useEffect