【问题标题】:How to update state in Context using Hooks in MERN Stack Application如何在 MERN 堆栈应用程序中使用 Hooks 更新上下文中的状态
【发布时间】:2021-04-29 19:55:48
【问题描述】:

我正在尝试找到一种方法来更新我的“用户”状态,但我已经被困在这里 3 天了,我需要一些帮助。

这是我的用户上下文:

import React, {useEffect, useState} from 'react';

export const UserContext = React.createContext({})
const UserProvider = UserContext.Provider;

const UserContextProvider = (props) => {
    const [user, setUser] = useState({})
    
    useEffect(() => {
        fetch(`${API}/auth/user`, {
            method: 'GET',
            withCredentials: true,
            credentials: 'include'
        })
        .then (response => response.json())
        .then (response => {
            setUser(response.user)
        })
        .catch (error => {
            console.error (error);
        });
    }, [setUser])

    console.log(user)

    return (
        <UserProvider value={{user, setUser}}>
            {props.children}
        </UserProvider>
    )
}   

export default UserContextProvider;

这是我试图更新用户的地方。在我的情况下,我试图在 user.cart 数组中推送一个对象,因为后端的一切都很好,但在前端,状态没有更新:

  • 首先我使用的是 UserContext:

    常量产品 = () => {

           const {user, setUser} = useContext(UserContext) ...
    

然后我在这里尝试更新用户状态,但是当我单击按钮时它让我退出:

<button className="addTo--Cart--Button--Container">
      <FaShoppingCart onClick={() => {addToCart(user._id, product); setUser(oldState => oldState.cart.push(product))}}/>
</button>

在我退出后,UserContextProvider 函数中的console.log(user) 仅记录 user.cart 更新的长度。

还有一个:

如何从上下文中删除项目:

这是我的删除功能:

const removeFromContextCart = (id) => {
        console.log(id)
        const updatedCart = user.cart.filter((item) => item.id !== id);
        setUser(oldState => ({
            ...oldState,
            cart: [
                ...oldState.cart,
                updatedCart
            ]
        }))
    }

还有我的按钮:

<button className="remove--Button" onClick={() => {removeFromCart(user._id, product); setUser(removeFromContextCart(product._id))}}> REMOVE</button>

【问题讨论】:

  • setUser(oldState =&gt; oldState.cart.push(product)),这会改变原始数组,所以 react 不知道状态是否改变。尝试返回一个新的对象状态
  • 我理解这种突变,但是如何通过返回新的对象状态来做到这一点?
  • 这样的? setUser(oldState =&gt; { const newCart = [...oldState.cart, product] return {...oldState, cart: newCart} })

标签: node.js reactjs mongodb express mern


【解决方案1】:

尝试以这种方式更新用户状态

setUser(oldState => ({
  ...oldState,
  cart: [
    ...oldState.cart,
    product
  ]
}))

【讨论】:

  • 谢谢你!你救了我的命。我尝试了 3 天... :D
  • 你能检查我更新的问题吗?如何从购物车中删除商品?我的功能由于某种原因无法正常工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2020-02-13
  • 2021-02-12
相关资源
最近更新 更多