Skip to content

Vue Integration

WriteTrack provides a Vue 3 composable for easy integration with Vue applications.

Terminal window
npm i writetrack

Vue is an optional peer dependency - non-Vue users won’t have it in their bundle.

ResponseForm.vue
<script setup lang="ts">
import { ref } from 'vue';
import { useWriteTrack } from 'writetrack/vue';
const textareaRef = ref<HTMLTextAreaElement | null>(null);
const { tracker, isTracking } = useWriteTrack(textareaRef);
function handleSubmit() {
if (tracker.value) {
const data = tracker.value.getData();
console.log('Session data:', data);
}
}
</script>
<template>
<form @submit.prevent="handleSubmit">
<textarea ref="textareaRef" placeholder="Type your response..." />
<p v-if="isTracking">Tracking keystrokes...</p>
<button type="submit">Submit</button>
</form>
</template>
function useWriteTrack(
elementRef: Ref<HTMLElement | null>,
options?: UseWriteTrackOptions
): UseWriteTrackReturn;
ParameterTypeDescription
elementRefRef<HTMLElement>Vue ref attached to the input element
options.licensestringWriteTrack license key
options.userIdstringUser identifier included in metadata
options.contentIdstringContent identifier included in metadata
options.metadataRecord<string, unknown>Additional metadata
options.autoStartbooleanAuto-start tracking when element mounts (default: true)
options.wasmUrlstringURL to WASM binary for analysis
options.persistbooleanEnable IndexedDB session persistence (requires contentId)
PropertyTypeDescription
start() => voidStart tracking (if autoStart was false)
stop() => voidStop tracking
reset() => voidReset tracker and clear state
isTrackingRef<boolean>Whether tracker is active
trackerShallowRef<WriteTrack | null>Underlying WriteTrack instance
ControlledForm.vue
<script setup lang="ts">
import { ref } from 'vue';
import { useWriteTrack } from 'writetrack/vue';
const inputRef = ref<HTMLInputElement | null>(null);
const { start, stop, tracker, isTracking } = useWriteTrack(inputRef, {
autoStart: false,
});
function toggleTracking() {
if (isTracking.value) {
stop();
} else {
start();
}
}
</script>
<template>
<div>
<input ref="inputRef" type="text" />
<button @click="toggleTracking">
{{ isTracking ? 'Stop' : 'Start' }} Tracking
</button>
<button @click="() => tracker && console.log(tracker.getData())">
Get Data
</button>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { useWriteTrack } from 'writetrack/vue';
const nameRef = ref<HTMLInputElement | null>(null);
const emailRef = ref<HTMLInputElement | null>(null);
const messageRef = ref<HTMLTextAreaElement | null>(null);
// Track the main content field
const { tracker } = useWriteTrack(messageRef);
function handleSubmit() {
if (tracker.value) {
const data = tracker.value.getData();
console.log('Session:', data.quality);
}
}
</script>
<template>
<form @submit.prevent="handleSubmit">
<input ref="nameRef" placeholder="Name" />
<input ref="emailRef" placeholder="Email" />
<textarea ref="messageRef" placeholder="Message (tracked)" />
<button type="submit">Send</button>
</form>
</template>
import type { UseWriteTrackReturn, UseWriteTrackOptions } from 'writetrack/vue';