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)
}
我不确定这是不是最好的方式,但现在没有错误,一切都很好