vue项目遇到的问题总结

527 阅读3分钟

路由问题

addRoutes多次添加路由重复问题(参照vue-element-admin项目)

  1. router.js添加重置路由方法
import Vue from "vue";
import Router from "vue-router";

Vue.use(Router);

const createRouter = () =>
  new Router({
    mode: "hash",
    routes: []
  });
const router = createRouter();

export function resetRouter() {
  const newRouter = createRouter();
  router.matcher = newRouter.matcher; // reset router
}
export default router;

2. 在登出模块调用

import { resetRouter } from "@/router";

 Logout({ commit, state }) {
      return new Promise(resolve => {
        logout(state.token)
          .then(() => {
            commit("SET_TOKEN", "");
            commit("SET_ROLES", []);
            storage.remove(ACCESS_TOKEN);
            resetRouter();
            resolve();
          })
          .catch(() => {
            resolve();
          })
          .finally(() => {});
      });
    },

Cannot access 'constantRouterMap' before initialization

    // main.js 先后顺序问题
    import store from '@/common/store'
    import router from '@/common/router'

vue antd 问题

ant-design-vue Table设置scroll.x,当没有数据时表头显示不全,且没有滚动条

/deep/ .ant-table-content {
      .ant-table-scroll {
        .ant-table-placeholder {
          padding: 0 !important;
          border-top: none !important;
        }
      }
    }

antd-vue Table组件selectedRows翻页后不保留上一页已选

      <a-table
        size="default"
        rowKey="id"
        :columns="columns"
        :data="loadData"
        :rowSelection="{
          selectedRowKeys: selectedRowKeys,
          onChange: onSelectChange,
          onSelect:onSelect,
          onSelectAll:onSelectAll,
        }"
        :customRow="handleCheck"
      ></a-table>
<script>
export default {
  methods:{
    onSelectChange(selectedRowKeys, selectedRows) {
      this.selectedRowKeys = selectedRowKeys
      // this.selectedRows = selectedRows // 注释这里,交由下面onSelect,onSelectAll来操作
    },
    onSelect(record, selected, selectedRows) {
      if (selected) {
        this.selectedRows.push(record)
      }

      if (!selected) {
        const delIndex = this.selectedRows.findIndex(val => {
          return val.id === record.id
        })
        this.selectedRows.splice(delIndex, 1)
      }
    },
    onSelectAll(selected, selectedRows, changeRows) {
      if (selected) {
        this.selectedRows = this.selectedRows.concat(changeRows)
      }
      if (!selected) {
        let selectedRows = JSON.parse(JSON.stringify(this.selectedRows))
        const delIndex = []
        selectedRows.forEach((item, index) => {
          changeRows.forEach((val, itemIndex) => {
            if (item.id === val.id) {
              delIndex.push(index)
            }
          })
        })
        delIndex.forEach(item => {
          delete selectedRows[item]
        })
        selectedRows = selectedRows.filter(item => {
          return item !== undefined
        })
        this.selectedRows = selectedRows
      }
    }
  }
}
</script>

vue2 + vxe-table

合并行

 <vxe-table
      border
      resizable
      height="300"
      :scroll-y="{enabled: false}"
      :span-method="mergeRowMethod"
      :data="tableData">
      <vxe-table-column type="seq" width="60"></vxe-table-column>
      <vxe-table-column field="key" title="Key"></vxe-table-column>
      <vxe-table-column field="content" title="Translate"></vxe-table-column>
      <vxe-table-column field="language" title="Language" :filters="[{label: '中文', value: 'zh_CN'}, {label: 'English', value: 'en_US'}]"></vxe-table-column>
    </vxe-table>
...
mergeRowMethod ({ row, _rowIndex, column, visibleData }) {

      // 需要合并的行

      const fields = ['name']

      const cellValue = row[column.property]

      if (cellValue && fields.includes(column.property)) ) {

        const prevRow = visibleData[_rowIndex - 1]

        let nextRow = visibleData[_rowIndex + 1]

        if (prevRow && prevRow.id === row.id) {

          return { rowspan: 0, colspan: 0 }

        } else {

          let countRowspan = 1

          while (nextRow && nextRow.id === row.id) {

            nextRow = visibleData[++countRowspan + _rowIndex]

          }

          if (countRowspan > 1) {

            return { rowspan: countRowspan, colspan: 1 }

          }

        }

      }

    }

vue3 + vite

在开发环境时可以正常访问图片路径,打包部署到服务器上却显示路径undefined问题

// 获取assets静态资源 url '/home/home_icon.png'
export default  const getAssetsFile = (url: string) => {
   return new URL(`@/assets/images/${url}`, import.meta.url).href
}

 function getImageUrl(e: object) {
    const path = new URL('@/assets/img', import.meta.url);
    return `${path}/${e.url}.png`
  }

火狐不支持text-align: justify属性

语言设置: HTML 文档的语言设置可能会影响文本的对齐方式。如果文档的语言属性设置为非中文(例如 lang="en"),Firefox 可能会按照英文的排版规则来处理文本,这可能会导致 text-align: justify; 在中文文本中不起作用。你可以尝试将文档的语言属性设置为中文(lang="zh")来解决这个问题。

vue中引入字体无效

font-family: "" 引入的名称要和字体文件里面的命名一样和src不需要一样

@font-face {

  font-family: "时尚粗黑简体" !important;

  src: url('./SSCHJW.TTF') format(truetype);

  font-weight: normal; 

  font-style: normal; 

}

火狐低版本无滚动条

/* 通用滚动条样式 */

  ::-webkit-scrollbar { /* 对于Webkit内核的浏览器 */

      width: 10px; /* 滚动条宽度 */

  }

  ::-webkit-scrollbar-track { /* 滚动条轨道 */

      background-color: rgba(0, 0, 0, 0.1);

  }

  ::-webkit-scrollbar-thumb { /* 滚动条滑块 */

      background-color: rgba(0, 0, 0, 0.5);

      border-radius: 5px;

  }

  


  /* 特别针对Firefox的滚动条样式 */

  .scrollbar {

      -moz-appearance: none; /* 禁用默认滚动条样式 */

      width: 10px; /* 滚动条宽度 */

  }

  scrollbar-thumb {

      background-color: rgba(0, 0, 0, 0.5);

      border-radius: 5px;

      -moz-appearance: none; /* 禁用默认滚动条滑块样式 */

  }

  


  /* 为了确保滚动条在Firefox中的兼容性,可以使用以下实验性属性(需注意这可能不是所有版本Firefox都支持) */

  * {

      scrollbar-width: thin; /* 设置滚动条宽度 */

      scrollbar-color: rgba(0, 0, 0, 0.5) rgba(0, 0, 0, 0.1); /* 分别设置滚动条滑块和轨道的颜色 */

  }