Events#

Handle user interactions with React-style event props.

Click Events#

<Button
    text="Click me"
    onClick={(e) => {
        console.log("Clicked at", e.x, e.y)
    }}
/>

Pointer Events#

Track pointer (mouse/touch) interactions:

<View
    style={{ width: 200, height: 200, backgroundColor: "#333" }}
    onPointerDown={(e) => console.log("Down", e.x, e.y)}
    onPointerUp={(e) => console.log("Up")}
    onPointerMove={(e) => console.log("Move", e.x, e.y)}
    onPointerEnter={(e) => console.log("Enter")}
    onPointerLeave={(e) => console.log("Leave")}
>
    <Label text="Hover and click me" />
</View>

Focus Events#

<TextField
    placeholder="Type here..."
    onFocus={(e) => console.log("Focused")}
    onBlur={(e) => console.log("Lost focus")}
/>

Change Events#

<TextField value={text} onChange={(e) => setText(e.value)} />
<Toggle value={on} onChange={(e) => setOn(e.value)} label="Enable" />
<Slider value={vol} lowValue={0} highValue={100} onChange={(e) => setVol(e.value)} />

Keyboard Events#

<TextField
    onKeyDown={(e) => {
        if (e.keyCode === CS.UnityEngine.KeyCode.Return) {
            console.log("Enter pressed!")
        }
    }}
/>

Event Propagation#

Events bubble up through the component tree. Use stopPropagation() to prevent this:

<View onClick={() => console.log("Parent")}>
    <Button
        text="Click"
        onClick={(e) => {
            e.stopPropagation()
            console.log("Only this handler runs")
        }}
    />
</View>

Pointer Capture#

Lock pointer events to a specific element — essential for reliable dragging. Without capture, fast pointer movement can leave the element's bounds and drop events.

useExtensions(CS.UnityEngine.UIElements.PointerCaptureHelper)

function Draggable({ children }) {
    const ref = useRef(null)
    const [pos, setPos] = useState({ x: 0, y: 0 })
    const startPos = useRef({ x: 0, y: 0 })

    return (
        <View
            ref={ref}
            style={{ position: "absolute", left: pos.x, top: pos.y }}
            onPointerDown={(e) => {
                ref.current.CapturePointer(e.pointerId)
                startPos.current = { x: e.x - pos.x, y: e.y - pos.y }
            }}
            onPointerMove={(e) => {
                if (ref.current.HasPointerCapture(e.pointerId)) {
                    setPos({
                        x: e.x - startPos.current.x,
                        y: e.y - startPos.current.y,
                    })
                }
            }}
            onPointerUp={(e) => ref.current.ReleasePointer(e.pointerId)}
        >
            {children}
        </View>
    )
}

useExtensions registers C# extension methods so they can be called on elements. See C# Interop — Extension Methods for details.

Other Events#

// Geometry — detect size/position changes
<View onGeometryChanged={(e) => console.log(e.newRect)} />

// Transitions — monitor USS animations
<View
    onTransitionEnd={(e) => console.log("Done:", e.styleProperty)}
/>

// Navigation — gamepad/keyboard UI navigation
<View
    onNavigationMove={(e) => console.log("Direction:", e.direction)}
    onNavigationSubmit={(e) => console.log("Submit")}
/>

// Mouse-specific (prefer pointer events for cross-device support)
<View
    onMouseDown={(e) => console.log("Mouse", e.button)}
    onWheel={(e) => console.log("Scroll", e.delta.y)}
/>

Event Object Properties#

Pointer / Mouse Event#

PropertyTypeDescription
typestringEvent type name
xnumberX position
ynumberY position
buttonnumberMouse button (0=left, 1=middle, 2=right)
pointerIdnumberUnique pointer identifier

Change Event#

PropertyTypeDescription
typestringEvent type name
valueTNew value (type depends on control)

Event Mapping Reference#

Click & Pointer#

React PropUI Toolkit Event
onClickClickEvent
onPointerDownPointerDownEvent
onPointerUpPointerUpEvent
onPointerMovePointerMoveEvent
onPointerEnterPointerEnterEvent
onPointerLeavePointerLeaveEvent
onPointerCancelPointerCancelEvent
onPointerCapturePointerCaptureEvent
onPointerCaptureOutPointerCaptureOutEvent
onPointerStationaryPointerStationaryEvent

Mouse#

React PropUI Toolkit Event
onMouseDownMouseDownEvent
onMouseUpMouseUpEvent
onMouseMoveMouseMoveEvent
onMouseEnterMouseEnterEvent
onMouseLeaveMouseLeaveEvent
onMouseOverMouseOverEvent
onMouseOutMouseOutEvent
onWheelWheelEvent
onContextClickContextClickEvent

Focus & Input#

React PropUI Toolkit Event
onFocusFocusEvent
onBlurBlurEvent
onFocusInFocusInEvent
onFocusOutFocusOutEvent
onChangeChangeEvent<T>
onInputInputEvent
onKeyDownKeyDownEvent
onKeyUpKeyUpEvent

Drag & Drop#

React PropUI Toolkit Event
onDragEnterDragEnterEvent
onDragLeaveDragLeaveEvent
onDragUpdatedDragUpdatedEvent
onDragPerformDragPerformEvent
onDragExitedDragExitedEvent

Layout & Transitions#

React PropUI Toolkit Event
onGeometryChangedGeometryChangedEvent
onTransitionRunTransitionRunEvent
onTransitionStartTransitionStartEvent
onTransitionEndTransitionEndEvent
onTransitionCancelTransitionCancelEvent
React PropUI Toolkit Event
onNavigationMoveNavigationMoveEvent
onNavigationSubmitNavigationSubmitEvent
onNavigationCancelNavigationCancelEvent
onTooltipTooltipEvent

Custom Rendering#

For custom drawing with onGenerateVisualContent, see the Vector Drawing guide.