我想做的是,分派2个动作fetchBrand()
和fetchDistance()
。我有两个不同的reducer和不同的动作创建者,他们正在调用不同的API。
但是这里的问题是,根据中的顺序,它只能给出一个动作的结果useEffect()
。它在控制台中显示了两次,但是结果来自相同的API。
如果更改顺序,则它将两次为其他API控制台结果。这意味着我的API调用都成功了,但是一次只调用了1个API。
可能有一些功能,但我不知道。我该如何解决?
import { Form, Input, Button, Select } from 'antd'
import React from 'react'
import { useSelector, useDispatch } from 'react-redux'
import { fetchDistance } from '../redux/distanceAction'
import { fetchBrand } from '../redux/brandAction'
const { Option } = Select
const layout = {
labelCol: {
span: 8,
},
wrapperCol: {
span: 10,
},
}
const tailLayout = {
wrapperCol: {
offset: 10,
span: 10,
},
}
const UserForm = (props) => {
const distanceList = useSelector((state) => state.distance)
const brandList = useSelector((state) => state.brand)
const dispatchDistance = useDispatch()
const dispatchBrand = useDispatch()
React.useEffect(() => {
dispatchBrand(fetchBrand()) //dispatching action one
dispatchDistance(fetchDistance()) //dispatching action 2
}, [])
const [form] = Form.useForm()
const onFinish = (values) => {
console.log(values)
props.onSubmitForm(values)
form.resetFields()
console.log(brandList.brand)
console.log(distanceList.distance)
// dispatch(fetchBrand);
// dispatch(fetchDistance);
}
return (
<div className="form-layout">
<h1> hello{distanceList.distance + brandList.brand}</h1>
<Form {...layout} form={form} name="user-form" onFinish={onFinish}>
<Form.Item name="name" label="Hotel Name" rules={[{ required: true }]}>
<Input />
</Form.Item>
<Form.Item
name="location"
label="Hotel Location"
rules={[{ required: true }]}
>
<Input />
</Form.Item>
<Form.Item name="distance" label="Distance" rules={[{ required: true }]}>
<Select placeholder="Please select Distance" allowClear>
<Option value="0km">0Km</Option>
<Option value="10km">10Km</Option>
<Option value="30">30km</Option>
</Select>
</Form.Item>
<Form.Item name="brand" label="Brands" rules={[{ required: true }]}>
<Select placeholder="Please select Brand" allowClear>
<Option value="flip">Flipkart</Option>
<Option value="amazon">Amazon</Option>
<Option value="paytm">Paytm</Option>
</Select>
</Form.Item>
<Form.Item {...tailLayout}>
<Button type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
</div>
)
}
export default UserForm
我的第一个观察结果是,您不需要调用useDispatch()
两次,也不需要具有单独的dispatch
命名变量。dispatch
整个应用程序只有一个功能,因为整个应用程序只有一个Redux存储。因此,您只需要const dispatch = useDispatch()
。
其次,实际逻辑看起来不错,无论有没有固定名称,它都可以正常工作dispatch
。因此,我不清楚这里的实际问题是什么,我建议仔细检查这些获取函数的实现。
更新
嗯,我想我看到了问题。
无论fetchBrand
与fetchDistance
被派遣相同的API调用成功后,动作类型:dispatch(fetchsuccess(someData))
。两个减速器都在监听相同的动作类型。因此,两个reducer都将最终保存返回的第一个数据类型,然后用返回的第二个数据类型覆盖它。
您需要具有“获取的品牌成功”和“获取的距离成功”不同的操作类型。
这里要注意的另一件事是,您正在编写的Redux代码的样式已经过时,并且将需要手工编写比您应该编写的代码更多的代码。我们的官方Redux Toolkit软件包将简化您获得的所有代码。例如,对于createAsyncThunk
要获取的每种数据类型,将为成功/失败生成那些独特的操作类型。
请阅读我们文档中的Redux基础知识:带Redux Toolkit的现代Redux教程页面,以了解如何正确使用Redux Toolkit。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句