#reactjs #react-context
#reactjs #реагировать-контекст
Вопрос:
Я пытаюсь создать функциональные возможности для пользователей и подписчиков, используя контекст реакции. Если зарегистрированный пользователь просматривает свой собственный профиль, он может увидеть кнопку редактирования / удаления. Когда он нажимает на профиль других, нажмите кнопку «Подписаться» / «Отменить подписку». Проблема в том, что когда я нажимаю на кнопку «Следовать», кнопка «Следовать» заменяется кнопками «Редактировать» и «удалить» вместо кнопки «Отменить подписку», однако, если я обновлю страницу на этом этапе, она правильно отобразит отмену подписки.
контекстный файл:
const initialState = {
loggedInUser: null,
};
// Add following / follower
const follow = async (userId, followId) => {
try {
const res = await axios.put(
"/api/users/follow",
{ userId, followId },
{
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${localStorage.getItem("token")}`,
},
}
);
dispatch({ type: "FOLLOW", payload: res.data });
} catch (err) {
console.log(err);
}
};
// Remove following / follower
const unfollow = async (userId, unfollowId) => {
try {
const res = await axios.put(
"/api/users/unfollow",
{ userId, unfollowId },
{
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${localStorage.getItem("token")}`,
},
}
);
dispatch({ type: "UNFOLLOW", payload: res.data });
} catch (err) {
console.log(err);
}
};
редуктор:
case "FOLLOW":
return {
...state,
loggedInUser: action.payload,
};
case "UNFOLLOW":
return {
...state,
loggedInUser: action.payload,
Профиль
// user = profile currently being viewed and it is working fine
{loggedInUser amp;amp; loggedInUser._id === user._id ? (
<>
<Link to={`/user/edit/${user._id}`} className={classes.link}>
<IconButton color="primary">
<Edit />
</IconButton>
</Link>
<IconButton onClick={() => handleDelete()}>
<Delete color="error" />
</IconButton>
</>
) : loggedInUser.following.includes(user._id) ? (
<Button onClick={() => unfollow(loggedInUser._id, user._id)}>
UNFOLLOW
</Button>
) : (
<Button onClick={() => follow(loggedInUser._id, user._id)}>
FOLLOW
</Button>
)}
Что я здесь делаю не так?
РЕДАКТИРОВАТЬ заменено
loggedInUser.following.includes(user._id) ? (
<Button onClick={() => unfollow(loggedInUser._id, user._id)}>
с
user.followers.some(follower => follower._id === loggedInUser._id) ? (
<Button onClick={() => unfollow(loggedInUser._id, user._id)}>
UNFOLLOW
</Button>
и теперь, когда я нажимаю на кнопки «Подписаться» / «Отменить подписку», «Редактировать» и «удалить» не отображаются, однако мне все равно нужно обновить страницу, чтобы увидеть обновленный пользовательский интерфейс.
Комментарии:
1. Я вижу a
<>
как блок элементов, о<Link>
теге. Это специально?2. как ваш
res.data
выглядит, когда он возвращается из вызова api. Я чувствую, что данные из api управляют выбором кнопок3. @DJBurb res.data — это объект, содержащий сведения из модели пользователя, такие как массив подписчиков по электронной почте с идентификатором имени и массив подписчиков, <> является оболочкой для кнопки редактирования и удаления
4. Я почти уверен, что это потому, что ваши данные для loggedInUser или user перепутаны. Почему бы вам не поместить какой-нибудь журнал консоли, чтобы проверить, каковы эти значения после щелчка / обновления.
5. @hackape вы правы. Проблема была в редукторе. Спасибо