Vue
The Curi Plugin
The CuriPlugin for Vue allows you to interface your router with a Vue application. The plugin sets up a reactive object for tracking responses using an observer, so whenever there is a new response, the parts of your application that use the response will be re-rendered.
The plugin also makes the response accessible to every component in your application through the $curi property.
import Vue from "vue";
import { CuriPlugin } from "@curi/vue";
import router from "./router";
Vue.use(CuriPlugin, { router });Rendering with the response
Vue allows you to render dynamic components using the <component :is> syntax. If you set Vue components as the body properties on your responses, you can combine <component :is> and response.body to render the appropriate component for a response.
A root component is a good place to perform general application layout, like menus, in addition to rendering the response's body.
<template>
<header>
<NavLinks />
</header>
<main>
<component :is="$curi.response.body" />
</main>
</template>
<script>
import NavLinks from "./NavLinks";
export default {
components: { NavLinks }
};
</script>If your routes use an object to attach multiple components to a response, splitting them apart in computed properties may give your templates a cleaner look.
If you do attach multiple components to a response, please remember that you want every route to set the same body shape. Otherwise, you'll have to determine the shape and change how you render, which can quickly become messy.
<script>
let routes = prepareRoutes([
{
name: "Home",
path: "",
respond() {
return {
body: {
main: HomeMain,
menu: HomeMenu
}
}
}
},
// ...
]);
</script>
<template>
<header>
<component :is="menu" />
</header>
<main>
<component :is="main" />
</main>
</template>
<script>
export default {
computed: {
main() {
return this.$curi.response.body.main;
},
menu() {
return this.$curi.response.body.menu;
}
}
}
</script>In addition to the response, the current navigation object (the previous response and the navigation action) is globally available through $curi.navigation
The router is globally available as $router.
Accessibility
Managing the application's focus when navigating is useful for users who use screen readers. The curi-focus directive provides a convenient way to focus a page's main content when it renders a new response.
You can read some more about accessibility in the accessibility guide.
<template>
<header>
<NavLinks />
</header>
<main :tabIndex="-1" v-curi-focus="$curi.response">
<component :is="$curi.response.body" />
</main>
</template>
<script>
import NavLinks from "./NavLinks";
export default {
components: { NavLinks }
};
</script>Navigating
The curi-link component is used to navigate between routes within an application. When it renders in the DOM, it will render as an anchor (<a>) element.
The curi-link's name prop describes which route clicking the link should navigate to. If you pass an invalid route name, Curi will warn you.
If a route has any params (or if any of a route's ancestors have params for nested routes), the params prop is used to pass these to the curi-link.
<template>
<nav>
<ul>
<li>
<curi-link name="Home">Home</curi-link>
</li>
<li>
<curi-link name="About">About</curi-link>
</li>
<li>
<curi-link name="User" :params="{ id: 'blue' }">
Blue
</curi-link>
</li>
</ul>
</nav>
</template>The curi-link also takes hash, query, and state props to attach their values to the location that will be navigated to.
<curi-link name="Home" hash="details">Home</curi-link>
// renders
<a href="/#details">Home</a>Please check out the full @curi/vue API documentation to see every component that the package provides.