사용자 정의 이벤트 을에서 의 지시어가 첨부 된 구성 요소 인으로 내보낼 수 있습니까?Vue.js - 지시문에서 이벤트 방출
예제에서 설명한대로 작동 할 것으로 예상했지만 그렇지 않습니다.
예 :
//Basic Directive
<script>
Vue.directive('foo', {
bind(el, binding, vnode) {
setTimeout(() => {
//vnode.context.$emit('bar'); <- this will trigger in parent
vnode.$emit('bar');
}, 3000);
}
});
</script>
//Basic Component
<template>
<button v-foo @bar="change">{{label}}</button>
</template>
<script>
export default{
data() {
return {
label: 'i dont work'
}
},
methods: {
change() {
this.label = 'I DO WORK!';
}
}
}
</script>
문제에 어떤 아이디어? 내가 놓친 게 있니?
JSFiddle : https://jsfiddle.net/0aum3osq/4/
업데이트 1 :
좋아, 내가 지시어에 (최신 뷰 버전 또는 fns()
) vnode.data.on.bar.fn();
를 호출하는 경우가 bar
이벤트 핸들러를 트리거 할 것으로 나타났습니다.
업데이트 2 :
임시 해결책 :
/*temp. solution*/
var emit = (vnode, name, data) => {
var handlers = vnode.data.on;
if (handlers && handlers.hasOwnProperty(name)) {
var handler = handlers[name];
var fn = handler.fns || handler.fn;
if (typeof fn === 'function') {
fn(data);
}
}
}
//Basic Directive
<script>
Vue.directive('foo', {
bind(el, binding, vnode) {
setTimeout(() => {
emit(vnode, 'bar');
}, 3000);
}
});
</script>
위대한 작품! 방출 함수 호출에 끝 대괄호가 없습니다. 편집을 시도했지만 SO는 6자를 편집해야한다고 말합니다. –
[email protected]v2.5에서'vnode.context. $ emit()'이이 예제에서 작동하지 않습니다. 어떻게 수정합니까? 하지만 방출 기능은 여전히 잘 작동합니다. –
내 경험상 이벤트가 전달 된 후에 만'vnode.context. $ emit ('name')'호출 할 수 있습니다 ... element.addEvenetListener ('click',() => { ) vnode.context . $ emit ('handleClick');}); ' 작품! 하지만 일반적인'vnode.context. $ emit ('handleClick')' 을 이벤트 트리거 외부에서 실행하면 실제로 emit이 제대로 호출되지 않으므로 수신 할 수 없습니다. 나는 틀릴 수도 있지만 [email protected]에서 방금 경험 한 것입니다. – djowinz