【发布时间】:2020-04-08 22:04:05
【问题描述】:
我使用fullcalendar.io vue 扩展名。
我想钩入事件渲染来添加动作,但事件回调只包含 JS 元素。
有没有办法将vue组件注入其中?
<FullCalendar
ref="fullCalendar"
defaultView="dayGridMonth"
:firstDay="1"
:editable="true"
:draggable="true"
:timeZone="'UTC'"
:header="false"
:events="events"
:plugins="plugins"
@eventRender="eventRender"
/>
JS
import FullCalendar from '@fullcalendar/vue'
import dayGridPlugin from '@fullcalendar/daygrid'
import interactionPlugin from '@fullcalendar/interaction';
export default {
components: {
FullCalendar
},
data () {
return {
loader: false,
calendar: null,
plugins: [
dayGridPlugin, interactionPlugin
],
events: [
{"id":1,"start":"2019-11-25","end":"2019-11-27"},
{"id":2,"start":"2019-11-23","end":"2019-11-26"},
{"id":3,"start":"2019-11-22","end":"2019-11-25"},
{"id":4,"start":"2019-11-21","end":"2019-11-24"}
]
}
},
mounted() {
this.calendar = this.$refs.fullCalendar.getApi();
},
methods:{
eventRender(info){
console.log(info);
},
}
}
例如在eventRender 内部(这是需要的肮脏示例):
eventRender(info){
$(info.el).append('<component-name></component-name>');
}
更新
另一个解决方案是Vue.extend(不知道是否正确,有什么建议吗?):
添加外部组件:
<template>
<v-btn @click="click" :class="type">
<slot name="text"/>
</v-btn>
</template>
<script>
export default {
name: 'Button',
props: [
'type'
],
methods: {
click() {
this.$emit('click')
}
}
}
</script>
导入到需要的组件中
import Vue from "vue"
import Button from "./helpers/Button"
var ActionClass = Vue.extend(Button)
在渲染函数中使用props 和slot 到eventRender
eventRender(info){
let action = new ActionClass({
propsData: {
type: 'primary'
}
})
action.$slots.text = 'Click me!'
action.$mount()
action.$on('click', () => {
console.log(info);
});
info.el.appendChild(action.$el)
}
【问题讨论】:
-
Vue 是数据驱动的——创建一个组件并改变它的状态,比如:v-for="appended in appendables" ... 并在 eventRender 中推送到 appendables
-
@Estradiaz 感谢您的回复,这样将有 2 个日历,一个由
FullCalendar创建,第二个由v-for创建,eventRender事件是emited当元素渲染并准备就绪时修改。
标签: javascript vue.js vuejs2 fullcalendar vuetify.js