Migrating to v4
In v3 there was no Vue package - the docs handed you a directive and composable to copy into your own project. v4 replaces those with the official @foresightjs/vue package. Install it, delete your copied files, and update a couple of names.
Install the package and delete your hand-rolled vForesight.ts / useForesight.ts:
npm install @foresightjs/vue
Directive
- import { vForesight } from "@/directives/vForesight"
+ import { vForesight } from "@foresightjs/vue"
app.directive("foresight", vForesight)
The usage in your templates is unchanged.
Composable
The composable lost the templateRefKey string. Instead it returns an elementRef function you bind directly:
- import { useForesight } from "./composables/useForesight"
+ import { useForesight } from "@foresightjs/vue"
- const { templateRef } = useForesight({ templateRefKey: "myButton", callback })
+ const { elementRef } = useForesight({ callback })
- <button ref="myButton">Hover</button>
+ <button :ref="elementRef">Hover</button>
You also get the reactive state back as refs instead of a registerResults object.
Core changes
The core js.foresight library also has a few breaking changes. The package handles most of these for you, but they matter if you call register() or listen to events directly.
The register() call itself is unchanged, but element data is now an immutable state snapshot you can subscribe to - the foundation the wrapper packages are built on:
ForesightElementDatais nowForesightElementState. Your callback receives the flat state snapshot:callback: (state: ForesightElementState) => void. See TypeScript.register()returns the state plusunregister,subscribeandgetSnapshot.isTouchDeviceis gone from the result; touch devices are handled internally by the configuredtouchDeviceStrategyglobal setting.- The
elementDataUpdated,elementOptionsUpdatedandelementReactivatedevents are removed. Per-element changes are now observed through thesubscribe/getSnapshotpair returned byregister(). The remaining events carry the state in astatefield instead ofelementData. - Detached elements are parked, not unregistered. Removing an element from the DOM no longer emits
elementUnregisteredwith reasondisconnected; the element stays registered but inactive and resumes when it reconnects. - New
enabledelement option. Set it tofalseto keep an element registered but excluded from prediction.