【发布时间】:2021-03-20 20:18:28
【问题描述】:
我正在尝试让我的 Redux 存储字段自动填充我已导入的方法。我是否以正确的方式来完成这项工作?我需要为每个字段创建映射选项吗?
我的每个下拉列表都插入了 PopulateDropdown 列表和每个下拉列表中的字段,但我需要根据 id 和文本将它们拆分。
我是否在下面正确访问了我的 redux 商店?我使用 const fields = useSelector(state => state.fields);
在我的函数组件上声明了数组更新 我将方法插入到下拉列表应该在的位置,但是我认为我没有正确访问导致问题的数据。字段数组已被分解为每个下拉菜单的六个不同字段,并为每个字段创建了不同的映射选项。
我需要做什么才能将数据导入方法中?我见过的示例在组件上声明了静态数组,而不是使用 Redux 存储。
const fields = useSelector(state => state.fields);
// can destructure individual fields
const { diveSchoolList, currentList, regionList, diveTypeList, visibilityList, diveSpotList } = fields;
我已经导入的populateDropdown 方法
export const PopulateDropdown = ({ dataList = [], mappingOptions, name, label }) => {
const { title, value } = mappingOptions;
return (
<FormControl style={{ width: 200 }} >
<InputLabel id={label}>{label}</InputLabel>
<Select labelId={label} name={name} >
{dataList.map((item) => (
<MenuItem value={item[value]}>{item[title]}</MenuItem>
))}
</Select>
</FormControl>
);
};
导入的下拉菜单
<PopulateDropdown
dataList={diveType}
mappingOptions={mappingOptions}
name="fieldName"
label="Select dive type"
value={dive.typeID}
onChange={handleChange}/>
更新
我已经更新了我的 action、reducer 和 populateFields 方法,但是我仍然无法将 redux 数据映射到我的两个属性字段。在 Redux 树中,当我在控制台记录它们时,这些字段应该位于 fields.data.fieldlists 下。
我应该以什么方式将它们填充到 titleProperty 等中?它目前看起来可能正在填充,但是一个大框会下拉,我看不到里面的任何值。
// select user object from redux
const user = useSelector(state => state.user);
// get the object with all the fields
const fields = useSelector(state => state.fields);
// can destructure individual fields
const { diveSchoolList = [],
currentList = [],
regionList = [],
diveTypeList = [],
visibilityList = [],
diveSpotList = [],
marineTypeList = [],
articleTypeList = []
} = fields;
.........
<PopulateDropdown
dataList={fields.data.diveTypeList} // the options array
titleProperty={fields.data.diveTypeList.diveTypeID} // option label property
valueProperty={fields.data.diveTypeList.diveType} // option value property
label="Dive Type Name" // label above the select
placeholder="Select dive type" // text show when empty
value={dive.typeID} // get value from state
onChange={handleChange(setDive.typeID)} // update state on change
/>
【问题讨论】:
-
您需要使用 redux-toolkit 中的
useSelector或 react-redux 中的connect函数将 redux 数据注入到您的组件中。你做得对吗? -
我推荐你使用 redux 钩子来完成这个。如前所述,使用 useSelector 获取数据并使用 useDispatch 调度操作。你确定你做对了吗?
-
这个答案会有所帮助:stackoverflow.com/questions/66648507/…
-
嗨 Jimbo,I helped you 几周前建立了 redux 商店。现在看起来怎么样?如果您可以分享 Github 存储库或 CodeSandbox,它将帮助我更好地了解数据结构是什么样的。我绝对认为我们可以创建一个通用组件,只需几个配置道具即可适用于所有 6 个列表。
-
看起来你所拥有的大部分是正确的!我认为您实际上不需要将
name属性传递给选择。另外,我不会创建mappingOptions对象,而是让PopulateDropdown组件具有两个单独的属性valueProperty和titleProperty。我可以给你写一个答案,但它不像上一个那样深入,因为你已经掌握了这个窍门!我看到您在一个 API 调用中获取所有字段数据,这很棒。
标签: reactjs redux react-redux material-ui