【发布时间】:2021-07-22 22:38:51
【问题描述】:
我正在使用Laraval自定义组件,例如我有:
components/input.blade.php
<input type="text" class="rounded">
注意:这是一个简单的例子,这里的关键部分是我想重用刀片模板生成的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 是不是最好的方法。
有没有更好的方法来实现我想要做的事情?
【问题讨论】:
-
所以在第二部分中,您将安装它并直接访问实际上是组件一部分的输入字段,这就是它起作用的原因。那么,您是否试图将注意力集中在页面呈现本身上?
-
@Adi,它按预期工作,但是,我只是质疑这是否是最佳实践。对我来说,这感觉像是一种解决方法。通常我会通过
<a @click="doSomething()">绑定一个点击监听器,如果有一个类似的方法来绑定到一个插槽中包含的元素会很好。 -
如果您不希望函数在初始渲染时运行,请优先使用
<a @click="doSomething">。
标签: php laravel vue.js laravel-blade