Reactjs 反应:页面未重定向并收到警告:来自useState()和useReducer()钩子的状态更新不';不支持第二个回调参数

Reactjs 反应:页面未重定向并收到警告:来自useState()和useReducer()钩子的状态更新不';不支持第二个回调参数,reactjs,Reactjs,目标: 我想获得条带收费,发送电子邮件,清除本地存储中的购物车,然后向用户显示一条成功的消息,然后重定向到主页。一切正常,直到最后一步。显示成功消息后,它不会被重定向 错误: const [cartItems,setCartItems] = useState([]) useEffect(()=> { const items = getCart() setCartItems(items) }, []) const showToas

目标: 我想获得条带收费,发送电子邮件,清除本地存储中的购物车,然后向用户显示一条成功的消息,然后重定向到主页。一切正常,直到最后一步。显示成功消息后,它不会被重定向

错误:

const [cartItems,setCartItems] = useState([])

    useEffect(()=> {
        const items = getCart()
        setCartItems(items)
    }, [])


    const showToast = (toastMsg, redirect = false) => {
        setFormData({...formData, toast: true, toastMsg})
        setTimeout(() => setFormData({...formData, toast: false, toastMsg:''},
        // if true passed to 'redirect' argument, redirect home
         ()=> redirect && props.history.push('/')), 
        5000)
    }

const handleSubmitOrder = async () => {
        const amount = calculateAmount(cartItems)
        setFormData({...formData, orderProcessing: true})

        let token
        try {
            //create stripe token
            //create order with strapi (request to backend)
            //set orderProcessing to false set modal to false
            //clear user cart 
            //show success toast 
            let jwtToken = getToken()
            // console.log(jwtToken)
            const response = await props.stripe.createToken()
            token = response.token.id
            // console.log(token)
            const headers = {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer '+ jwtToken
              }
            await axios
            .post(`${apiUrl}/orders`, {
                amount, 
                productItems: cartItems,
                city,
                zipcode, 
                address,
                token
            }, {headers})
            await axios
            .post(`${apiUrl}/email`, {
                    to: confirmEmail,
                    from: 'hi@anniesveganbakery.com',
                    subject: `Order Confirmation from Annie's Vegan Bakery`,
                    text: 'Your order has been processed.',
                    html: '<h1>Expect your order to arrive in 2-3 shipping days.</h1>'
                }
            ,{headers})
            setFormData({...formData, orderProcessing: false, modal: false})
            clearCart()
            showToast('Your order has been successfully submitted', true)
        } catch (error) {
            //set order processing to false, modal to false
            //show error message in toast
            setFormData({...formData, orderProcessing: false, modal: false})
            showToast(error.message)
        }
    }
警告:来自useState()和useReducer()挂钩的状态更新 不支持第二个回调参数。产生副作用 渲染后,使用useffect()在组件体中声明它

系统:

const [cartItems,setCartItems] = useState([])

    useEffect(()=> {
        const items = getCart()
        setCartItems(items)
    }, [])


    const showToast = (toastMsg, redirect = false) => {
        setFormData({...formData, toast: true, toastMsg})
        setTimeout(() => setFormData({...formData, toast: false, toastMsg:''},
        // if true passed to 'redirect' argument, redirect home
         ()=> redirect && props.history.push('/')), 
        5000)
    }

const handleSubmitOrder = async () => {
        const amount = calculateAmount(cartItems)
        setFormData({...formData, orderProcessing: true})

        let token
        try {
            //create stripe token
            //create order with strapi (request to backend)
            //set orderProcessing to false set modal to false
            //clear user cart 
            //show success toast 
            let jwtToken = getToken()
            // console.log(jwtToken)
            const response = await props.stripe.createToken()
            token = response.token.id
            // console.log(token)
            const headers = {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer '+ jwtToken
              }
            await axios
            .post(`${apiUrl}/orders`, {
                amount, 
                productItems: cartItems,
                city,
                zipcode, 
                address,
                token
            }, {headers})
            await axios
            .post(`${apiUrl}/email`, {
                    to: confirmEmail,
                    from: 'hi@anniesveganbakery.com',
                    subject: `Order Confirmation from Annie's Vegan Bakery`,
                    text: 'Your order has been processed.',
                    html: '<h1>Expect your order to arrive in 2-3 shipping days.</h1>'
                }
            ,{headers})
            setFormData({...formData, orderProcessing: false, modal: false})
            clearCart()
            showToast('Your order has been successfully submitted', true)
        } catch (error) {
            //set order processing to false, modal to false
            //show error message in toast
            setFormData({...formData, orderProcessing: false, modal: false})
            showToast(error.message)
        }
    }
  • Node.js版本:12.13.0
  • NPM版本:6.12.0
  • Strapi版本:3.0.0-beta.17.4
  • 数据库:MongoDB atlas cloud
  • 操作系统:LinuxMint 19.2肉桂
  • 前端:React 16.11.0
  • strapi提供程序电子邮件sendgrid“^3.0.0-beta.17.5”
