Cascader.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <template>
  2. <div class="hc-header-cascader-box">
  3. <div class="project-name-box">
  4. {{ projectInfo?.projectAlias }} / {{ contractInfo?.name }}
  5. </div>
  6. <el-cascader
  7. ref="ElCascaderRef"
  8. v-model="contractId" class="hc-header-cascader"
  9. :clearable="userInfo?.role_id === '1123598816738675201'"
  10. :filterable="userInfo?.role_id === '1123598816738675201'"
  11. :options="projectContract"
  12. :props="projectProps" placeholder="请选择项目"
  13. @change="projectContractChange"
  14. />
  15. </div>
  16. </template>
  17. <script setup>
  18. import { onMounted, ref, watch } from 'vue'
  19. import { useAppStore } from '~src/store'
  20. import { initProjectContract } from '~sto/app'
  21. import { isNullES } from 'js-fast-way'
  22. //事件
  23. const emit = defineEmits(['change', 'send'])
  24. //状态
  25. const store = useAppStore()
  26. const userInfo = ref(store.getUserInfo)
  27. const projectProps = ref({
  28. value: 'id',
  29. label: 'projectAlias',
  30. children: 'contractInfoList',
  31. })
  32. //项目合同段
  33. const projectContract = ref(store.projectContract)
  34. const projectInfo = ref(store.projectInfo)
  35. const contractInfo = ref(store.contractInfo)
  36. const contractId = ref(store.contractId)
  37. //监听
  38. watch(() => [
  39. store.projectContract,
  40. store.projectInfo,
  41. store.contractInfo,
  42. store.projectId,
  43. store.contractId,
  44. ], ([arr, project, contract, pid, cid]) => {
  45. projectContract.value = arr
  46. projectInfo.value = project
  47. contractInfo.value = contract
  48. contractId.value = cid
  49. setSend(pid, cid)
  50. })
  51. //渲染完成
  52. onMounted(async () => {
  53. await initProjectContract()
  54. setSend(store.projectId, store.contractId)
  55. })
  56. const setSend = (pid, cid) => {
  57. if (isNullES(pid) || isNullES(cid)) {
  58. return
  59. }
  60. emit('send', {
  61. projectId: pid,
  62. contractId: cid,
  63. })
  64. }
  65. //项目被选择
  66. const ElCascaderRef = ref(null)
  67. const projectContractChange = (val) => {
  68. if (val) {
  69. const Nodes = ElCascaderRef.value.getCheckedNodes()
  70. const UserProjectInfo = Nodes[0].parent.data
  71. const UserContractInfo = Nodes[0].data
  72. //缓存项目数据
  73. store.setProjectId(val[0])
  74. store.setContractId(val[1])
  75. store.setProjectInfo(UserProjectInfo)
  76. store.setContractInfo(UserContractInfo)
  77. //更改界面更新
  78. projectInfo.value = UserProjectInfo
  79. contractInfo.value = UserContractInfo
  80. window.$message?.info('切换了项目,数据更新中')
  81. emit('send', {
  82. projectId: val[0],
  83. contractId: val[1],
  84. })
  85. emit('change')
  86. }
  87. }
  88. </script>
  89. <style lang="scss">
  90. .hc-header-cascader-box {
  91. position: relative;
  92. margin-right: 20px;
  93. .project-name-box {
  94. position: relative;
  95. max-width: 340px;
  96. padding-right: 20px;
  97. overflow: hidden;
  98. z-index: -1;
  99. height: 1px;
  100. }
  101. .el-cascader.hc-header-cascader {
  102. width: 100%;
  103. .el-input .el-input__wrapper {
  104. border-radius: 104px;
  105. height: 28px;
  106. }
  107. }
  108. }
  109. </style>