UNPKG

uni-render-logic

Version:

uni-app renderjs 逻辑层和视图层跨层调用 mixin

1 lines 10 kB
{"version":3,"sources":["../src/utils/common.ts","../src/mixins/logic.ts","../src/mixins/render.ts","../src/index.ts"],"names":["createRandomId","length","id","restLength","defineComponent","logic_default","jobs","job","status","key","params","res","err","data","ref","watch","render_default","index","resolve","reject","message","currentJob","item","value","src_default"],"mappings":"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","sourcesContent":["/**\r\n * 创建id\r\n *\r\n * @param length 长度\r\n * @returns\r\n */\r\nexport const createRandomId = (length: number): string => {\r\n const id = Math.random()\r\n .toString(16)\r\n .slice(2, length + 2)\r\n const restLength = length - id.length\r\n if (!restLength) {\r\n return id\r\n }\r\n return `${id}${createRandomId(restLength)}`\r\n}\r\n","import type { Job } from '@/types/job'\r\nimport { createRandomId } from '@/utils/common'\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n data() {\r\n return {\r\n jobMap: new Map<string, Job>()\r\n }\r\n },\r\n methods: {\r\n /**\r\n * 创建id\r\n *\r\n * @returns\r\n */\r\n createId: () => `id_${createRandomId(8)}`,\r\n /**\r\n * 分配任务\r\n *\r\n * @param jobs\r\n */\r\n dispatchJob(jobs: Job[]) {\r\n jobs.forEach((job) => {\r\n const { id, status } = job\r\n if (this.jobMap.has(id) || status !== 'init') {\r\n return\r\n }\r\n this.jobMap.set(id, job)\r\n this.handleJob(job)\r\n })\r\n },\r\n /**\r\n * 处理任务\r\n *\r\n * @param jobs\r\n * @returns\r\n */\r\n async handleJob(job: Job) {\r\n const { key, params } = job\r\n if (!(key in this)) {\r\n job.status = 'fail'\r\n job.message = 'job key error'\r\n this.emitJob(job)\r\n return\r\n }\r\n\r\n // @ts-ignore\r\n if (typeof this[key] === 'function') {\r\n try {\r\n // @ts-ignore\r\n const res = await this[key](params)\r\n job.status = 'success'\r\n job.data = res\r\n this.emitJob(job)\r\n } catch (err: any) {\r\n job.status = 'fail'\r\n job.message = err.message\r\n this.emitJob(job)\r\n }\r\n return\r\n }\r\n\r\n // @ts-ignore\r\n this[key] = params\r\n job.status = 'success'\r\n this.emitJob(job)\r\n },\r\n /**\r\n * 触发任务更新\r\n *\r\n * @param this\r\n * @param job\r\n * @returns\r\n */\r\n emitJob(job: Job) {\r\n // @ts-ignore\r\n if (!this.$ownerInstance) {\r\n return\r\n }\r\n this.jobMap.delete(job.id)\r\n // @ts-ignore\r\n this.$ownerInstance.callMethod('receiveJob', job)\r\n },\r\n /**\r\n * 触发事件\r\n *\r\n * @param data\r\n * @returns\r\n */\r\n emitEvent(...data: [string, ...any[]]) {\r\n // @ts-ignore\r\n if (!this.$ownerInstance) {\r\n return\r\n }\r\n // @ts-ignore\r\n this.$ownerInstance.callMethod('receiveEvent', data)\r\n },\r\n /**\r\n * 触发数据更新\r\n *\r\n * @param data\r\n * @returns\r\n */\r\n emitData(...data: [string, any]) {\r\n // @ts-ignore\r\n if (!this.$ownerInstance) {\r\n return\r\n }\r\n // @ts-ignore\r\n this.$ownerInstance.callMethod('receiveData', data)\r\n },\r\n /**\r\n * 触发方法\r\n *\r\n * @param data\r\n * @returns\r\n */\r\n emitMethod(...data: [string, ...any[]]) {\r\n // @ts-ignore\r\n if (!this.$ownerInstance) {\r\n return\r\n }\r\n // @ts-ignore\r\n this.$ownerInstance.callMethod('receiveMethod', data)\r\n }\r\n }\r\n})\r\n","import type { Job } from '@/types/job'\r\nimport { createRandomId } from '@/utils/common'\r\nimport { defineComponent, ref, watch } from 'vue'\r\n\r\nexport default defineComponent({\r\n data() {\r\n return {\r\n jobs: <Job[]>[]\r\n }\r\n },\r\n methods: {\r\n /**\r\n * 创建id\r\n *\r\n * @returns\r\n */\r\n createId: () => `id_${createRandomId(8)}`,\r\n /**\r\n * 创建任务\r\n * \r\n * @param key\r\n * @returns\r\n */\r\n createJob(key: string, params?: any) {\r\n const id = this.createId()\r\n const job = ref<Job>({\r\n id,\r\n key,\r\n status: 'init',\r\n message: '',\r\n data: undefined,\r\n params\r\n })\r\n return job\r\n },\r\n /**\r\n * 删除任务\r\n *\r\n * @param id\r\n * @returns\r\n */\r\n removeJob(id: string) {\r\n const index = this.jobs.findIndex((job) => job.id === id)\r\n if (index === -1) {\r\n return\r\n }\r\n this.jobs.splice(index, 1)\r\n },\r\n /**\r\n * 添加任务\r\n *\r\n * @param key\r\n * @returns\r\n */\r\n addJob<T = any, K = any>(key: string, params?: K) {\r\n const job = this.createJob(key, params)\r\n this.jobs.push(job.value)\r\n return new Promise<T>((resolve, reject) => {\r\n watch(\r\n () => job.value.status,\r\n () => {\r\n const { status, id, message, key, data } = job.value\r\n if (status === 'init') {\r\n return\r\n }\r\n if (status === 'success') {\r\n this.removeJob(id)\r\n resolve(<T>data)\r\n return\r\n }\r\n if (status === 'fail') {\r\n this.removeJob(id)\r\n reject(new Error(`${key} failed: [${message}]`))\r\n return\r\n }\r\n }\r\n )\r\n })\r\n },\r\n /**\r\n * 接收任务\r\n *\r\n * @param job\r\n */\r\n receiveJob(job: Job) {\r\n const currentJob = this.jobs.find((item) => item.id === job.id)\r\n if (!currentJob) {\r\n return\r\n }\r\n currentJob.data = job.data\r\n currentJob.message = job.message\r\n currentJob.status = job.status\r\n },\r\n /**\r\n * 接收事件\r\n *\r\n * @param data\r\n */\r\n receiveEvent(data: [string, ...any[]]) {\r\n this.$emit(...data)\r\n },\r\n /**\r\n * 接收数据\r\n *\r\n * @param data\r\n */\r\n receiveData(data: [string, any]) {\r\n const [key, value] = data\r\n if (key in this) {\r\n // @ts-ignore\r\n this[key] = value\r\n return\r\n }\r\n throw new Error(`${key} is not a property`)\r\n },\r\n /**\r\n * 接收方法\r\n *\r\n * @param data\r\n */\r\n receiveMethod(data: [string, ...any[]]) {\r\n const [key, ...value] = data\r\n // @ts-ignore\r\n if (key in this && typeof this[key] === 'function') {\r\n // @ts-ignore\r\n this[key](...value)\r\n return\r\n }\r\n throw new Error(`${key} is not a function`)\r\n }\r\n }\r\n})\r\n","import logicMixin from './mixins/logic'\r\nimport renderMixin from './mixins/render'\r\n\r\nexport { logicMixin, renderMixin }\r\nexport default {\r\n logicMixin,\r\n renderMixin\r\n}\r\n"]}