shrinkable-menu.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <template>
  2. <div :style="{ background: bgColor }" class="ivu-shrinkable-menu">
  3. <slot name="top"></slot>
  4. <sidebar-menu
  5. v-show="!shrink"
  6. :menu-theme="theme"
  7. :menu-list="menuList"
  8. :open-names="openNames"
  9. @on-change="handleChange"
  10. ></sidebar-menu>
  11. <sidebar-menu-shrink
  12. v-show="shrink"
  13. :menu-theme="theme"
  14. :menu-list="menuList"
  15. :icon-color="shrinkIconColor"
  16. @on-change="handleChange"
  17. ></sidebar-menu-shrink>
  18. </div>
  19. </template>
  20. <script>
  21. import sidebarMenu from "./components/sidebarMenu.vue";
  22. import sidebarMenuShrink from "./components/sidebarMenuShrink.vue";
  23. import util from "@/libs/util";
  24. export default {
  25. name: "shrinkableMenu",
  26. components: {
  27. sidebarMenu,
  28. sidebarMenuShrink,
  29. },
  30. props: {
  31. shrink: {
  32. type: Boolean,
  33. default: false,
  34. },
  35. menuList: {
  36. type: Array,
  37. required: true,
  38. },
  39. theme: {
  40. type: String,
  41. default: "dark",
  42. validator(val) {
  43. return util.oneOf(val, ["dark", "light"]);
  44. },
  45. },
  46. beforePush: {
  47. type: Function,
  48. },
  49. openNames: {
  50. type: Array,
  51. },
  52. },
  53. computed: {
  54. bgColor() {
  55. return this.theme === "dark" ? "#495060" : "#fff";
  56. },
  57. shrinkIconColor() {
  58. return this.theme === "dark" ? "#fff" : "#495060";
  59. },
  60. },
  61. methods: {
  62. handleChange(name) {
  63. let willpush = true;
  64. if (this.beforePush !== undefined) {
  65. if (!this.beforePush(name)) {
  66. willpush = false;
  67. }
  68. }
  69. if (willpush) {
  70. this.$router.push({
  71. name: name,
  72. });
  73. }
  74. this.$emit("on-change", name);
  75. },
  76. },
  77. };
  78. </script>