Форум программистов, компьютерный форум, киберфорум
JavaScript: ReactJS
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
1

Работа с Redux-form

01.10.2021, 20:56. Показов 1247. Ответов 4

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Помогите понять ("прощупать") как попал объект с данными собранными из form в качестве аргумента formData функции onSubmit?

p/s Пожалуйста, не пишите, что redux-form устаревшая технология и не советуйте formic, react-form и т.д. Так уж получилось, что нужно разобраться именно с redux-form

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import React from "react";
import { Contact } from "../ProfileInfo";
import {
  createField,
  Input,
  Textarea,
} from "../../../common/FormsControls/FormsControls";
import { reduxForm } from "redux-form";
 
const ProfileDataForm = ({
  profile,
  handleSubmit,
 
}) => {
  return (
    <form onSubmit={handleSubmit}> //handleSubmit пришел к нам из props а туда он попал благодаря reduxForm.  И handleSubmit собрал данные из форм в объект, например, такой: {fullName: 'Bill', lookingForAJobDescription: 'JS', aboutMe: 'programmer', lookingForAJob: true}
 
      <div>
        <b>Full Name: </b>
        {createField("Full Name...", "fullName", Input, [])}
      </div>
 
      <div>
        <b>Looking for a job:</b>{" "}
        {createField("", "lookingForAJob", Input, [], "", { type: "checkbox" })}
      </div>
 
      <div>
        <b>My professional skills:</b>
        {profile.lookingForAJobDescription}
        {createField(
          "My professional skills...",
          "lookingForAJobDescription",
          Textarea,
          [],
          ""
        )}
      </div>
 
      <div>
        <b>About Me:</b>
        {createField("About Me...", "aboutMe", Textarea, [], "")}
      </div>
 
      <div>
        <b>Contacts:</b>{" "}
        {Object.keys(profile.contacts).map((key) => {
          return (
            <Contact
              key={key}
              contactTitle={key}
              contactValue={profile.contacts[key]}
            />
          );
        })}
      </div>
 
      <div>
        <button>Save</button>
      </div>
    </form>
  );
};
 
const ProfileDataFormReduxForm = reduxForm({ form: "edit-profile" })(
  ProfileDataForm
);
 
export default ProfileDataFormReduxForm;
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import React, { useState } from "react";
import Preloader from "../../common/preloader/preloader";
import style from "./ProfileInfo.module.css";
import ProfileStatusWithHooks from "./ProfileStatusWithHooks";
import userPhoto from "../../../assets/images/user_unisex.png";
import AvatarAddr from "./AvatarAddr/AvatarAddr";
import ProfileDataFormReduxForm from "./ProfileDataForm/ProfileDataForm";
 
const ProfileInfo = ({ profile, status, updateStatus, isOwner, savePhoto }) => {
  let [editMode, setEditMode] = useState(false);
 
  if (!profile) {
    return <Preloader />;
  }
 
  const onSubmit = (formData) => {//Как сюда попал объект {fullName: 'Bill', lookingForAJobDescription: 'JS', aboutMe: 'programmer', lookingForAJob: true} с информацией из form? Помогите пошагово проследить его путь
    console.log(formData);
  };
 
  return (
    <div>
      <div className={style.descriptionBlock}>
        <img src={profile.photos.large || userPhoto} alt="avatar" />
        {isOwner && <AvatarAddr savePhoto={savePhoto} />}
        {editMode ? (
          <ProfileDataFormReduxForm profile={profile} onSubmit={onSubmit} />
        ) : (
          <ProfileData
            goToEditMode={() => {
              setEditMode(true);
            }}
            profile={profile}
            status={status}
            updateStatus={updateStatus}
            isOwner={isOwner}
          />
        )}
      </div>
    </div>
  );
};
 
const ProfileData = ({
  profile,
  status,
  updateStatus,
  isOwner,
  goToEditMode,
}) => {
  return (
    <div>
      <div>
        <p>{profile.fullName}</p>
      </div>
      <div>
        <p>
          <ProfileStatusWithHooks status={status} updateStatus={updateStatus} />
        </p>
      </div>
      <div>
        <b>Looking for a job:</b> {profile.lookingForAJob ? "yes" : "no"}
      </div>
      {profile.lookingForAJob && (
        <div>
          <b>My professional skills:</b> {profile.lookingForAJobDescription}
        </div>
      )}
      <div>
        <b>About Me:</b> {profile.aboutMe}
      </div>
      <div>
        <b>Contacts:</b>{" "}
        {Object.keys(profile.contacts).map((key) => {
          return (
            <Contact
              key={key}
              contactTitle={key}
              contactValue={profile.contacts[key]}
            />
          );
        })}
      </div>
      {isOwner && (
        <div>
          <button onClick={goToEditMode}>Edit</button>
        </div>
      )}
    </div>
  );
};
 
export const Contact = ({ contactTitle, contactValue }) => {
  return (
    <div className={style.contact}>
      <b>{contactTitle}</b>: {contactValue}
    </div>
  );
};
 
