React useCallback — я не могу обновить свою функцию

#javascript #reactjs #usecallback

Вопрос:

Я хочу обновить свою функцию обратного вызова:

 const getSchema = React.useCallback(
        () => {
            const schema = twSchema(
                labels,
                isInitialWarehouseActive ? initialWarehouse.id : undefined,
                operationTypeDisabled ? initialWarehouse.operation_type : undefined
            );
            schema.addValidator((model, _schema) => {
                if (model.dateRangeMode amp;amp; (!model.timeRangeMode || model.hasRampHours) amp;amp; !model.dateInpu.to) {
                    _schema.setModelError('dateInput.to', labels.fieldIsRequired);
              ...
              ...
            });
            return schema;
        },
        [initialStore]
    );
 

где твщема:

 const twSchema = (labels, initialStoreId, storeOperationType) => new Schema({...
 

И пример использования моего getSchema :

 <Form
                key="time-window-form"
                ctx="time-window-form"
                eventsEmitter={eventsEmitter}
                model={model}
                onError={onError}
                onSubmit={(data) => {
                   ...
                    }).then(() => {
                       ...
                    })
                        .catch(hint => displayMessageAndHighlightValidatedComponent(hint));
                }}
                schema={getSchema()}
            >
 

Я использую это значение ( getSchema ) для своей формы (я должен установить схему для своей формы).

В зависимости от возможной ошибки я хотел бы добавить в свою схему какой-нибудь валидатор, НО НЕ МОГУ:

  const displayMessageAndHighlightValidatedComponent = (hint) => {
        getSchema().addValidator((model, schema) => {
//this code is not executed!!!
            console.log(schema);
            console.log('SCHEMA');
            schema.setModelError('dateInputField', labels.createNextTimeWindow);
        });
        return onFailed();
    };
 

Вопрос в том, почему? Почему я не могу обновить свой объект/функцию? Я должен удалить useCallback , чтобы иметь возможность динамически добавлять валидатор…

Комментарии:

1. Если я правильно понимаю, каждый новый вызов GetSchema будет генерировать новый объект, верно?

2. Попробуйте определить все зависимости явно, а не просто initialStore. Как и ярлыки, isInitialWarehouseActive, operationTypeDisabled, начальный склад

3. Да, вы правы — функция twSchema() каждый раз создает новый объект схемы! Я думаю, что, возможно, useCallback работает по — другому, но магии нет-каждый раз, когда создается новый объект:) Спасибо:)

4. Стимул к использованию useCallback -это производительность. Он возвращает один и тот же экземпляр каждый раз, если значения второго параметра не меняются. Запоминание может быть сложным, если у вас неправильно установлены условия. Просто не используйте его, если вам не нужны преимущества производительности (обычно это не так).