React-Native + Redux:表单字段的随机数
React-Native + Redux: Random number of form fields
我是 react-native、redux 和 saga 的新手,并且 运行 遇到了一个我无法找到解决方案的用例。我了解如何将状态映射到属性并在 action、reducer 和 saga 之间传递状态。到目前为止,这对我来说很有意义。这就是事情似乎变得冒险的地方。我有一个表单,在任何给定时间都需要可变数量的表单字段,具体取决于从数据库返回的内容。
举个例子,假设我有这样的结构:
{
name: ‘’,
vehicleMake: ‘’,
vehicleModel: ‘’,
carLotCity: ‘’,
carLotState: ‘’,
carLotZipCode: ‘’,
localPartsManufacturers: [{name: ‘’, address: ‘’, zipCode}]
}
从名称到 carLotZipCode 的所有内容都只需要一个文本字段,但是,localPartsManufacturers 数组可以表示任意数量的对象,每个对象都需要自己的一组文本字段。就将字段映射到状态并将状态映射到属性而言,我将如何使用 redux 来解释这一点?我对如何开始这种情况感到困惑。我了解如何在固定字段的情况下投影映射。
没有什么可以阻止您在 Redux 中保留列表、映射、集合或任何其他对象。
剩下的唯一事情就是如何将状态映射到道具,以及如何使用它们。不是将集合中的单个元素映射到道具,而是将整个集合映射到单个道具,然后在渲染方法中迭代集合。
在该操作中,您可以传回一个新集合,该集合由组成部件列表的表单字段组成。然后,您的减速器将替换集合本身。
或者,在更改部分集合中的元素后,您可以发送一个带有其 ID 的操作,在缩减器的集合中找到它并替换已更改的元素/添加新元素/删除已删除的元素.
我会保留来自后端的数据。这样你就可以避免规范化它。我认为我们在渲染字段时必须更聪明。这是我的建议:
function onTextFieldChange(name, index) {
// either name = `name`, `vehicleMake`, ...
// or
// name = `localPartsManufacturers` and `index` = 0
}
function createTextField(name, index) {
return <input
type='text'
name={ name }
onChange={ () => onTextFieldChange(name, index) } />;
}
function Form({ fields }) {
return (
<div>
{
Object.keys(fields).reduce((allFields, fieldName) => {
const field = fields[fieldName];
if (Array.isArray(field)) {
allFields = allFields.concat(field.map(createTextField));
} else {
allFields.push(createTextField(fieldName));
}
return allFields;
}, [])
}
</div>
);
}
Form
接收您在商店中拥有的所有数据。然后我们检查该字段是否是一个数组。如果它是一个数组,我们遍历其中的字段并生成与其他属性相同的输入 createTextField
。这里棘手的部分是如何更新商店中的数据。请注意,当文本字段数据更改时,我们正在传递 index
。在减速器中,我们必须编写如下内容:
case FIELD_UPDATED:
const { name, index, value } = event.payload;
if (typeof index !== 'undefined') {
state[name][index] = value;
} else {
state[name] = value;
}
return state;
我是 react-native、redux 和 saga 的新手,并且 运行 遇到了一个我无法找到解决方案的用例。我了解如何将状态映射到属性并在 action、reducer 和 saga 之间传递状态。到目前为止,这对我来说很有意义。这就是事情似乎变得冒险的地方。我有一个表单,在任何给定时间都需要可变数量的表单字段,具体取决于从数据库返回的内容。
举个例子,假设我有这样的结构:
{
name: ‘’,
vehicleMake: ‘’,
vehicleModel: ‘’,
carLotCity: ‘’,
carLotState: ‘’,
carLotZipCode: ‘’,
localPartsManufacturers: [{name: ‘’, address: ‘’, zipCode}]
}
从名称到 carLotZipCode 的所有内容都只需要一个文本字段,但是,localPartsManufacturers 数组可以表示任意数量的对象,每个对象都需要自己的一组文本字段。就将字段映射到状态并将状态映射到属性而言,我将如何使用 redux 来解释这一点?我对如何开始这种情况感到困惑。我了解如何在固定字段的情况下投影映射。
没有什么可以阻止您在 Redux 中保留列表、映射、集合或任何其他对象。
剩下的唯一事情就是如何将状态映射到道具,以及如何使用它们。不是将集合中的单个元素映射到道具,而是将整个集合映射到单个道具,然后在渲染方法中迭代集合。
在该操作中,您可以传回一个新集合,该集合由组成部件列表的表单字段组成。然后,您的减速器将替换集合本身。
或者,在更改部分集合中的元素后,您可以发送一个带有其 ID 的操作,在缩减器的集合中找到它并替换已更改的元素/添加新元素/删除已删除的元素.
我会保留来自后端的数据。这样你就可以避免规范化它。我认为我们在渲染字段时必须更聪明。这是我的建议:
function onTextFieldChange(name, index) {
// either name = `name`, `vehicleMake`, ...
// or
// name = `localPartsManufacturers` and `index` = 0
}
function createTextField(name, index) {
return <input
type='text'
name={ name }
onChange={ () => onTextFieldChange(name, index) } />;
}
function Form({ fields }) {
return (
<div>
{
Object.keys(fields).reduce((allFields, fieldName) => {
const field = fields[fieldName];
if (Array.isArray(field)) {
allFields = allFields.concat(field.map(createTextField));
} else {
allFields.push(createTextField(fieldName));
}
return allFields;
}, [])
}
</div>
);
}
Form
接收您在商店中拥有的所有数据。然后我们检查该字段是否是一个数组。如果它是一个数组,我们遍历其中的字段并生成与其他属性相同的输入 createTextField
。这里棘手的部分是如何更新商店中的数据。请注意,当文本字段数据更改时,我们正在传递 index
。在减速器中,我们必须编写如下内容:
case FIELD_UPDATED:
const { name, index, value } = event.payload;
if (typeof index !== 'undefined') {
state[name][index] = value;
} else {
state[name] = value;
}
return state;