export default ProfileInfo;
Добавлено через 2 часа 34 минуты
Вот еще связанный с вопросом код.
Но это второстепенный. Самое нужное в первом посте

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import React from "react";
import style from "./FormsControls.module.css";
import { Field } from "redux-form";
 
const FormControl = ({ input, meta: { touched, error }, ...props }) => {
  const hasError = touched && error;
 
  return (
    <div className={style.formControl + " " + (hasError ? style.error : "")}>
      <div>{props.children}</div>
      {hasError && <span>{error}</span>}
    </div>
  );
};
 
export const Textarea = (props) => {
  const { input, ...restProps } = props;
  return (
    <FormControl {...props}>
      <textarea {...input} {...restProps} />
    </FormControl>
  );
};
 
export const Input = (props) => {
  const { input, ...restProps } = props;
  return (
    <FormControl {...props}>
      <input {...input} {...restProps} />
    </FormControl>
  );
};
 
export const createField = (
  placeholder,
  name,
  component,
  validators,
  className,
  props = {},
  text = "",
) => {
  return (
    <div>
      <Field
        className={className}
        placeholder={placeholder}
        name={name}
        component={component}
        validate={validators}
        {...props}
      />
      {text}
    </div>
  );
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2021, 20:56
Ответы с готовыми решениями:

children и redux-form
Помогите, плиз, проследить как и куда передаются тут props Компоненты в левой части экрана на...

Redux-Form
Добрый день Начал использовать Redux-Form, на данный момент делаю изменение записей. Подскажите...

Redux form попытка очистить конкретный field
Всем привет, есть такая форма. &lt;form className={classes.listField}...

Redux+React. Взаимодействие redux store с сервером
Помогите понять такой момент: Приложение react+redux+ сервер на ноде. Пока не использовал сервер...

Form.Hide ; Form.Close ; Form.Show
Здравствуйте. Вот интересует один вопрос, в чём различие между Form1.Close; Form2.Show и...

4
130 / 68 / 31
Регистрация: 24.07.2018
Сообщений: 787
04.10.2021, 08:31 2
Alborki, он у тебя не попал а попадет, когда нажмешь кнопку сабмита.
Вообщем. Ты создаешь redux form, задаешь ему имя - edit-profile,
далее ты обертываешь свою форму в этот redux form, у твоей формы теперь будет onSubmit с redux form. Так же используя
Field, redux form понимает какие поля будут и будет наблюдать за ними, я думаю эти поля даже контролируемые, хотя и не уверен. И весь стейт формы хранится в redux, когда нажимаешь onSubmit, он тебе его выдает.
Надеюсь стало немного понятнее
1
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
10.10.2021, 13:32  [ТС] 3
Alborki, он у тебя не попал а попадет, когда нажмешь кнопку сабмита.
Спасибо, вопрос не в этом, общую механику работы redux form я понимаю.
Я детально, пошагово не могу проследить поток, как это значение попадет после сабмита

Пока остановился на том, что работает и работает..
Пишу код дальше.
Типо - Чудо
0
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
12.10.2021, 14:47  [ТС] 4
Ведь onSubmit в компоненте ProfileInfo и в ProfileDataForm это вроде совсем разные сабмиты.
В первом случае - это написанная нами функция, а во втором это подписка на событие сабмит в теге form.
Понятно, что редакс-форм сохраняет данные собранные слушателем сабмита в своем локальном стейте, но как этот объект был передан в нашу функцию onSubmit в компоненте ProfileInf?
По через props как-то?
Но я не могу проследить как

Добавлено через 7 минут
Или onSubmit в компоненте ProfileInfo напрямую лезет как-то в стейт редакс-форм и достает оттуда formData?
0
38 / 14 / 4
Регистрация: 28.01.2020
Сообщений: 170
13.10.2021, 19:56  [ТС] 5
Лучший ответ Сообщение было отмечено DrType как решение

Решение

Все разобрался. Объект formData передает в качестве аргумента handleSubmit - метод предоставляемый redux-form.
handleSubmit делает следующее:
1. e.prevendDefault - отменяет действие баттона по-умолчанию
2. Собирает все данные из form и помещает их в объект formData
3. Вызывает и передает объект formDataв качестве аргумента в функцию onSubmit, которую получает в props из LoginReduxForm props.onSubmit(formData );

Добавлено через 1 час 20 минут
Вопрос закрыт.
Всем спасибо!
0
13.10.2021, 19:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2021, 19:56
Помогаю со студенческими работами здесь

Работа с Form
Задача - разработать чат на именованных каналах с формами. Для того чтобы работал бесконечный цикл...

работа в с Form
textBox5-&gt;Text(a).ToString(); выводит чему равно а как сделать что бы выводилось типо так 2+3i...

Работа с Form
Помогите,пожалуйста, связать один форм на двух unit. У меня есть 4 формы и 4 юнит, я хочу чтобы на...

Работа с Form
Не пойму, как оформляются пользовательские функции в form. Объясните пожалуйста, как всунуть их...

Работа с Windows Form
Здравствуйте. Подскажите, пожалуйста,... Я создаю приложение в Visual Studio C++ 2008 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru