The files do not work like with handlers named onClick
.
If I rename it to clickAction
(and click-action=...
in DropZone.story.js
), it works and I see the action being called.
import Vue from "vue"; | |
import { storiesOf } from "@storybook/vue"; | |
import { action } from "@storybook/addon-actions"; | |
import DropZone from "./DropZone.vue"; | |
Vue.component("DropZone", DropZone); | |
storiesOf("DropZone", module) | |
.add("default", () => ({ | |
components: { DropZone }, | |
render() { | |
return <DropZone on-click={action("clicked on dropzone")} />; | |
} | |
})); |
<template> | |
<div :class="{[$style.root]: true, [$style.dragging]: dragging}" v-on:click.stop.prevent="onClick"> | |
<div :class="$style.adder"> | |
<span :class="$style.info">click here to create a new todo!</span> | |
</div> | |
</div> | |
</template> | |
<script> | |
export default { | |
props: ["dragging", "onClick"] | |
}; | |
</script> | |
<style lang="scss" module> | |
.root { | |
background: transparent; | |
position: relative; | |
height: 1px; | |
border-radius: 0.2em; | |
box-shadow: 0 0 0.1em; | |
width: 100%; | |
} | |
.adder { | |
position: absolute; | |
display: flex; | |
align-items: center; | |
justify-content: center; | |
top: -12px; | |
height: 25px; | |
width: 100%; | |
&:hover { | |
background-color: rgba($color-create, 1); | |
border-radius: 1em; | |
box-shadow: 0 0 1em rgba($color-create, 0.8); | |
.info { | |
display: block; | |
} | |
} | |
} | |
.info { | |
display: none; | |
} | |
</style> |
The "on-click" Problem:
I'm not completely sure, but I guess you can't pass "on-click" as a Property from parent to child component, since this is a registered handlers for vue tags: https://vuejs.org/v2/guide/render-function.html#The-Data-Object-In-Depth Therefore it's actually a event handlers, not a property
Communication between Parent and Child Components
So, now, why does the click handlers don't work (regardless is property or not) - I don't really know, but:
I would suggest to use an emit instead of passing a function from DropZone.story to DropZone. Of course it's basically just JavaScript and Vue allows you to pass functions between components. One problem is that you add knowledge to the partner-components which aren't really necassary.
You can add a click-handler in DropZone in the wrapping div and emit to the parent: Hey I was clicked:
and the parent listens on this emit-event:
(on-click won't work. The Emit Event should be called "clicked" or "was-clicked" or whatever you want)