Redux Form v6 - 使用唯一键生成动态表单失去了对输入值的关注
Redux Form v6 - Generating dynamic form with unique keys loses focus on entering value
希望有人知道问题所在。
我有一个像这样的数组:
let fields = [
{ name: 'email', type: 'email', placeholder: 'Email', component: FeedbackInput },
{ name: 'password', type: 'password', placeholder: 'Passwort', component: FeedbackInput }
];
我想通过以下方式在我的 redux 表单中呈现它:
<form onSubmit={ handleSubmit(this.props.startAnimation.bind(this, 'animatedBtnConfig')) }>
<fieldset>
{ fields.map(field => <Field key={_.uniqueId('field_')} { ...field } component={ FeedbackInput } />) }
</fieldset>
<fieldset className="center">
<AnimatedButtonRedux />
</fieldset>
</form>
所以问题是表格是初始有效的,我只能输入 1 个字符。然后它会失去输入字段的焦点,必须再次单击它。
当我用 "FieldArray" 尝试时出现同样的问题:
<FieldArray name="authData" component={ DynamicFields } fields={ fields } />
动态字段组件:
export default props => {
console.log("Dynamic Fields: ", props);
return (
<div>
{ props.fields.map(field => <Field key={_.uniqueId('field_')} { ...field } />) }
</div>
);
};
相反,当我这样尝试时:
<Field { ...fields[0] } />
<Field { ...fields[1] } />
<Field { ...fields[2] } />
效果很好。
当我查看 DOM 时,我看不出开发工具有任何区别。
为什么 redux 表单会这样?我想不通。如果有人能给我解决这个问题的关键提示,我将不胜感激!
发生这种情况是因为 unique id
作为 key
提供给 Field
组件,例如 key={_.uniqueId('field_')}
因此,每当您的组件被重新渲染时,React 会检查 key
以渲染 DOM,现在因为您的 key
是每次渲染组件时唯一生成的并且 map
函数运行,您的 Field
组件每次都会被新组件替换,因此您会看到这个问题。
尽管您需要设置密钥并且它在整个文档中应该是唯一的,但它应该在每次渲染时保持相同。
所以把密钥改成
<fieldset>
{ fields.map((field, index) => <Field key={index} { ...field } component={ FeedbackInput } />) }
</fieldset>
希望有人知道问题所在。 我有一个像这样的数组:
let fields = [
{ name: 'email', type: 'email', placeholder: 'Email', component: FeedbackInput },
{ name: 'password', type: 'password', placeholder: 'Passwort', component: FeedbackInput }
];
我想通过以下方式在我的 redux 表单中呈现它:
<form onSubmit={ handleSubmit(this.props.startAnimation.bind(this, 'animatedBtnConfig')) }>
<fieldset>
{ fields.map(field => <Field key={_.uniqueId('field_')} { ...field } component={ FeedbackInput } />) }
</fieldset>
<fieldset className="center">
<AnimatedButtonRedux />
</fieldset>
</form>
所以问题是表格是初始有效的,我只能输入 1 个字符。然后它会失去输入字段的焦点,必须再次单击它。
当我用 "FieldArray" 尝试时出现同样的问题:
<FieldArray name="authData" component={ DynamicFields } fields={ fields } />
动态字段组件:
export default props => {
console.log("Dynamic Fields: ", props);
return (
<div>
{ props.fields.map(field => <Field key={_.uniqueId('field_')} { ...field } />) }
</div>
);
};
相反,当我这样尝试时:
<Field { ...fields[0] } />
<Field { ...fields[1] } />
<Field { ...fields[2] } />
效果很好。
当我查看 DOM 时,我看不出开发工具有任何区别。 为什么 redux 表单会这样?我想不通。如果有人能给我解决这个问题的关键提示,我将不胜感激!
发生这种情况是因为 unique id
作为 key
提供给 Field
组件,例如 key={_.uniqueId('field_')}
因此,每当您的组件被重新渲染时,React 会检查 key
以渲染 DOM,现在因为您的 key
是每次渲染组件时唯一生成的并且 map
函数运行,您的 Field
组件每次都会被新组件替换,因此您会看到这个问题。
尽管您需要设置密钥并且它在整个文档中应该是唯一的,但它应该在每次渲染时保持相同。
所以把密钥改成
<fieldset>
{ fields.map((field, index) => <Field key={index} { ...field } component={ FeedbackInput } />) }
</fieldset>