| name | fix-modus-component-event-issues |
| description | Debug and fix common event handling problems with Modus web components |
Fix Modus Component Event Issues
Debug and fix common event handling problems with Modus web components in SolidJS.
When to Use
Use this skill when:
- Events aren't firing on Modus components
- Components aren't responding to user interactions
- Event handlers aren't being called
- You suspect event listener setup issues
Common Issues and Solutions
Issue 1: Events Not Firing
Symptoms: Click handlers, change handlers, or other events don't fire.
Causes:
- Missing event listener setup
- Wrong event name
- Component ref not set up
- Handler not passed as prop
Solution:
createEffect(() => {
const component = componentEl;
if (!component) return;
const handleEvent = (event: Event) => {
props.onEvent?.(event as CustomEvent<EventDetailType>);
};
if (props.onEvent) {
component.addEventListener("eventName", handleEvent);
}
return () => {
if (props.onEvent) {
component.removeEventListener("eventName", handleEvent);
}
};
});
Checklist:
Issue 2: Missing Cleanup
Symptoms: Memory leaks, events firing multiple times, component errors after unmount.
Solution:
createEffect(() => {
const component = componentEl;
if (!component) return;
const handleEvent = (event: Event) => {
props.onEvent?.(event as CustomEvent<EventDetailType>);
};
component.addEventListener("eventName", handleEvent);
return () => {
component.removeEventListener("eventName", handleEvent);
};
});
Issue 3: Wrong Event Names
Symptoms: Events never fire, wrong event type received.
Common Event Names:
| Component | Event Name | Detail Type |
|---|
| Checkbox | inputChange | InputEvent |
| TextInput | inputChange | InputEvent |
| DropdownMenu | itemSelect | { value: string } |
| DropdownMenu | menuVisibilityChange | { isVisible: boolean } |
| Navbar | searchClick | MouseEvent | KeyboardEvent |
| Accordion | expandedChange | { expanded: boolean; index: number } |
Solution: Check Modus documentation for exact event names. They're case-sensitive.
Issue 4: Missing Ref
Symptoms: Cannot read property 'addEventListener' of null, events don't attach.
Solution:
let componentEl: HTMLModusWcComponentElement | undefined;
createEffect(() => {
const component = componentEl;
if (!component) return;
});
return (
<modus-wc-component ref={(el) => (componentEl = el)} />
);
Issue 5: Wrong Event Target
Symptoms: Can't access component properties, wrong value extracted.
Solution:
const handleInputChange = (event: Event) => {
const customEvent = event as CustomEvent<InputEvent>;
const value = (customEvent.target as HTMLModusWcTextInputElement).value;
props.onInputChange?.(value);
};
const handleInputChange = (event: Event) => {
const value = event.detail;
};
Issue 6: Multiple Event Listeners
Symptoms: Events fire multiple times, duplicate handlers.
Solution:
if (props.onEvent) {
component.addEventListener("eventName", handleEvent);
}
return () => {
if (props.onEvent) {
component.removeEventListener("eventName", handleEvent);
}
};
Debugging Checklist
When events aren't working, check:
-
Ref Setup
-
Event Listener Setup
-
Cleanup
-
Event Handling
Quick Fixes
Fix: Events Not Firing
- Check if ref is set:
console.log(componentEl)
- Verify event name: Check Modus docs
- Add console.log in handler to verify it's called
- Check if handler prop is passed
Fix: Events Firing Multiple Times
- Check if cleanup is removing listeners
- Verify handler isn't recreated on each render
- Ensure createEffect dependencies are correct
Fix: Wrong Values
- Verify event type casting
- Check if using
target.value vs detail
- For checkboxes, verify value inversion is handled
Related Files
src/components/ModusCheckbox.tsx - Event handling example
src/components/ModusDropdownMenu.tsx - Multiple events example
src/components/ModusNavbar.tsx - Complex event handling