Я создаю пользовательский хук, который принимает объект и, в свою очередь, вызывает useEffect
. Объект может содержать встроенные функции.
const stuff = useValidation({
fields: {
username: { /* more nested objects */ }
},
onSubmit: () => alert('submitted'),
});
Реализация ловушки выглядит следующим образом:
function useValidation(config) {
const [state, dispatch] = useReducer(validationReducer);
useEffect(() => {
validateFields(config.fields, state);
}, [config.fields, state]);
}
Это еще не все ( вот фактическая реализация ), но это соответствующие части.
Когда я создаю встроенный объект, useEffect
работает непрерывно. Это происходит потому, что React использует ссылочное равенство (а не глубокое равенство), чтобы проверить, изменился ли материал.
Я могу «исправить» это, либо поместив мою конфигурацию в useMemo
, либо переместив ее за пределы метода рендеринга. И то и другое очень плохо для разработчиков.
Я попробовал библиотеку Кента С. Доддса use-deep-compare-effect
, но, поскольку я разрешил встроенные функции стрелок в моей конфигурации, она не "работает".
Предпочтительно, я бы хотел, чтобы пользователь мог вводить встроенный объект и как-то разрешать любые изменения.
Как я могу решить это?