ReactJS 根据选择获取数据
ReactJS fetch data depending on selection
我得到了这个应用程序,其类别和子类别存储在 MongoDB 中。我想要的是每当用户在下拉菜单中选择一个类别时,它旁边会有另一个包含子类别的下拉菜单,具体取决于我想要显示属于类别选择的子类别的选择。
例如,我们有 2 家汽车制造商:福特和菲亚特
如果选择福特,我想在第二个下拉菜单中加载该品牌的汽车,如果选择另一个,则加载菲亚特汽车。
现在我需要通过从 API 获取数据并将其加载到客户端来完成所有这些工作。
在我看来,我看到了两种可能的解决方案:一种是获取所有内容并检查它所属的位置,然后创建一个新数组,该数组将根据选择将数据发送到下拉列表。第二个选项是为每个选择从 API 中获取数据并将其推送到下拉列表。
我觉得这两种解决方案都超出了我的能力范围,因为我找不到一个不昂贵的功能来完成所有事情,或者我现在太困惑了,解决方案可能很简单,但我有点迷茫。
这是我的组件的代码:
import { useState } from 'react'
import MUI Components...
//DATA FETCHING
import { useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { listCategories } from '../../../redux/categories/categoriesActions'
import { listSubcategoriesByCategory } from '../../../redux/subcategories/subcategoriesActions'
export default function NewProduct() {
const dispatch = useDispatch()
const categoriesList = useSelector((state) => state.categoriesList)
const subcategoriesList = useSelector((state) => state.subcategoriesList)
const { loading, error, categories } = categoriesList
const { subcategories } = subcategoriesList
useEffect(() => {
dispatch(listSubcategoriesByCategory(values.category))
dispatch(listCategories())
}, [dispatch])
const [values, setValues] = useState({
category: ``,
subcategory: ``,
name: '',
})
const handleChange = (prop) => (event) => {
setValues({ ...values, [prop]: event.target.value })
// Somewhere here I should set the state of the subcategories dropdown menu
}
return (
<>
<div>
<FormControl>
<Grid>
<TextField
value={values.category}
onChange={handleChange('category')}>
{categories.map((category) => (
<MenuItem key={category._id} value={category.name}>
category.name}
</MenuItem>
))}
</TextField>
</Grid>
<Grid item xs={6}>
<TextField
value={values.subcategory}
onChange={handleChange('subcategory')}>
{subcategories.map((subcategory) => (
<MenuItem key={subcategory._id} value={subcategory.name}>
{subcategory.name}
</MenuItem>
))}
</TextField>
</Grid>
)}
</>
)
}
目前非常需要和感谢任何建议。
提前致谢!
您是否尝试过在第一个下拉列表中使用依赖数组使用 useEffect?当类别更改时,您可以获取子类别。我也在自己的项目中这样做,但以前从未使用过 redux。
useEffect(() => {
//fetch
}, [category])
非常感谢大家花时间回复并查看我的问题。答案一直在我的代码中,但正如我所说,我猜工作时间太长会使你的视线模糊。
解决方法很简单。
我没有在挂载组件时获取子类别,而是像这样在 handleChange 函数中获取子类别:
const handleChange = (prop) => (event) => {
setValues({ ...values, [prop]: event.target.value })
dispatch(listSubcategoriesByCategory(event.target.value))
我们在选择类别时无论如何都会获得选定的值,我们已经有一个 api GET 请求通过传递类别来获取子类别,这就是我在句柄更改中所做的。我选择一个类别,将类别传递给 redux 函数,然后获取属于所选类别的任何子类别。
再次抱歉打扰您,感谢您的回复<3
我得到了这个应用程序,其类别和子类别存储在 MongoDB 中。我想要的是每当用户在下拉菜单中选择一个类别时,它旁边会有另一个包含子类别的下拉菜单,具体取决于我想要显示属于类别选择的子类别的选择。
例如,我们有 2 家汽车制造商:福特和菲亚特
如果选择福特,我想在第二个下拉菜单中加载该品牌的汽车,如果选择另一个,则加载菲亚特汽车。
现在我需要通过从 API 获取数据并将其加载到客户端来完成所有这些工作。
在我看来,我看到了两种可能的解决方案:一种是获取所有内容并检查它所属的位置,然后创建一个新数组,该数组将根据选择将数据发送到下拉列表。第二个选项是为每个选择从 API 中获取数据并将其推送到下拉列表。
我觉得这两种解决方案都超出了我的能力范围,因为我找不到一个不昂贵的功能来完成所有事情,或者我现在太困惑了,解决方案可能很简单,但我有点迷茫。
这是我的组件的代码:
import { useState } from 'react'
import MUI Components...
//DATA FETCHING
import { useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { listCategories } from '../../../redux/categories/categoriesActions'
import { listSubcategoriesByCategory } from '../../../redux/subcategories/subcategoriesActions'
export default function NewProduct() {
const dispatch = useDispatch()
const categoriesList = useSelector((state) => state.categoriesList)
const subcategoriesList = useSelector((state) => state.subcategoriesList)
const { loading, error, categories } = categoriesList
const { subcategories } = subcategoriesList
useEffect(() => {
dispatch(listSubcategoriesByCategory(values.category))
dispatch(listCategories())
}, [dispatch])
const [values, setValues] = useState({
category: ``,
subcategory: ``,
name: '',
})
const handleChange = (prop) => (event) => {
setValues({ ...values, [prop]: event.target.value })
// Somewhere here I should set the state of the subcategories dropdown menu
}
return (
<>
<div>
<FormControl>
<Grid>
<TextField
value={values.category}
onChange={handleChange('category')}>
{categories.map((category) => (
<MenuItem key={category._id} value={category.name}>
category.name}
</MenuItem>
))}
</TextField>
</Grid>
<Grid item xs={6}>
<TextField
value={values.subcategory}
onChange={handleChange('subcategory')}>
{subcategories.map((subcategory) => (
<MenuItem key={subcategory._id} value={subcategory.name}>
{subcategory.name}
</MenuItem>
))}
</TextField>
</Grid>
)}
</>
)
}
目前非常需要和感谢任何建议。
提前致谢!
您是否尝试过在第一个下拉列表中使用依赖数组使用 useEffect?当类别更改时,您可以获取子类别。我也在自己的项目中这样做,但以前从未使用过 redux。
useEffect(() => {
//fetch
}, [category])
非常感谢大家花时间回复并查看我的问题。答案一直在我的代码中,但正如我所说,我猜工作时间太长会使你的视线模糊。
解决方法很简单。
我没有在挂载组件时获取子类别,而是像这样在 handleChange 函数中获取子类别:
const handleChange = (prop) => (event) => {
setValues({ ...values, [prop]: event.target.value })
dispatch(listSubcategoriesByCategory(event.target.value))
我们在选择类别时无论如何都会获得选定的值,我们已经有一个 api GET 请求通过传递类别来获取子类别,这就是我在句柄更改中所做的。我选择一个类别,将类别传递给 redux 函数,然后获取属于所选类别的任何子类别。
再次抱歉打扰您,感谢您的回复<3