UseEffectHook в веб-форме

Я пытаюсь использовать хук useEffect для предварительного заполнения некоторых данных формы, но не могу заставить его работать правильно.

Я могу загрузить данные в поля, обновив страницу - тогда все работает нормально - это когда код установлен, как показано в примере.

Я могу загрузить данные в форму при ее первой загрузке, добавив «состояние» в [] на useEffect, но тогда я не могу изменить данные в форме (действие из редукса повторно запускается при каждом изменении на форма и перезаписывает все, что было введено). load возвращается как часть редьюсера, который сначала устанавливает его в true, а затем в false, как только возвращается полезная нагрузка.

const EditForm = ({ reduxstore: {state, loading},  callreduxfunction, match, history}) => {

     const [formData, setFormData] = useState({
        _id: '',
        field1: ''
     })   

     useEffect( () => {
         callreduxfunction(match.params.id);
         setFormData({
            _id: match.params.id,
            field1: !loading ? state.field1 : ''
         });   

    }, [loading,  callreduxfunction, match]);

    )
}

Я новичок в реагировании и только начал использовать хуки - буду очень признателен за любую помощь в этом!

Какова ваша цель использования useEffect ? Из вашего вопроса не ясно. Если вы ответите, я могу помочь.

FurkanO 18.06.2019 11:44

Что делает callreduxfunction? Где инициализируется state? Где определяется loading и что заставляет его меняться? Если вы хотите предварительно заполнить форму, зачем повторять это каждый раз, когда loading меняется? Слишком мало информации, чтобы адекватно ответить на ваш вопрос.

trixn 18.06.2019 11:57

@FurkanO useEffect предназначен для возврата данных из вызова API (через действие/редуктор редукции), который является частью функции callreduxfuntion, и установки данных формы в значения, возвращаемые API.

viviejed 18.06.2019 12:31

@viviejed хорошо, понятно. Но почему вы предоставили вторые параметры для useEffect? Вам нужно сделать это более одного раза для одного и того же компонента?

FurkanO 18.06.2019 20:13

@FurkanO нет, я не знаю, и я пытался удалить его, но это не имеет значения, кажется, проблема в [состоянии], которое я извлекаю из хранилища избыточности ... если я не включаю, что данные не загружается при первом отображении страницы, если я это сделаю, она перезапускается при каждом изменении и перезаписывает изменения в форме...

viviejed 18.06.2019 21:08

@viviejed, но почему бы вам не сохранить состояние редукции в качестве источника истины, чтобы не хранить одни и те же данные в компоненте? Таким образом, у вас будет второй параметр для useEffect as [], чтобы вызвать его один раз при монтировании компонента, а затем просто прочитать из избыточности и тоже записать в избыточность.

FurkanO 18.06.2019 21:32

@FurkanO Я пробовал это, думая, что это логичный способ сделать это, но это не работает, когда я это делаю.

viviejed 18.06.2019 21:37

@viviejed, вы должны заставить это работать, потому что объединение управления данными, которое вы пытаетесь сделать в этом случае, не является лучшей практикой, если у вас нет особой необходимости. Вы должны больше стараться, чтобы избыточность была источником правды. Вы можете разместить/обновить свой вопрос о том, как вы не можете это сделать. Я могу помочь.

FurkanO 18.06.2019 21:39

@FurkanO - да, сохранение избыточности в качестве источника правды - это то, чего я пытаюсь достичь, по крайней мере, при первой загрузке формы. Проблема в том, что если я не включу вызов функции в избыточность и состояние из избыточности, данные не будут возвращены в форму. Хотя я вижу, что вызов функции redux работает нормально, поскольку я загружаю разные поля в форму в зависимости от возвращаемых данных, и этот бит работает при загрузке страницы, кажется, что только часть setState не работает.

viviejed 18.06.2019 21:45

Я всегда использую избыточность как источник правды для управления данными формы. Я редко использую реакции внутреннего управления состоянием.

FurkanO 18.06.2019 21:47

Не знаете, как это сделать? @ФурканО

viviejed 18.06.2019 21:56

Итак, вы знаете, как обновить состояние редукции? А также читать из состояния редукции? Если ответ да на оба вопроса, вы можете выполнить настройку и чтение значений формы.

FurkanO 18.06.2019 21:59

так что @FurkanO, чтобы убедиться, что я прав, вы говорите, что не используете хук useState и используете только данные из избыточности?

viviejed 18.06.2019 22:12

Ага. Определенно.

FurkanO 18.06.2019 22:30

@FurkanO, как будет выглядеть onChange? на данный момент у меня есть константа onChange = e => set Form Data({...formData, [e.target.name]: e.target.value });

viviejed 18.06.2019 23:15

@viviejed звучит хорошо. но если есть проблема, попробуйте отладить все с помощью инструмента Redux dev. Например, проверьте, работает ли действие так, как вы ожидали, проверив состояние и следующее состояние.

FurkanO 19.06.2019 00:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
16
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать несколько хуков useEffect, один для инициализации и один для обработки обновлений:

...
// When loading for the first time (Initialization)
useEffect( () => {
         // do something 

}, [ ]);

// After updating state
useEffect( () => {
         callreduxfunction(match.params.id);
         setFormData({
            _id: match.params.id,
            field1: !loading ? state.field1 : ''
         });   

}, [loading,  callreduxfunction, match]);
...
Ответ принят как подходящий

В случае, если это кому-то поможет, в конце концов я изменил код на это:

const EditForm = ({ reduxstore: {state, loading},  callreduxfunction, match, history}) => {

         const [formData, setFormData] = useState({
            _id: '',
            field1: ''
         })   

         useEffect( () => {
             callreduxfunction(match.params.id);
             setFormData({
                _id: match.params.id,
                field1: !loading ? state.field1 : ''
             });   

        }, [state._id]);

        )
    }

Это предотвратило повторение избыточного вызова после начальной загрузки, поскольку идентификатор не меняется. Чтобы это сработало, мне также пришлось установить начальное состояние «состояния» на пустой объект в моем редукторе (оно было установлено на ноль).

Другие вопросы по теме