usePaperFullCondition.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import {createEventHook, injectLocal, provideLocal} from "@vueuse/core";
  2. import {getPaperBatches, getPaperKnowledges, getPaperSubjects} from "@/api/dz/papers.js";
  3. import {watch} from "vue";
  4. const key = Symbol('PaperFullCondition')
  5. export const useProvidePaperFullCondition = function () {
  6. const batchId = ref('')
  7. const batchList = ref([])
  8. const subjects = ref([])
  9. const subjectId = ref('')
  10. const knowledges = ref([])
  11. const knowledgeNode = ref(null) // 单选节点
  12. const knowledgeCheckNodes = ref([]) // 多选的节点
  13. const knowledgeIds = computed(() => knowledgeCheckNodes.value.map(k => k.id))
  14. const knowledgeId = computed(() => knowledgeNode.value?.id || '')
  15. const knowledgeRemoveEvent = createEventHook()
  16. const removeKnowledge = async (k) => {
  17. const nodes = knowledgeCheckNodes.value
  18. const idx = nodes.indexOf(k)
  19. if (idx > -1) {
  20. nodes.splice(idx, 1)
  21. await knowledgeRemoveEvent.trigger(k)
  22. }
  23. }
  24. const payload = {
  25. batchId, batchList, subjectId, subjects,
  26. knowledges, knowledgeId, knowledgeNode, knowledgeCheckNodes, knowledgeIds,
  27. removeKnowledge, onKnowledgeRemove: knowledgeRemoveEvent.on
  28. }
  29. provideLocal(key, payload)
  30. onMounted(async () => {
  31. const res = await getPaperSubjects()
  32. subjects.value = res.data
  33. // 给一个默认值
  34. if (res.data.length) subjectId.value = res.data[0].subjectId
  35. })
  36. onMounted(async () => {
  37. const res = await getPaperBatches()
  38. batchList.value = res.data
  39. })
  40. watch(subjectId, async (subjectId) => {
  41. // 先清空以前的知识点
  42. knowledges.value = []
  43. knowledgeNode.value = null // 单选的情况
  44. knowledgeCheckNodes.value = [] // 多选的情况
  45. // 获取知识点数据
  46. const res = await getPaperKnowledges({subjectId})
  47. knowledges.value = res.data
  48. })
  49. return payload
  50. }
  51. export const useInjectPaperFullCondition = function () {
  52. return injectLocal(key)
  53. }