Вот один из способов.
Ваша оболочка без рендеринга будет состоять из одного action
(то есть, функции для выдачи запроса AJAX) prop.
Vue.component('renderless-action-wrapper', {
props: ['action'],
render() {
return this.$scopedSlots.default({
action: this.action,
});
},
});
Тогда другой компонент, который использует вышеупомянутую оболочку, будет заключать настраиваемый слот с обработчиком @click
, который вызывает действие, которое передается при запуске.
Vue.component('clickable', {
props: ['action'],
template: `
<renderless-action-wrapper :action="action">
<span slot-scope="{ url, action }">
<span @click="action()">
<slot name="action"></slot>
</span>
</span>
</renderless-action-wrapper>
`,
});
Наконец, подключите специализированную версию оболочки.
<clickable :action="doAjaxRequest">
<button type="button" slot="action">Button</button>
</clickable>
Вот живой пример вышеприведенного предложения, с которым вы можете поиграть.