代码:

const [cartItems,setCartItems] = useState([])

    useEffect(()=> {
        const items = getCart()
        setCartItems(items)
    }, [])


    const showToast = (toastMsg, redirect = false) => {
        setFormData({...formData, toast: true, toastMsg})
        setTimeout(() => setFormData({...formData, toast: false, toastMsg:''},
        // if true passed to 'redirect' argument, redirect home
         ()=> redirect && props.history.push('/')), 
        5000)
    }

const handleSubmitOrder = async () => {
        const amount = calculateAmount(cartItems)
        setFormData({...formData, orderProcessing: true})

        let token
        try {
            //create stripe token
            //create order with strapi (request to backend)
            //set orderProcessing to false set modal to false
            //clear user cart 
            //show success toast 
            let jwtToken = getToken()
            // console.log(jwtToken)
            const response = await props.stripe.createToken()
            token = response.token.id
            // console.log(token)
            const headers = {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer '+ jwtToken
              }
            await axios
            .post(`${apiUrl}/orders`, {
                amount, 
                productItems: cartItems,
                city,
                zipcode, 
                address,
                token
            }, {headers})
            await axios
            .post(`${apiUrl}/email`, {
                    to: confirmEmail,
                    from: 'hi@anniesveganbakery.com',
                    subject: `Order Confirmation from Annie's Vegan Bakery`,
                    text: 'Your order has been processed.',
                    html: '<h1>Expect your order to arrive in 2-3 shipping days.</h1>'
                }
            ,{headers})
            setFormData({...formData, orderProcessing: false, modal: false})
            clearCart()
            showToast('Your order has been successfully submitted', true)
        } catch (error) {
            //set order processing to false, modal to false
            //show error message in toast
            setFormData({...formData, orderProcessing: false, modal: false})
            showToast(error.message)
        }
    }
const[cartItems,setCartItems]=useState([])
useffect(()=>{
const items=getCart()
setCartItems(项目)
}, [])
const showToast=(toastMsg,redirect=false)=>{
setFormData({…formData,toast:true,toastMsg})
setTimeout(()=>setFormData({…formData,toast:false,toastMsg:''},
//如果传递给'redirect'参数的是true,则重定向到home
()=>重定向&props.history.push('/'),
5000)
}
常量handleSubmitOrder=async()=>{
常量金额=计算数量(cartItems)
setFormData({…formData,orderProcessing:true})
出租代币
试一试{
//创建条带标记
//使用strapi创建订单(请求后端)
//将orderProcessing设置为false将modal设置为false
//清除用户购物车
//致祝酒辞
让jwtToken=getToken()
//console.log(jwtToken)
const response=await props.stripe.createToken()
令牌=response.token.id
//console.log(令牌)
常量头={
“内容类型”:“应用程序/json”,
“授权”:“持有人”+jwtToken
}
等待axios
.post(`${apirl}/orders`{
数量
productItems:cartItems,
城市
zipcode,
地址:,
代币
},{headers})
等待axios
.post(`${apirl}/email`{
致:确认邮件,
发件人:'hi@anniesveganbakery.com',
主题:`安妮素食面包店的订单确认`,
文本:“您的订单已处理。”,
html:“预计您的订单将在2-3个发货日内送达。”
}
,{headers})
setFormData({…formData,orderProcessing:false,modal:false})
clearCart()
showToast('您的订单已成功提交',对)
}捕获(错误){
//将订单处理设置为false,将模态设置为false
//在toast中显示错误消息
setFormData({…formData,orderProcessing:false,modal:false})
showToast(错误消息)
}
}

问题:是什么导致了这个问题,我如何解决它?

我这样写解决了这个问题

 const showToast = (toastMsg, redirect = false) => {
        setFormData({...formData, toast: true, toastMsg})
        setTimeout(() => setFormData({...formData, toast: false, toastMsg:''}), 5000)
        // if true passed to 'redirect' argument, redirect home
        setTimeout(() => redirect &&  props.history.push('/'), 6000)
    }
我不确定这是不是最好的方式,但现在没有错误,一切都很好