Как создать несколько форм на одной странице с redux-forms v6?
у меня есть простое приложение todo, в котором мой магазин redux содержит массив "todos". Мой компонент "Todo" отображает все "todo" в магазине и отображает компонент "TodoForm", который использует redux-forms v6.
как и сейчас, каждый "todo" имеет одно и то же имя формы/ключ, поэтому каждый раз, когда я ввожу что-то в поле "title", Он изменяет "title" каждого todo. Я нашел работу, используя уникальные имена полей, но я боюсь, что это будет усложнять вещи по мере роста приложения, и предпочел бы использовать уникальные имена форм, чтобы каждое поле могло иметь одно и то же имя, не мешая другим формам
(TodoForm1, TodoForm2, TodoForm3 могут иметь уникальное поле "title" вместо TodoForm, содержащего поля "title1", "title2", "title3").
Я попытался получить доступ к реквизиту TodoForm, чтобы я мог установить ключ каждой формы как уникальный идентификатор компонента, но не похоже, что компонент получает реквизит так рано.
Я также попытался сделать немедленно вызывается функция, где она выплевывает случайное число и использует это число в качестве имени формы, но это также не сработало.
как я могу отобразить все мои todos и отобразить V6 redux-форму с уникальным ключом формы?
вот изображение приложения, консоли и redux devtools. Есть 3 "todos", но есть только одна форма, которая соединяет их все, todo-926, хотя каждый ключ формы должен был быть случайным образом сгенерирован в немедленно вызванном функция:
HomePageMainSection.индекс.js
renderTodos(todo) {
if (!todo) {
return <div>No Todos</div>;
}
return (
<div key={todo.get('id')}>
<Todo
todo={todo}
updateTodo={this.props.updateTodo}
deleteTodo={this.props.deleteTodo}
/>
</div>
);
}
render() {
if (!this.props.todos) {
return <div>No Todos</div>;
}
return (
<div className={styles.homePageMainSection}>
<h1>Hey I'm the Main Section</h1>
<div>
{this.props.todos.get('todos').map(this.renderTodos)}
</div>
</div>
);
}
Todo.индекс.js:
renderTodo() {
if (this.state.editMode) {
return (
<TodoForm
todo={this.props.todo} changeTodoEditMode={this.changeTodoEditMode}
updateTodo={this.props.updateTodo}
/>
);
}
return (
<div className={styles.Todo} onClick={this.changeTodoEditMode}>
<div className="card card-block">
<h4 className="card-title">{this.props.todo.get('author')}</h4>
<p className="card-text">{this.props.todo.get('title')}</p>
<i
className={`${styles.deleteIcon} btn btn-danger fa fa-times`}
onClick={this.deleteTodo}
></i>
</div>
</div>
);
}
render() {
return (
<div className="col-xs-6 col-sm-4">
{this.renderTodo()}
</div>
);
}
TodoForm.индекс.js:
class TodoForm extends React.Component { // eslint-disable-line react/prefer-stateless-function
constructor(props) {
super(props);
this._handleSubmit = this._handleSubmit.bind(this);
}
_handleSubmit(formData) {
console.log('');
console.log('OG: ', this.props.todo)
console.log('formData: ', formData);
const data = this.props.todo.update('title', formData.get('title'));
console.log('data: ', data);
console.log('');
// this.props.updateTodo(data);
}
render() {
const { handleSubmit, pristine, submitting } = this.props;
return (
<form className={`${styles.todoForm} card`} onSubmit={handleSubmit(this._handleSubmit)}>
<div className="card-block">
<label htmlFor="title">{this.props.todo.get('title')}</label>
<div className={'form-group'}>
<Field name={`title`} component="input" type="text" placeholder="Enter new title" className="form-control" />
</div>
</div>
<div className="card-block btn-group" role="group">
<button
className="btn btn-success"
type="submit"
disabled={pristine || submitting}
>
Submit
</button>
<button
className="btn btn-danger fa fa-times"
onClick={this.props.changeTodoEditMode}
>
</button>
</div>
</form>
);
}
}
const randomNum = (() => {
const thing = Math.floor(Math.random() * 1000) + 1;
console.log('thing: ', thing);
console.log('notThing: ', TodoForm.props);
return thing;
})();
export default reduxForm({
form: `todo-${randomNum}`,
})(TodoForm);
1 ответов
для предоставления динамического ключа форм вы должны использовать форма атрибута TodoForm компоненты:
renderTodo() {
if (this.state.editMode) {
return (
<TodoForm
form={'todo-' + this.props.todo.id}
todo={this.props.todo} changeTodoEditMode={this.changeTodoEditMode}
updateTodo={this.props.updateTodo}
/>
);
}
[...]
}
(вместо это.реквизит.Тодо.id может быть ваш randomNum вызов функции)
ссылка на API:http://redux-form.com/6.0.2/docs/api/Props.md/