#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