mx-nav-bar.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <uv-navbar v-bind="bindings">
  3. <!-- slot 穿透 -->
  4. <template v-for="name in Object.keys($slots)" #[name]>
  5. <slot :name="name"/>
  6. </template>
  7. <template v-if="!$slots.center&&subTitle" #center>
  8. <view class="max-w-[400rpx] text-center" :style="bindings.titleStyle">
  9. <view class="truncate">{{ bindings.title }}</view>
  10. <view class="text-3xs font-normal truncate">{{ subTitle }}</view>
  11. </view>
  12. </template>
  13. </uv-navbar>
  14. </template>
  15. <script>
  16. import {computed} from 'vue';
  17. import {empty} from "@/uni_modules/uv-ui-tools/libs/function/test";
  18. import {navbarProps} from "@/uni_modules/uv-navbar/components/uv-navbar/uv-navbar.vue";
  19. import {useH5BackHome} from "@/components/mx-nav-bar/useH5BackHome";
  20. import {useTransfer} from "@/hooks/useTransfer";
  21. import {blockRunner, createPropDefine} from "@/utils";
  22. import {fnPlaceholder} from "@/utils/uni-helper";
  23. export default {
  24. name: 'mx-nav-bar',
  25. props: {
  26. ...navbarProps,
  27. mode: createPropDefine('light'),
  28. subTitle: createPropDefine(''),
  29. opacity: createPropDefine(1, Number),
  30. // 用于支持左图标点击的AOP方法,支持返回boolean或者promise
  31. leftClickBlock: createPropDefine(null, Function),
  32. // leftClick&leftIcon被mx-nav-bar自行控制了,如果要隐藏left,设置leftDisabled=true
  33. leftDisabled: createPropDefine(false, Boolean)
  34. },
  35. setup(props, {attrs}) {
  36. const {hasPreviousPage, shouldShowHome} = useH5BackHome()
  37. const {relaunch, transferBack} = useTransfer()
  38. const darkMode = computed(() => props.mode == 'dark')
  39. const lightMode = computed(() => props.mode == 'light')
  40. const bindings = computed(() => {
  41. const override = {...props, ...attrs}
  42. // 主题色适配
  43. if (darkMode.value) {
  44. override.bgColor = 'var(--primary-color)'
  45. override.titleStyle = {color: 'white', fontSize: '16px', fontWeight: 700}
  46. override.leftIconColor = 'white'
  47. } else {
  48. override.bgColor = '#ffffff'
  49. override.titleStyle = {color: 'var(--main-color)', fontSize: '16px', fontWeight: 700}
  50. override.leftIconColor = 'var(--content-color)'
  51. }
  52. if (props.opacity == 0) {
  53. override.bgColor = 'transparent'
  54. } else if (props.opacity < 1) {
  55. override.bgColor = uni.$uv.colorToRgba(override.bgColor, props.opacity)
  56. }
  57. if (!props.leftDisabled) {
  58. // 自行控制后退逻辑
  59. override.autoBack = false
  60. override.leftIconSize = 20
  61. if (hasPreviousPage.value) {
  62. override.leftIcon = 'arrow-left'
  63. if (empty(attrs.onLeftClick)) override.onLeftClick = handleNavBack
  64. } else if (shouldShowHome.value) {
  65. override.leftIcon = 'home'
  66. override.leftIconSize = 22
  67. if (empty(attrs.onLeftClick)) override.onLeftClick = handleHomeClick
  68. }
  69. } else {
  70. override.autoBack = false
  71. override.leftIcon = ''
  72. override.onLeftClick = fnPlaceholder
  73. }
  74. return override
  75. })
  76. async function handleNavBack() {
  77. await blockRunner(props.leftClickBlock)
  78. transferBack()
  79. }
  80. async function handleHomeClick() {
  81. await blockRunner(props.leftClickBlock)
  82. relaunch()
  83. }
  84. return {
  85. darkMode,
  86. lightMode,
  87. bindings
  88. }
  89. }
  90. }
  91. </script>
  92. <style scoped>
  93. </style>