--- applyTo: "**" name: mobiscroll-ui-react description: | Mobiscroll React patterns — JSX components, render props, hooks, @mobiscroll/react imports. Invoked by mobiscroll-ui after framework detection. Do not auto-trigger — invoked by mobiscroll-ui only. --- # Mobiscroll — React Patterns > This skill is loaded by `mobiscroll-ui`. If you arrived here directly, invoke > `mobiscroll-ui` first to run environment detection and the mandatory schema lookup. Package: `@mobiscroll/react` CSS import: `import '@mobiscroll/react/dist/css/mobiscroll.min.css'` ## Initialization Pattern React uses JSX components with PascalCase names: ```jsx import { useState, useMemo } from 'react'; import { Eventcalendar } from '@mobiscroll/react'; function MyCalendar() { const [events, setEvents] = useState([]); const myView = useMemo(() => ({ scheduler: { type: 'week' } }), []); return ( { /* handle */ }} /> ); } ``` ## Key Conventions - Components are named exports: `Eventcalendar`, `Datepicker`, `Select`, `Popup`. - Props use camelCase: `data`, `view`, `selectedDate`, `onEventCreate`. - Event handlers are props prefixed with `on`: `onEventCreate`, `onCellClick`, `onPageChange`. - The `view` object should be memoized (via `useMemo`) to avoid unnecessary re-renders. - State management uses standard React hooks (`useState`, `useEffect`, `useMemo`, `useCallback`). - Controlled components: use `selectedDate` + `onSelectedDateChange` for controlled date state. ## Anti-Patterns | WRONG | RIGHT | |:---|:---| | `import * as mobiscroll from '@mobiscroll/react'` | `import { Eventcalendar } from '@mobiscroll/react'` | | `mobiscroll.eventcalendar('#el', {...})` imperative init | `` | | Inline `view` object: `view={{ scheduler: { type: 'week' } }}` | Memoized: `const v = useMemo(() => ({...}), [])` | | Using Angular `@Input()` or `@Output()` decorators | Use JSX props and `on*` event handlers | | `@mobiscroll/javascript` or `@mobiscroll/angular` imports | `@mobiscroll/react` only | ## Event Handling React event handlers receive an `args` object with event-specific data and an `inst` reference to the component instance: ```jsx { console.log(args.event); // the clicked event object console.log(args.domEvent); // the original DOM event }} /> ``` ## Rendering Customization Use render props (functions returning JSX) for custom rendering: ```jsx {/* v6: renderSchedulerEvent (v5: renderScheduleEvent — deprecated in v6) */} (
{data.title}
)} /> ``` > **v5 note:** `renderScheduleEvent` (without `r`) was the correct name in v5. In v6 it is > deprecated — use `renderSchedulerEvent` instead. The same rename applies to all > `*Content` variants. Always verify available render props via `mcp__mobiscroll__getComponentSchema`.