封装在 shadowDOM 中的 vue 实例中的活动事件
Active events in vue instance encapsulated inside shadowDOM
我正在搜索从封装在 shadowDOM 中的 vue 实例触发事件。
目前,我的代码在 shadowDOM 中创建一个新的 Vue 实例并打印没有样式的模板(因为 nuxt 在基本 vue 实例中加载样式)。
我可以调用每个实例的方法
但是,当我尝试在我的组件上添加事件/侦听器时,它不起作用。
DOM.vue
<template>
<section ref='shadow'></section>
</template>
<script>
import bloc from '@/components/bloc.vue'
import Vue from 'vue'
export default {
data() {
return {
vm: {},
shadowRoot: {},
isShadowReady: false
}
},
watch: {
isShadowReady: function() {
let self = this
this.vm = new Vue({
el: self.shadowRoot,
components: { bloc },
template: "<bloc @click='listenClick'/>",
methods: {
listenClick() { console.log("I clicked !") },
callChild() { console.log("I'm the child !") }
},
created() {
this.callChild()
self.callParent()
}
})
}
},
mounted() {
const shadowDOM = this.$refs.shadow.attachShadow({ mode: 'open' })
this.shadowRoot = document.createElement('main')
shadowDOM.appendChild(this.shadowRoot)
this.isShadowReady = true
},
methods: {
callParent() {
console.log("I'am the parent")
},
}
}
</script>
bloc.vue
<template>
<div>
<p v-for='word in words' style='text-align: center; background: green;'>
{{ word }}
</p>
</div>
</template>
<script>
export default {
data() {
return {
words: [1,2,3,4,5,6]
}
}
}
</script>
有什么想法吗?
谢谢
bloc @click.native='listenClick'/>
您好,在看了您的代码后,我认为最好使用 $emit
将事件从子级传递给父级,我认为它比 @click.native
[=14 更优化=]
template: "<bloc @someevent='listenClick'/>",
<template>
<div @click="listenClickChild">
<p v-for='(word, idx) in words' :key="idx" style='text-align: center; background: green;'>
{{ word }}
</p>
</div>
</template>
<script>
export default {
data() {
return {
words: [1,2,3,4,5,6]
}
},
methods: {
listenClickChild() {
this.$emit('someevent', 'someValue')
}
}
}
</script>
我正在搜索从封装在 shadowDOM 中的 vue 实例触发事件。
目前,我的代码在 shadowDOM 中创建一个新的 Vue 实例并打印没有样式的模板(因为 nuxt 在基本 vue 实例中加载样式)。
我可以调用每个实例的方法
但是,当我尝试在我的组件上添加事件/侦听器时,它不起作用。
DOM.vue
<template>
<section ref='shadow'></section>
</template>
<script>
import bloc from '@/components/bloc.vue'
import Vue from 'vue'
export default {
data() {
return {
vm: {},
shadowRoot: {},
isShadowReady: false
}
},
watch: {
isShadowReady: function() {
let self = this
this.vm = new Vue({
el: self.shadowRoot,
components: { bloc },
template: "<bloc @click='listenClick'/>",
methods: {
listenClick() { console.log("I clicked !") },
callChild() { console.log("I'm the child !") }
},
created() {
this.callChild()
self.callParent()
}
})
}
},
mounted() {
const shadowDOM = this.$refs.shadow.attachShadow({ mode: 'open' })
this.shadowRoot = document.createElement('main')
shadowDOM.appendChild(this.shadowRoot)
this.isShadowReady = true
},
methods: {
callParent() {
console.log("I'am the parent")
},
}
}
</script>
bloc.vue
<template>
<div>
<p v-for='word in words' style='text-align: center; background: green;'>
{{ word }}
</p>
</div>
</template>
<script>
export default {
data() {
return {
words: [1,2,3,4,5,6]
}
}
}
</script>
有什么想法吗?
谢谢
bloc @click.native='listenClick'/>
您好,在看了您的代码后,我认为最好使用 $emit
将事件从子级传递给父级,我认为它比 @click.native
[=14 更优化=]
template: "<bloc @someevent='listenClick'/>",
<template>
<div @click="listenClickChild">
<p v-for='(word, idx) in words' :key="idx" style='text-align: center; background: green;'>
{{ word }}
</p>
</div>
</template>
<script>
export default {
data() {
return {
words: [1,2,3,4,5,6]
}
},
methods: {
listenClickChild() {
this.$emit('someevent', 'someValue')
}
}
}
</script>