useEffect 对象依赖无限循环 - ReactJS

useEffect Object dependency infinite loop - ReactJS

我有一个 State in Context with Object。我是 运行 useEffect 中的一个 async 函数,并将我的对象状态作为 dependency.

传递

I passed the state object as dependency because i want to re-render the component when values of settings object changes.

但它会导致无限循环。

更新:
让我更清楚我的问题。
在我的 useEffect 中,我正在调用我的异步函数 addTextItem(),它调用函数 finalPrice 并更新状态,但这样会导致无限循环。
另一方面,如果我直接在 useEffect 中调用 finalPrice 而不是调用 addTextItem 那么就没有无限循环但它也在更新状态,对吧?那怎么会这样。 &我需要一个解决方案,因为我已经尝试了所有方法但现在完全卡住了。

代码如下:

export default function CustomizerState(props) {
    const initialText = "Hello"
    const initialSize = {
        x: REACT_APP_SIZE_X,
        y: REACT_APP_SIZE_Y
    }
    const initialTextItem = {
        id: generateID(),
        text: "Hello",
        font: fonts[0].value,
        size: initialSize,
        color: colors[0],
        backplate: "cut-sharp",
        uvPrint: false,
        quantity: 1,
        neonPrice: 0,
        backplatePrice: 0,
        neonPower: 0,
        totalPrice: 0
    }
    const [settings, setSettings] = useState({
        textItems: [],
        libraryItems: [],
        ownDesigns: [],
        accessories: [
            // My Objects here
        ],
        finalPrice: 0
    })

    const addTextItem = async () => {
        const pathLength = await textToPath(initialText, initialSize.x)
        const { backplatePrice, neonPrice, neonPower, totalPrice } = calculateSvgPrice(pathLength)
        const id = generateID()

        const newItems = [
            ...settings.textItems,
            {...initialTextItem, id, backplatePrice, neonPrice, neonPower, totalPrice}
        ]
        
        finalPrice("textItems", newItems)
    }

    const finalPrice = (itemType = null, items = null) => {
        const textItemsPrice = getTotalPrice()
        const libraryItemsPrice = getTotalPrice("libraryItems")
        const accessoriesPrice = getTotalPrice("accessories", "unitPrice")

        const finalPrice = textItemsPrice + libraryItemsPrice + parseInt(accessoriesPrice)

        if (itemType === null) {
            setSettings((prevState) => (
                {...prevState, finalPrice}
            ))
            return false
        }

        setSettings((prevState) => (
            {...prevState, [itemType]: items, finalPrice}
        ))
    }

    useEffect(() => {
        // It will add first initial form item
        addTextItem()
    }, [JSON.stringify(settings)])

    return (
        <CustomizerContext.Provider value={{settings, addTextItem}}>
            {props.children}
        </CustomizerContext.Provider>
    )
}


我有 google 并尝试了解决方案,但没有任何效果。有人可以帮我解决这个问题吗?我卡住了....

勾选useEffect hook documentation。 第二个参数数组传入的数组为依赖数组:

useEffect(() => {
    //hook code   
}, []);

依赖数组将使钩子代码在每次数组的任何变量发生变化时执行。在您的情况下,您正在更改调用本身产生无限循环的依赖项 settings

我忘记了当 re-rendering 发生时,它也会 运行s useEffect 并且它会导致 setState 一次又一次。
我设法通过创建一个名为 initialItemCount 且初始值为 0 的状态来解决此问题。我正在检查该状态值是否为 0 然后 运行 addTextItem 这将添加我的初始表单项目并更新最终价格,但如果值为 1 那么只有 运行 finalPrice 函数。

const [initialItemCount, setInitialItemCount] = useState(0)
useEffect(() => {
    if (initialItemCount === 0) {
        addTextItem()
        setInitialItemCount(1)
    }
    
    if (initialItemCount === 1) {
        finalPrice()
    }
}, [JSON.stringify(settings)])

最后,内心平静。