I know many variations of this question has already been asked but my problem isn't as simple as using event.preventDefault()
or perhaps it is and my events are somehow getting tangled up.
Problem: I have a tag helper component that adds a hidden input field with this new tag information when a new tag is entered by pressing 'Enter'. When this happens, my form submits which is the default behavior. I do not want that. This event takes places at the child component level, not at the parent level where the form markup is located. When i add event.preventDefault()
at the parent level this does indeed prevent a form submission however this locks up my form and cannot submit a form with the default behavior. When i try this at the child level it ignores the event.preventDefault()
. If i try an inline onSubmit
on the form and useState
as a conditional and update this state onClick
for the submit button the updated value is lagging behind. I tried using useEffect
but i got an infinite loop. I simply want to prevent empty required fields from being submitted while retaining normal behavior. (Im using Remix which doesnt require things like redux, sagas, axios etc)
Code sandbox example: https://codesandbox.io/s/vibrant-lederberg-3pkriq-3pkriq
Some code from my child component
onEnter to create hidden input fields with tag info:
const onEnter = (e) => {
if (e.code === 'Enter' && inputValue && valid) {
e.preventDefault();
setTags([...tags, { id: String(Math.floor(Math.random() * 1000)), name: inputValue }]);
setInputValue('');
}
};
Pill with hidden input:
const Pill = ({
onClickHandler, name, value, children,
}) => {
return (
<div title="remove" onClick={(e) => onClickHandler(e)}>
{children}<span>X</span>
<input type="hidden" name={name} value={value.name} />
</div>
);
};
render for child component:
return (
<div>
<input
placeholder={placeholder}
value={inputValue}
onKeyUp={(e) => onEnter(e)}
onChange={(e) => onChange(e)}
/>
<div>
{tags
&& tags.map((item) => (
<Pill
value={item}
onClickHandler={onDelete}
key={item.name}
name={name}
>
{item.name}
</Pill>
))}
</div>
</div>
);
I've been stuck on this for weeks and after trying dozens of workarounds such as HTML5 required attribute, validation libraries, custom server side validation, event.stopPropagation
, inline onSubmit and same issue persists. At this point I think the problem may be where the location of the event is firing. When i log the event.type
at the parent level after i hit Enter
i see undefined
and then KeyUp
if that helps. Maybe i need to pass the event up from the child? Any direction or clues would help!
Comments
Post a Comment