0.6.0 • Published 3 years ago

@crishellco/vue-renderless-party v0.6.0

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

Vue Renderless Party

Build npm.io npm.io npm.io npm.io Maintainability

A collection of useful Vue renderless components.

Check out the demo

Install

yarn add -D @crishellco/vue-renderless-party
# or
npm i -D @crishellco/vue-renderless-party
import VueHubble from '@crishellco/vue-renderless-party';

Usage

Importing

Vue Plugin

import Vue from 'vue';
import VueRenderlessParty from '@crishellco/vue-renderless-party';

Vue.use(VueRenderlessParty);

Named Imports

import {
  RenderlessEvent,
  RenderlessFunction,
  RenderlessPaginate,
  RenderlessSearch,
  RenderlessSort,
  RenderlessState,
  RenderlessToggle
} from '@crishellco/vue-renderless-party';

export default {
  components: {
    RenderlessEvent,
    RenderlessFunction,
    RenderlessPaginate,
    RenderlessSearch,
    RenderlessSort,
    RenderlessState,
    RenderlessToggle
  }
};

The Components

RenderlessEvent

<renderless-event
  event="mouseover"
  @mouseover="someMethod"
>
  <button>Hover over me!</button>
</renderless-event>
Props
NameDescriptionTypeRequiredDefault
eventThe event to listen toStringYes
outsideListen for the even only outside of the default slot elementsBooleanNofalse
Events
NameDescriptionPayload
Same as the event propFired when the event happens.--

RenderlessFunction

<div v-for="num in 10">
  <renderless-function :fn="() => alert(num)">
    <button slot-scope="{ fn }" @click="fn">Click me!</button>
  </renderless-function>
</div>
Props
NameDescriptionTypeRequiredDefault
fnThe functionFunctionYes
Slot Scope
NameDescriptionType
fnThe functionfunction

RenderlessPaginate

<div v-for="num in 10">
  <renderless-paginate :list="states" :size="15">
    <div slot-scope="{ page, next, prev, pageNum, totalPages, isFirst, isLast, rangeStart, rangeEnd }">
      <button
        :disabled="isFirst"
        @click="prev"
      >
        prev
      </button>
      <div class="px-4 flex flex-col items-center">
        <div>Page: {{ pageNum }}/{{ totalPages }}</div>
        <div>Showing: {{ rangeStart }} - {{ rangeEnd }} of {{ states.length }}</div>
      </div>
      <button
        :disabled="isLast"
        @click="next"
      >
        next
      </button>
    </div>
  </renderless-paginate>
</div>
Props
NameDescriptionTypeRequiredDefault
sizePage sizeNumberYes
listThe items to paginateArrayYes
Slot Scope
NameDescriptionType
isFirstIf currently on first pageBoolean
isLastIf currently on last pageBoolean
nextGo to next pageFunction
pageThe current pageany
pageNumThe current page numberNumber
prevGo to previous pageFunction
rangeEndThe end of the current pageNumber
rangeStartThe start of the current pageNumber
resetReset the state of paginationFunction
totalPagesTotal number of pagesNumber

RenderlessSearch

<renderless-search :list="states" :term="term" :keys="['name', 'email']">
  <div slot-scope="{ results }">
    <div v-for="(item, index) in results" :key="index">
      {{ item }}
    </div>
  </div>
</renderless-search>
Props
NameDescriptionTypeRequiredDefault
keysThe keys to search inArrayNoIf list is Array then all of the first object's keys. Otherwise [].
listThe list to searchArray<String, Object>Yes
termThe terms to search forStringNo''
Slot Scope
NameDescriptionType
resultsThe searched listArray<String, Object>

RenderlessSort

<renderless-sort :list="people" :by="by" :direction="direction" >
  <div slot-scope="{ results }">
      <div v-for="(item, index) in results" :key="index">
        {{ item }}
      </div>
  </div>
</renderless-sort>
Props
NameDescriptionTypeRequiredDefault
listThe list to searchArrayYes
directionThe direction to sort in, 'asc' or 'desc'StringNo'asc'
byThe object property to sort byStringNo''

RenderlessState

<renderless-state :value="{ count: 0 }">
  <div slot-scope="{ state, update }">
    <button @click="update({count: state.count + 1})">
      Increment ({{ state.count }})
    </button>
  </div>
</renderless-state>
Props
NameDescriptionTypeRequiredDefault
valueThe state objectObjectYes
Slot Scope
NameDescriptionType
stateThe stateObject
update(newValue)Merges newValue with the current stateFunction
Events
NameDescriptionPayload
inputFired when state updatesstate

RenderlessToggle

<renderless-toggle :value="true">
  <div slot-scope="{ isOn, on, off, toggle }">
    <div>
      <span>Accordion header</span>
      <span @click="toggle">{{ isOn ? '▲' : '▼' }}</span>
    </div>
    <div v-if="isOn">
      Accordion content
    </div>
    <div>
      <button @click="on">Open</button>
      <button @click="off">Close</button>
    </div>
  </div>
</renderless-toggle>
Props
NameDescriptionTypeRequiredDefault
valueThe state of the toggleBooleanNoFalse
Slot Scope
NameDescriptionType
isOnThe state of the toggleBoolean
on()Sets isOn to trueFunction
off()Sets isOn to falseFunction
toggle()Toggles isOnFunction
Events
NameDescriptionPayload
inputFired when isOn updatesisOn

Examples

See the demo source code for real-world examples. Check out the demo to see the components in action with code examples.

Lint

yarn lint

Test

yarn test:unit

Build Dist

yarn build

Run Demo

yarn serve

Build Demo

yarn build:demo

How to Contribute

Pull Requests

  1. Fork the repository
  2. Create a new branch for each feature or improvement
  3. Send a pull request from each feature branch to the develop branch

License

MIT

0.6.0

3 years ago

0.3.0

3 years ago

0.2.0

3 years ago

0.5.0

3 years ago

0.4.0

3 years ago

0.1.0

3 years ago