#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
-это производительность. Он возвращает один и тот же экземпляр каждый раз, если значения второго параметра не меняются. Запоминание может быть сложным, если у вас неправильно установлены условия. Просто не используйте его, если вам не нужны преимущества производительности (обычно это не так).