Skip to content

Vben Modal

Vben Modal is the shared modal wrapper used by the framework. It supports draggable behavior, fullscreen mode, auto-height handling, loading state, connected components, and an imperative API.

Basic Usage

ts
const [Modal, modalApi] = useVbenModal({
  // props
  // events
});

Current Usage Notes

  • If you use connectedComponent, the inner and outer components share data through modalApi.setData() and modalApi.getData().
  • When connectedComponent is present, avoid pushing extra modal props through the connected side. Prefer useVbenModal(...) or modalApi.setState(...).
  • Default modal behavior can be adjusted in apps/<app>/src/bootstrap.ts through setDefaultModalProps(...).

Shared Data Types

The recommended approach is to declare the data type once in the connected component and expose modalApi. The outer call then infers the data contract from connectedComponent:

ts
// Connected component
const [Modal, modalApi] = useVbenModal<EditData>();
defineExpose({ modalApi });

// Outer component, EditData is inferred
const [Modal, modalApi] = useVbenModal({
  connectedComponent: EditModal,
});

Use useVbenModal<EditData>() explicitly when the component type cannot expose the contract. For larger features, pre-bind one reusable contract in a separate module:

ts
export const useEditModal = createVbenModal<EditData>();

The precedence is explicit generic, connected component inference, then unknown. Plain SFCs support inference through defineExpose; generic SFCs, functional components, and components widened to Component should use an explicit generic or contract factory. getData() returns undefined before setData() is called. Include null or partial payloads in the data type when they are valid business values.

Key Props

PropDescriptionType
appendToMainmount inside the main content area instead of bodyboolean
connectedComponentconnect an inner component to the modal wrapperComponent
animationTypemodal enter/leave animation'slide' | 'scale'
fullscreenButtonshow or hide the fullscreen toggleboolean
overlayBlurblur amount for the overlaynumber
submittinglock modal interactions while submittingboolean

Events

EventDescriptionType
onBeforeClosecalled before close; returning false or rejecting prevents close() => Promise<boolean | undefined> | boolean | undefined
onOpenChangecalled when open state changes(isOpen: boolean) => void
onOpenedcalled after open animation completes() => void
onClosedcalled after close animation completes() => void

modalApi

MethodDescription
setState(...)updates modal state
open()opens the modal
close()closes the modal
setData(data: TData)stores typed shared data
getData()returns TData | undefined
lock(isLocked = true)locks the modal into submitting state
unlock()alias for lock(false)

Contributors

The avatar of contributor named as Dream Dream
The avatar of contributor named as xingyu4j xingyu4j

Changelog

Released under the MIT License.