UNPKG

@form-create/core

Version:

FormCreate低代码表单渲染引擎,可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的低代码表单。支持6个UI框架,适配移动端,并且支持生成任何 Vue 组件。

101 lines (94 loc) 3.86 kB
import extend from '@form-create/utils/lib/extend'; import is from '@form-create/utils/lib/type'; import toLine from '@form-create/utils/lib/toline'; import {parseFn} from '../frame/util'; export default function useInject(Handler) { extend(Handler.prototype, { parseInjectEvent(rule, on) { const inject = rule.inject || this.options.injectEvent; return this.parseEventLst(rule, on, inject); }, parseEventLst(rule, data, inject, deep) { Object.keys(data).forEach(k => { const fn = this.parseEvent(rule, data[k], inject, deep); if (fn) { data[k] = fn; } }); return data; }, parseEvent(rule, fn, inject, deep) { if (is.Function(fn) && ((inject !== false && !is.Undef(inject)) || fn.__inject)) { return this.inject(rule, fn, inject) } else if (!deep && Array.isArray(fn) && fn[0] && (is.String(fn[0]) || is.Function(fn[0]))) { return this.parseEventLst(rule, fn, inject, true); } else if (is.String(fn)) { const val = parseFn(fn); if (val && fn !== val) { return val.__inject ? this.parseEvent(rule, val, inject, true) : val; } } }, parseEmit(ctx, on) { let event = {}, rule = ctx.rule, {emitPrefix, field, name, inject} = rule; let emit = rule[on ? 'emit' : 'nativeEmit'] || []; if (is.trueArray(emit)) { emit.forEach(eventName => { if (!eventName) return; let eventInject; let emitKey = emitPrefix || field || name; if (is.Object(eventName)) { eventInject = eventName.inject; eventName = eventName.name; emitKey = eventName.prefix || emitKey; } if (emitKey) { if (!on) emitKey = `native-${emitKey}`; const fieldKey = toLine(`${emitKey}-${eventName}`); const fn = (...arg) => { this.vm.$emit(fieldKey, ...arg); this.vm.$emit('emit-event', fieldKey, ...arg); }; fn.__emit = true; if (!eventInject && inject === false) { event[eventName] = fn; } else { let _inject = eventInject || inject || this.options.injectEvent; event[eventName] = is.Undef(_inject) ? fn : this.inject(rule, fn, _inject); } } }); } ctx.computed[on ? 'on' : 'nativeOn'] = event; return event; }, getInjectData(self, inject) { const {option, rule} = this.vm.$options.propsData; return { api: this.api, $f: this.api, rule, self: self.__origin__, option, inject }; }, inject(self, _fn, inject) { if (_fn.__origin) { if (this.watching && !this.loading) return _fn; _fn = _fn.__origin; } const h = this; const fn = function (...args) { const data = h.getInjectData(self, inject); data.args = [...args]; args.unshift(data); return _fn.apply(this, args); }; fn.__origin = _fn; fn.__json = _fn.__json; return fn; }, }) }