asvae / vue-book

Tree view for your demo components
http://vue-book.asva.by/#/Demo/ContactComponent.vue
63 stars 11 forks source link

vue-book

Tree view for your demo components. Demo.

Interface

Install

Versions

You shouldn't worry about sitting on alpha version as vue-book doesn't have dependencies and will work for a very long time without issues.

Features

The gist

I'll talk a bit about demo based workflow I employ in my projects.

Before doing any work on component I create a demo. Demo allows me to define an interface, like this:

<my-new-component v-model="dataItem" :some-prop="prop"/>

Only then I start to work on component.

You can think of demo as of semi-manual unit tests. But why not use actual unit tests, you'll ask. Let me explain.

Of course, this doesn't mean that you have to dump unit tests. Just keep them for appropriate tasks. Like logic heavy classes.

So, back to the library. The main intent behind is simplifying demo workflow as much as possible. Just toss your demos into folder and enjoy tree generation.

Config

Attach VueComponentTree to your router. And yes, vue-router is required.

import Router from 'vue-router'
import { createRoute } from 'vue-book'

const router = new Router({
  routes: [
    createRoute({
      requireContext: require.context('./..', true, /.demo.vue$/), 
      path: '/demo',
      hideFileExtensions: true, // optional, hides file extensions in list.
      hideNavigation: true, // optional, hides navigation panel. Intended to be used with visual recognition library.
    }),
  ]
})

So, about arguments.

require.context('./../tree', true, /.vue$/), '/demo'

Here's the vue-cli3 demo project if something doesn't work for you.

Production

You don't have to keep demos in production. Use webpack define-plugin and exclude them from bundle.

if (process.env.NODE_ENV !== 'production') {
  const createRoute = require('vue-book').createRoute

  routes.push([
    createRoute({
      requireContext: require.context('./..', true, /.demo.vue$/), 
      path: '/demo',
    }),
  ])
}

Deploy

Use as component

You can use vue-book without router if you don't need it.

const getComponent = require('vue-book').getComponent

const DemoView = getComponent({
  requireContext: require.context('./..', true, /.demo.vue$/),
})

You can handle resulting DemoView the same as any other vue component.

Feedback | Support

Leave an issue if something doesn't work for you.

Also remember: Stars fuel package development!

Hooks

In component you can use beforeRouteUpdate. Common case is to reset some global service.

Helper components [WIP]

Vue book provides a bunch of helper components to simplify demo-building.

VbDemo

Root level container.

VbCard

You can consider this component as both 'card' and 'test-case'.

Props

State

state prop creates a scoped state for single card. That means you can create multiple cards, that use the same values, but they won't conflict. Intended as a substitute for declaring every prop in data.

<VbCard
  title="state example"
  :state="{value: false}"
  #default="{state}"
>
  <input type="checkbox" v-model="state.value">
</VbCard>

Install

import { VueBookComponents } from '../src/app'

Vue.use(VueBookComponents)

Component helpers

<VbDemo>
  <VbCard title="is active">
    <YourComponent is-active/>
  </VbCard>
</VbDemo>

Functional helpers:

<button @click="$vb.log('log', 'value')">Trigger log</button>
<button @click="$vb.alert('alert')">Trigger alert</button>
<div>Lorem text: {{ $vb.lorem() }}</div> 
<div>Lorem text of length: {{ $vb.lorem(5) }}</div>

Licence

MIT