popmotion-pose
Version:
A declarative animation library for HTML and SVG
210 lines (148 loc) • 4.44 kB
Markdown
---
title: Posed
description: Create a posed component with Pose for Vue
category: vue
---
# `posed`
`posed` is used to create animated and interactive components that you can reuse throughout your Vue site.
<TOC />
## Import
```javascript
import posed from 'vue-pose';
```
## Usage
### Create a posed component
`posed` can be used to create posed HTML and SVG elements.
It isn't called directly, instead we call it via the name of the element we want to create, along with a [posed component config](/pose/api/vue-config).
```
<template>
<Box :pose="isVisible ? 'visible' : 'hidden'" />
</template>
<script>
import posed from 'vue-pose';
export default {
props: ['isVisible'],
components: {
Box: posed.div({
visible: { opacity: 1 },
hidden: { opacity: 0 }
})
}
};
</script>
```
Every HTML and SVG element is supported.
### Set a pose
Poses can be set via the `pose` property.
```
<template>
<Box :pose="isVisible ? 'visible' : 'hidden'" />
</template>
```
### Children
Using a posed component creates a new tree of posed components. Any children that are also posed components are automatically added to this tree.
This means that orchestrating animations through React trees becomes trivial, as a pose only has to be set on a parent. Any children with that pose defined will also animate:
```
<template>
<Sidebar :pose="isVisible ? 'visible' : 'hidden'">
<ul>
<Item v-for={item in items} v-bind:key={item} />
</ul>
</Sidebar>
</template>
<script>
import posed from 'vue-pose';
export default {
props: ['isVisible', 'items'],
components: {
Sidebar: posed.nav({
open: { x: '0%', staggerChildren: 100 },
closed: { x: '-100%' }
}),
Item: posed.li({
open: { opacity: 1 },
closed: { opacity: 0 }
})
}
};
</script>
```
<CodeSandbox id="qq667ljpz4" height="500" vue />
### Styling
Posed components return regular HTML elements, so they can be used with any CSS styling solution.
## Props
### pose
`pose?: string`
The name of the current pose.
### preEnterPose
`preEnterPose?: string`
The name of a pose to set before the component mounts. If present, once the component mounts it will transition from this pose into `pose`.
### poseKey
`poseKey?: string | number`
If `poseKey` changes, it'll force the posed component to transition to the current `pose`, even if it hasn't changed.
This won't be required for the majority of use-cases. But we might have something like a paginated where we pass the x offset to the component but the pose itself doesn't change:
```
<template>
<Slider pose="nextItem" :poseKey="target" :target="target" >
</template>
<script>
import posed from 'vue-pose';
export default {
props: ['target'],
components: {
Slider: posed.div({
nextItem: {
x: ({ target }) => target
}
})
}
};
</script>
```
### withParent
`withParent?: boolean = true`
If set to `false`, this component won't subscribe to its parent posed component and create root for any further child components.
### onPoseComplete
`onPoseComplete?: Function`
A callback that fires whenever a pose has finished transitioning.
### onValueChange
`onValueChange?: { [key: string]: any }`
`onValueChange` is a map of functions, each corresponding to a value being animated by the posed component and will fire when that value changes.
### ...props
`...props: { [key: string]: any }`
When a new pose is entered, any remaining props set on a component will be used to resolve that pose's dynamic props:
```
<template>
<ul>
<Item
v-for={item in items}
v-bind:key={item}
:i={item}
:pose="isVisible ? 'visible' : 'hidden'"
/>
</ul>
</template>
<script>
import posed from 'vue-pose';
export default {
props: ['isVisible', 'items'],
components: {
Item: posed.li({
visible: { opacity: 1 },
hidden: {
opacity: 0,
y: ({ i }) => i * 50
}
})
}
};
</script>
```
## Events
The following events can be subscribed to with `v-on`:
### drag-start/drag-end
`drag-start/drag-end: (e: Event) => void`
Callbacks that fire when dragging starts or ends. **Note:** These props are immutable and can't be changed after mounting.
### press-start/press-end
`press-start/press-end: (e: Event) => void`
Callbacks that fire when pressing starts or ends. **Note:** These props are immutable and can't be changed after mounting.