zoukankan      html  css  js  c++  java
  • d2-admin中那些不错的技巧

    d2-admin基于vue-cli3

    路由相关

    刷新路由,参照官方  组件内的守卫 但是搞不明白为何加了句 render:h => h()

     {
            path: 'refresh',
            name: 'refresh',
            hidden: true,
            component: {
              beforeRouteEnter (to, from, next) {
                next(vm => vm.$router.replace(from.fullPath))
              },
              render: h => h()
            }
          }

    嵌套路由可以是一个立即执行函数

    children: (pre => [
            { path: 'page1', name: `${pre}page1`, component: () => import ('@/pages/demo/page1'), meta: {...meta, title: '页面 1' } },
            { path: 'page2', name: `${pre}page2`, component: () => import ('@/pages/demo/page2'), meta: {...meta, title: '页面 2' } },
            { path: 'page3', name: `${pre}page3`, component: () => import ('@/pages/demo/page3'), meta: {...meta, title: '页面 3' } },
            { path: 'page4', name: `${pre}page4`, component: () => import ('@/pages/demo/page4'), meta: {...meta, title: '页面 444444' } }
        ])('demo-')

    MOCK数据

    安装mock数据:

     在vue.config.js中,根据自定义的环境变量,来判断是否安装,默认.env文件,没有这个环境变量,则开发时,会加入模拟数据

    module.exports = {
        chainWebpack: config => {
    const entry = config.entry('app')
    if (process.env.VUE_APP_BUILD_MODE !== 'nomock') { entry .add('@/mock') .end() } } }

    关于config.entry请查看 使用 Webpack-chain 链式生成 webpack 配法
    新建一个扩展环境变量文件:.env.nomock

    # 指定构建模式
    NODE_ENV=production
    
    # 标记当前是 No Mock 构建
    VUE_APP_BUILD_MODE=nomock

    新建一个npm script,"build:nomock": "vue-cli-service build --mode nomock"
    则运行这个命令来打包的时候,不会加入mock数据

    mock安装结构

    根据上面vue.config.js中的设置,在根目录建立mock目录

    主目录index.js:

    import d2Mock from './d2-mock'
    
    const req = context => context.keys().map(context)
    const options = req(require.context('./api/', true, /.js$/))
      .filter(e => e.default)
      .map(e => e.default)
    
    options.forEach(option => {
      d2Mock.load(option)
    })

     使用webpack 的require.context 引入api目录中的mock数据文件, 并且得到所有默认的导出,返回新的数组
    然后使用封闭好d2Mock工具来加载并安装mock数据


    api目录中的文件
    这里面为每个独立的url拦截,文件名可独立命名,代码示例:

    export default [
        {
            path: '/api/getMockData',
            method: 'get',
            handle:  {
                "code":0,
                "msg":"正常",
                "count":300,
                "data|20":[
                    {
                        "tid":"@string(abcdefghijklmnopqrstuvwxyz1234567890, 30,30 )",
                        "wxunionid":"@string(abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ_, 28,28 )",
                        "timg":"@image('200x200')",
                        "eimg":"@image('400x400')",
                        "remark":"@cparagraph()",
                        "pay_date":"@datetime('yyyy-MM-dd')",
                        "title|3":"@ctitle",
                        "eid|1-10":0,
                        "totalFee|200-500":0,
                        "count|1-10":0,
                        "tbegin":"@datetime('yyyy-MM-dd')",
                        "tend":"@datetime('yyyy-MM-dd')",
                        "tstatus|1-4": 0
                    }
                ]
                }
            
        }
    ]

    直接使用mock.js的随机数据语法,注意,这里的get或post不能使用大写,否则无效

    d2-mock目录
    这里是d2-admin官方扩展的mock安装处理工具,先不去研究它在写什么,能用就好
    d2-mock/index.js:

    import Mock from 'mockjs'
    import qs from 'qs'
    import withCredentials from './patch/withCredentials'
    
    /* 补丁 */
    withCredentials(Mock)
    
    /* Mock 默认配置 */
    Mock.setup({ timeout: '200-300' })
    
    /* 扩展 [生成器] */
    const Generator = (prop, template) => {
      const obj = {}
      obj[prop] = [template]
      return Mock.mock(obj)
    }
    
    /* 扩展 [循环] */
    const Repeat = (num, itemTemplate) => Generator(`data|${num}`, itemTemplate).data
    
    const CustomExtends = {
      Generator,
      Repeat,
      Mock,
      Random: Mock.Random
    }
    
    const extend = (prop, value) => {
      CustomExtends[prop] = value
    }
    
    /* 装配配置组 */
    const wired = ({ url, type, body }) => ({
      method: type,
      params: qs.parse(url.split('?').length > 1 ? url.split('?')[1] : ''),
      body: JSON.parse(body),
      url: qs.parse(url.split('?')[0]),
      ...CustomExtends
    })
    const setup = (path, method, handle) => {
      Mock.mock(
        RegExp(path),
        method,
        typeof handle === 'function' ? o => handle(wired(o)) : handle
      )
    }
    const load = (collection) => {
      collection.map(({ path, method, handle }) => {
        if (method === '*') {
          method = [
            'get',
            'GET',
            'head',
            'post',
            'POST',
            'put',
            'delete',
            'connect',
            'options',
            'trace',
            'patch'
          ]
        }
    //下面的判断应该是用于同一个api路径使用了多种方法,比如 ['post','get'] ,或 'post|get'
    if (typeof method === 'string' && method.indexOf('|') > -1) method = method.split('|') if (method instanceof Array) { method.map(item => setup(path, item, handle)) } else { setup(path, method, handle) } }) } export default { setup, load, extend }

    这个文件中导出了一个对象,里面有3个方法, 试了一下,实际在mock/index.js中,只用到了load,用来加载mock详情,setup和extend并没在外部用到。

    最后执行的是setup方法,使用了mock.js的mock方法来安装,可参见官方说明

    d2-mock/patch/withCredentials.js
    这里一个补丁文件,用于修复mock请求时丢失cookes的问题,反正,也不知道在写什么。。

    export default function (Mock) {
      // http://cnine.me/note/FrontEnd/mock-lose-cookies-dbg.html
      Mock.XHR.prototype.__send = Mock.XHR.prototype.send
      Mock.XHR.prototype.send = function () {
        if (this.custom.xhr) this.custom.xhr.withCredentials = this.withCredentials || false
        this.__send.apply(this, arguments)
      }
    }

    全局使用lesssass变量

    这个属于vue-cli3的配置,官方地址

    // vue.config.js
    module.exports = {
      css: {
        loaderOptions: {
          // 给 sass-loader 传递选项
          sass: {
            // @/ 是 src/ 的别名
            // 所以这里假设你有 `src/variables.scss` 这个文件
            data: `@import "@/variables.scss";`
          }
        }
      }
    }
  • 相关阅读:
    selenium-元素无法定位解决办法
    OpenResty 最佳实践
    openresty 学习笔记小结:综合应用实例
    openresty 学习笔记六:使用session库
    openresty 学习笔记番外篇:python的一些扩展库
    openresty 学习笔记番外篇:python访问RabbitMQ消息队列
    openresty 学习笔记五:访问RabbitMQ消息队列
    openresty 学习笔记四:连接mysql和进行相关操作
    openresty 学习笔记三:连接redis和进行相关操作
    Grunt教程——初涉Grunt
  • 原文地址:https://www.cnblogs.com/vbyzc/p/10282908.html
Copyright © 2011-2022 走看看