我正在使用Laravel自定义组件,例如,我有:
components/input.blade.php
<input type="text" class="rounded">
注意:这只是一个简单的例子,关键部分在于我想要重复使用由blade模板生成的HTML。
现在,我可以创建一个具有范围插槽的Vue组件:
js/components/Search.vue
<template>
<div>
<slot name="search-input" />
</div>
</template>
<script>
export default {
methods: {
focus() {
console.log('focus input');
}
}
}
</script>
// ... and registering the component
// among others
Vue.component('search', require('js/components/Search'));
new Vue({
el: '#vue_app'
});
现在很好,我可以按以下方式使用我的组件:
views/somepage.blade.php
<search>
<template v-slot:search>
<x-input>
</template>
</search>
所有的工作都如预期一样, 然而正如你所看到的, 我有一个focus
方法, 当焦点在刀片输入上时我希望触发它.
现在我无法做到这一点:
js/components/Search.vue
<template>
<div>
<slot name="search-input" @focus="focus" />
</div>
</template>
<script>
export default {
methods: {
focus() {
console.log('focus input');
}
}
}
</script>
但我可以做到这一点:
js/components/Search.vue
<template>
<div>
<div ref="search-container"><slot name="search-input" /></div>
</div>
</template>
<script>
export default {
methods: {
mounted() {
this.$refs['search-container'].querySelector('input').addEventListener('focus', this.focus)
},
focus() {
console.log('focus input');
}
}
}
</script>
但我不确定在Vue组件中使用addEventListener
是否是最佳方法。
是否有更好的方法来实现我想要做的事情?
<a @click="doSomething()">
绑定点击监听器,如果能有一种类似的方式来绑定包含在插槽中的元素就好了。 - Ian Jamieson<a @click="doSomething">
。 - kissu