美文网首页vue3
vue开发中遇到问题总结(2)

vue开发中遇到问题总结(2)

作者: Simple_Learn | 来源:发表于2019-09-30 09:08 被阅读0次
    1. 升级webpack4之后,插件 由 extract-text-webpack-plugin 变为 mini-css-extract-plugin
    const ExtractTextPlugin = require('extract-text-webpack-plugin')
    
    
    
        // generate loader string to be used with extract text plugin
        function generateLoaders(loader, loaderOptions) {
            const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
    
            if (loader) {
                loaders.push({
                    loader: loader + '-loader',
                    options: Object.assign({}, loaderOptions, {
                        sourceMap: options.sourceMap
                    })
                })
            }
    
            // Extract CSS when that option is specified
            // (which is the case during production build)
            if (options.extract) {
                          //通常路径表现为 ./static/img/static/img/*.jpg (定义为imgurl)
                          return ExtractTextPlugin.extract({
                            use: loaders,
                            publicPath: '../../', //注意: 此处根据路径, 自动更改 ,(imgurl='static/img/*.jpg')
                            fallback: 'vue-style-loader'
                          })
            } else {
                return ['vue-style-loader'].concat(loaders)
            }
        }
    
    const MiniCssExtractPlugin = require('mini-css-extract-plugin')
    
    
    
        // generate loader string to be used with extract text plugin
        function generateLoaders(loader, loaderOptions) {
            const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
    
            if (loader) {
                loaders.push({
                    loader: loader + '-loader',
                    options: Object.assign({}, loaderOptions, {
                        sourceMap: options.sourceMap
                    })
                })
            }
    
            // Extract CSS when that option is specified
            // (which is the case during production build)
            if (options.extract) {
                return [{
                        loader: MiniCssExtractPlugin.loader,
                        options: {
                            publicPath: '../../'
                        }
                    }].concat(loaders)
            } else {
                return ['vue-style-loader'].concat(loaders)
            }
        }
    
    1. 同时运行多个命令,使用 concurrently 工具包

    https://www.npmjs.com/package/concurrently 具体属性可以参照这里。

    scripts脚本如下:test就是执行两句命令的。

            "mock": "nodemon mocks/server.js",
            "dev": "webpack-dev-server --mode=development --inline --progress --config build/webpack.dev.conf.js",
            "start": "npm run dev",
            "test": "concurrently -r \"npm run dev\" \"npm run mock\" ",
    
    1. 页面表格数据由Excel导入
                    <div>
                        <el-button  type="primary" class="btn-out-effect" @click="upload()">上传文件</el-button>
                        <input v-show="false" type="file" @change="importExcel()"  ref="inputer"  multiple  accept=".xls, .xlsx"/>
                        <span>示例</span>
                    </div>
    

    使用这个xlsx工具包
    https://www.npmjs.com/package/xlsx

    
        import XLSX from "xlsx";
          upload() {
            this.$refs.inputer.value = ''; 
            const inputer= this.$refs.inputer.click();
          }
    
          //开始导入
         importExcel(e) {
            const obj = this.$refs.inputer;
            let _this=this;
            // 通过DOM取文件数据
            if(!obj.files) {
                return;
            } 
            const f = obj.files[0];
            let reader = new FileReader();
            reader.onload = function(e) {
                let data = e.target.result;
                if(this.rABS) {
                    this.wb = XLSX.read(btoa(fixdata(data)), {//手动转化
                        type: 'base64'
                    });
                } else {
                    this.wb = XLSX.read(data, {
                        type: 'binary'
                    });
                }
                /**
                 * wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
                 * wb.Sheets[Sheet名]获取第一个Sheet的数据
                 */
                let excelJson = XLSX.utils.sheet_to_json(this.wb.Sheets[this.wb.SheetNames[0]]);
                _this.tableData=excelJson;
            };
            if(this.rABS) {
                reader.readAsArrayBuffer(f);
            } else {
                reader.readAsBinaryString(f);
            }
        },
        //文件流转BinaryString
         fixdata(data) {
                let o = "",
                l = 0,
                w = 10240;
                for(; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + 
                    w)));
                        o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
                        return o;
        }
    
    1. 高德地图异步引入方法
    export default function mapLoader(key, plugins) {
        const p1 = new Promise(function(resolve, reject) {
            window.init = function() {
                resolve(AMap)
            };
            let script = document.createElement("script");
            script.type = "text/javascript";
            script.src = `//webapi.amap.com/maps?v=1.4.15&key=${key}&plugin=${plugins}&callback=init`;
            script.onerror = reject;
            document.head.appendChild(script);
        });
        const p2 = new Promise(function(resolve, reject) {
            let script2 = document.createElement("script");
            script2.type = "text/javascript";
            script2.src = "//webapi.amap.com/ui/1.0/main-async.js";
            script2.onerror = reject;
            script2.onload = function(su) {
                resolve('success')
            };
            document.head.appendChild(script2);
        });
        return Promise.all([p1, p2])
            .then(function(result) {
                return result[0]
            }).catch(e => {
                console.log(e);
            })
    };
    

    在生命周期create 中调用方法:

      created() {
        mapLoader(this.key, this.plugins)
          .then(AMap => {
            console.log("MP加载。。then。。。", AMap);
            initAMapUI(); //这里调用initAMapUI初始化
            this.loaderMap(); //加载地图
          })
          .catch(err => {
            this.loading = false;
            this.$message({
              message: "地图加载失败" + err,
              type: "error",
              duration: 3000
            });
            console.log("MP加载。。err。。。", err);
          });
      }
    
    1. 使用axios遇到的问题
      a. post的时候,使用query传值,会出现问题。
      postman截图:


      图片.png

      postman可以正常访问接口。

    经查证官方说明: https://www.npmjs.com/package/axios

    axios 使用 post 发送数据时,默认是直接把 json 放到请求体中提交到后端的。这就与服务端要求的 'Content-Type': 'application/x-www-form-urlencoded' 以及 @RequestParam 不符合。
    所以需要转格式。

    封装的ajax.js文件

    
    function ajax(method, args, ori) {
        args = Array.prototype.slice.call(args, 0);
        let url = args[0];
        let lc = url.indexOf('?') > 0 ? '&' : '?';
        args[0] = url + lc + '__ts=' + (new Date().getTime());
        return new Promise((resolve, reject) => {
            axios[method].apply(axios, args).then(function(response) {
                if (ori !== true) {
                    if (response.data.message === "success") {
                        resolve(response.data.data);
                    } else {
                        // console.log(response, '[fail]: ' + JSON.stringify(response.data), response.data.code);
                        resolve(response.data);
                    }
                } else resolve(response);
            }).catch((thrown) => {
                console.error('[error]', thrown, '从服务器获取数据发生错误!');
                reject(thrown);
            });
        });
    }
    
    export default {
        get: function() {
            return ajax('get', arguments);
        },
        post: function() {
            return ajax('post', arguments);
        },
        put: function() {
            return ajax('put', arguments);
        },
        delete: function() {
            return ajax('delete', arguments);
        },
        getOri: function() {
            return ajax('get', arguments, true);
        },
        postOri: function() {
            return ajax('post', arguments, true);
        },
        putOri: function() {
            return ajax('put', arguments, true);
        },
        deleteOri: function() {
            return ajax('delete', arguments, true);
        }
    }
    

    调用使用:

    ajax.post('/xxx/list', Qs.stringify(data), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
    

    Qs是axios库自带的。

    第二种:使用 URLSearchParams

    https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams

    这个不是所有的浏览器都支持URLSearchParams。具体可以在 https://www.caniuse.com/#feat=urlsearchparams
    这里查看。

    第三种 :后端接口修改
    服务端接收参数用的是 @RequestParam(通过字符串中解析出参数)
    修改成这个 @RequestBody(从请求体中获取参数)
    这样就能正常的接收json格式。

    6.换行符分隔符

    str.split(/\r?\n/)    //使用正则表达式进行分隔
    
    1. 关于vue遇到错误问题。

    a. 第一步,删除node_modules文件夹,从新npm install 或者 yarn install。

    b. 有可能在windows出现编译错误,通常是node-sass错误,获得是 node-gym。因为windows平台会出现缺少编译环境错误。

    1、先运行: npm install -g node-gyp
    2、然后运行:运行 npm install --global --production windows-build-tools
    可以自动安装跨平台的编译器:gym
    具体命令如下:

    npm install -g node-gyp
    
    npm install  --global --production windows-build-tools 
    

    c. 出现下载依赖缓慢的情况,可以将依赖包源头切换到淘宝镜像源

    查看 npm 配置 npm config list

    c1. 将 npm 源切换至淘宝源
    

    npm config set registry https://registry.npm.taobao.org
    c2. 通过 npm 全局安装 yarn
    npm install -g yarn
    如果执行 yarn 命令遇到报错,请将 npm bin -g 所得的路径添加至 PATH 环境变量中。

    查看 yarn 配置 yarn config list

    c1. 将 yarn 源切换至淘宝源
    

    yarn config set registry https://registry.npm.taobao.org
    c2. 执行 yarn install 或者 yarn
    具体命令如下:

    npm config set registry https://registry.npm.taobao.org
    或者
    yarn config set registry https://registry.npm.taobao.org
    

    相关文章

      网友评论

        本文标题:vue开发中遇到问题总结(2)

        本文链接:https://www.haomeiwen.com/subject/sdrcpctx.html