Vroom is a store and api mock generator for Vue.js and pinia, that lets you build applications fast and even before backend is ready.
See the full documentation here.
To get started setup of a Vue 3 project with Pinia, e.g. using create-vue. In this guide we will
Vroom is built to work with Pinia and Vue 3. Vroom is targeted at modern browsers and uses the Fetch API instead of XMLHttpRequest.
Peer dependencies:
^3.0.0
^2.0.0
Note: Vroom is still in alpha, so breaking changes might be introduced between each minor release.
To install Vroom
Create a vroom/index.ts
file to store your configuration. This is a basic example that:
book
and author
and sets up a relation between them (Read more about models)// src/vroom/index.ts import { createVroom, defineModel } from "vue-vroom"; const vroom = createVroom({ models: { book: defineModel({ schema: { title: { type: String }, isFavourite: { type: Boolean }, }, belongsTo: { author: () => "author", }, }), author: defineModel({ schema: { name: { type: String }, }, hasMany: { books: () => "book", }, }), }, server: { enable: true, }, }); vroom.db.author.createMany( { name: "George R.R. Martin", books: vroom.db.book.createMany( { title: "A Game of Thrones" }, { title: "A Clash of Kings" }, ), }, { name: "JRR Tolkien", books: vroom.db.book.createMany( { title: "The Hobbit" }, { title: "The Lord of the rings" }, ), }, ); export type Models = typeof vroom.types; export default vroom;
It is recommended to split up models, config and seeds for better organisation and bundle optimization. See notes on organisation here
3. Add global component declarationsVroom adds some global components. To get proper type hints on these add a components.d.ts
file to your /src
folder.
// src/components.d.ts import type { FetchListComponent, FetchSingleComponent, FetchSingletonComponent, } from "vue-vroom"; import type vroom from "@/vroom"; declare module "@vue/runtime-core" { export interface GlobalComponents { FetchList: FetchListComponent<typeof vroom>; FetchSingle: FetchSingleComponent<typeof vroom>; FetchSingleton: FetchSingletonComponent<typeof vroom>; } }
Then import your vroom instance in main.ts
file along with your pinia installation and install it
import { createApp } from "vue"; import { createPinia } from "pinia"; import vroom from "./vroom"; import App from "./App.vue"; const pinia = createPinia(); const app = createApp(App); app.use(pinia); app.use(vroom); app.mount("#app");
Find a place you want to show some data e.g. App.vue
and add the following
<template> <FetchList model="book" :sort="[{ field: 'title', dir: 'ASC' }]" :include="['author']" > <template #loading>Loading books...</template> <template #default="{bookItems}"> <p v-for="book in bookItems" :key="book.id"> {{ book.title }} was written by {{ book.author.name }} </p> </template> </FetchList> </template> <script lang="ts" setup></script>
FetchList
component will in this example trigger a call to /books?sort=title,include=author
There are three different components for fetching data
Let's update the example above to be able to favourite a book
<template> <FetchList model="book" :sort="[{ field: 'title', dir: 'ASC' }]" :include="['author']" > <template #loading>Loading books...</template> <template #default="{bookItems}"> <p v-for="book in bookItems" :key="book.id"> {{ book.title }} was written by {{ book.author.name }} <button @click="toggleFavorite(book)"> {{ book.isFavourite ? 'Unfavourite' : 'Favourite' }} </button> </p> </template> </FetchList> </template> <script lang="ts" setup> import vroom, { type Models } from '@/vroom'; const bookStore = vroom.stores.book(); function toggleFavourite(book: Models['book']) { bookStore.update(book.id, { isFavourite: !book.isFavourite }) } </script>
This example uses the autogenerated store (all accessible on vroom.stores
). Calling update will trigger a called to PATCH /books/:id
along with data passed as the second argument
Contributions are most welcome 🙌
To contribute:
main
with your feature (and try to keep it small)main
branch.RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4