vue项目运行问题

1、引入less less-loader运行后报错:

原因:less less-loader 版本太高,与 webpack 不匹配

方法一:降低less-loader版本

    npm uninstall less-loader
 
    # npm install less@3.9.0  less-loader@5.0.0 -s
    npm install less-loader@5.0.0

方法二:在 package.json 文件中将 less less-loader 的版本手动降低,然后运行 yarn install 命令或 npm install 命令

2、less文件中引入图片做背景图报错:

原因:图片路径解析不正确

方法: 将以下代码:

background-image: url('@/assets/images/login.png');

改为

background-image: url('~@/assets/images/login.png');
3、Vue-cli 中为单独页面设置背景图片铺满全屏的方法

让#logo脱离文档流,为他添加个fixed属性

    <template>
        <div id="logo">
        </div>
    </template>
    <script>
        import meadiaurl from '../../api/mediaurl'
        export default {
            name: "logo"
    </script>
 
    <style scoped>
        #logo{
            background: url("../../assets/images/Login.png");
            background-size: 100% 100%;
            height: 100%;
            position: fixed;
            width: 100%
        }
    </style>
4、Vue中H5实现左右滑动
    <div @touchstart="moveStart" @touchmove="onMove" @touchend="moveEnd"></div>
    data(){
        return {
            startX: 0, // 触摸起始x
            startY: 0, // 触摸起始y
            endX: 0, // 触摸结束x
            endY: 0, // 触摸结束y
            canMove: true, // 是否可以继续滑动
            index: 0 // 控制滑动下标
        }
    }
    methods(){
        moveStart(e) {
          this.startX = e.targetTouches[0].pageX
          this.startY = e.targetTouches[0].pageY
        },
        onMove(e) {
          this.endX = e.targetTouches[0].pageX
          this.endY = e.targetTouches[0].pageY
          const dValueX = Math.abs(this.startX - this.endX)
          const dValueY = Math.abs(this.startY - this.endY)
          if (dValueX > dValueY) {
            // 水平滑动长度大于纵向滑动长度,那么选择水平滑动,阻止浏览器默认左右滑动事件
            e.preventDefault()
            if (dValueX > 40 && this.startX > this.endX) {
              // 向左划
              if (this.index < this.list.length - 1 && this.canMove) {
                this.canMove = false
                this.index += 1
              }
            } else if (dValueX > 40 && this.index > 0 && this.canMove) {
              this.canMove = false
              this.index -= 1
            }
          } else {
              // 恢复默认事件
            window.event.returnValue = true
          }
        },
        moveEnd(e) {
          this.canMove = true
          this.startX = this.endX = 0
          this.startY = this.endY = 0
        },    
    }
5、h5+vue页面下滑查看更多 页面触底+页面滑动

(1)、解决方法1 超过一屏监听滚动 触底触发 小于或等于一屏监听触摸 上滑触发

    data() {
        return {
            startY: 0,
            endY: 0,
            Fullscreen: true
        };
    },

(2)、添加触摸事件

    <div @touchstart="touchstart()" @touchend="touchend()"></div>
    //事件
    touchstart() {
          if (!this.Fullscreen) {
            return;  //判断 可视化的高度与溢出的距离 是否大于一屏  Fullscreen满屏
          }
          event.preventDefault(); //阻止默认事件(长按的时候出现复制)
          this.startY = event.changedTouches[0].pageY;
          console.log(this.startY);
    },
    touchend() {
          if (!this.Fullscreen) {
            return;
          }
          event.preventDefault();
          this.endY = event.changedTouches[0].pageY;
          if (this.startY - this.endY > 200) {
            console.log(this.endY);
            console.log(this.startY);
            //达到条件触发事件
            this.onscroll();
          }
    },

(3)、监听页面滚动

    mounted() {
        window.addEventListener("scroll", this.getScroll);
        
        let windowHeight =  document.documentElement.clientHeight || document.body.clientHeight; //变量windowHeight是 可视区的高度
        let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight; //变量scrollHeight是 滚动条的总高度 /可视化的高度与溢出的距离(总高度)
        
        if (windowHeight < scrollHeight) {
          this.Fullscreen = false;//是否满屏
        }
    },
    destroyed() {
        window.removeEventListener("scroll", this.getScroll);
    },
    
    //监听滚动
    getScroll() {
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //变量scrollTop是滚动条滚动时,距离顶部的距离
        let windowHeight = document.documentElement.clientHeight || document.body.clientHeight; //变量windowHeight是 可视区的高度
        let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight; //变量scrollHeight是 滚动条的总高度 /可视化的高度与溢出的距离(总高度)
        
        console.log(scrollTop, windowHeight, scrollHeight);
        //滚动条到底部的条件
        if (scrollTop + windowHeight >= scrollHeight) {
        //触发事件
        }
    }
6、获取div内容宽度、高度
    //注意获取宽度、高度的元素不能采用flex布局,否则获取不到真是的宽度、高度值
    
    let width = this.$refs.tab.clientWidth
    
    let height = this.$refs.tab.offsetHeight
7、margin-top设置百分比

margin-top设置百分比时,所占比例是按照所占 父元素宽度 的百分比,而不是高度

8、css自定义虚线样式
    .volumeLine{
        position: relative;
        width: 100%;
        height: 3px;
        background-image: linear-gradient(to right, #7D6C69 0%, #7D6C69 50%, transparent 50%);
        background-size: 20px 3px;
        background-repeat: repeat-x;
    }
9、Vue中使用西瓜player
https://v2.h5player.bytedance.com/gettingStarted/#%E5%AE%89%E8%A3%85

(1)、首先安装 xgplayer

    //安装xgplayer  视频播放器
    cnpm install xgplayer -D
    cnpm install xgplayer-hls -D
    cnpm install xgplayer-hls.js -D
    
    //安装xgplayer  音频播放器
    cnpm install xgplayer-music -D

(2)、在应用的.vue文件中引入视频、音频文件

    //音频
    import 'xgplayer';
    import Music from 'xgplayer-music';
    
    //视频
    import 'xgplayer';
    import HlsJsPlayer from 'xgplayer-hls.js'
    import Player from 'xgplayer'
    import { play, fullscreen, progress } from 'xgplayer/dist/controls';

(3)、在data中添加player字段、并在方法中渲染

    export default {
      name: 'readVideo',
      data(){
        return {
          player:'',
        }
      },
      mounted(){
        this.getDetail()
      },
      methods:{
        //渲染视频、音频
        getDetail(){
            //渲染视频
            this.player = new HlsJsPlayer( { //设置视频
                id: 'videoPlaying',
                useHls: true,
                url: that.courseUrl+this.meltDetail.videoPath,
                poster: res.data.data.cover ? that.coverUrl(res.data.data.cover) : that.courseUrl+res.data.data.imgPath,
                playsinline: true,
                width:'100%',
                height:'100%',
             })
            
            //渲染音频
            this.player = new Music({
                id: 'audioPlaying',
                url: 'https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/music/audio.mp3',
                width: '100%',
                height: '12%',
                volumeShow:true,
            })
        },
        
        //返回或跳转到其他页面,将本页面的player数据删除
        meltBacking(){
            let isDelDom = true
            this.player.destroy(isDelDom)
            this.$router.go(-1);
        },
        meltHome(){
            let isDelDom = true
            this.player.destroy(isDelDom)
            this.$router.push({ path:'/' })
        }
      }
    }

(4)、修改默认样式

    /*音频、视频默认样式修改*/
    .videoPlay,
    .meltVideo{
      .xgplayer-skin-default .xgplayer-progress-played{
        background-image: linear-gradient(-90deg,#F8A00D,#F8A00D);
      }
      .xgplayer-skin-default .xgplayer-drag{
        background: #F8A00D!important;
      }
    }
    
    .audioPlay,
    .meltAudio{
      .xgplayer-cover,.xgplayer-name,.xgplayer-backward,.xgplayer-forward,
      .xgplayer-next,.xgplayer-prev,.xgplayer-icon-play svg,.xgplayer-icon svg{ //隐藏上一曲下一曲以及播放图标
        display: none;
      }
      .xgplayer-skin-default, .xgplayer-skin-default .xgplayer-controls{//整体背景
        background: #36181A!important;
        border-radius: 0 !important;
        border: none;
      }
      .xgplayer-skin-default.xgplayer-music .xgplayer-controls .xgplayer-progress{//播放条
        top: 48%;
      }
      .xgplayer-skin-default.xgplayer-music .xgplayer-controls .xgplayer-time{//时间
        top: 30%;
        right: 20px;
        margin-left: 60px;
      }
      .xgplayer-skin-default .xgplayer-progress-outer{//进度条
        background: #C2B7AD !important;
      }
      .xgplayer-skin-default .xgplayer-progress-played{//进度条
        background: #F8A00D !important;
      }
      .xgplayer-skin-default.xgplayer-music .xgplayer-controls .xgplayer-play, 
      .xgplayer-skin-default.xgplayer-music .xgplayer-controls .xgplayer-play-img{
        margin-left: 20px;
        margin-top: 2px;
      }
      .svgcommon(@width,@height){
        width: @width !important;
        height: @height !important;
        background:url('~@/assets/img/article/icon-play.png') no-repeat center;    
        background-size:  100% 100%;
        margin-top: 2px;
      }
      .xgplayer-skin-default.xgplayer-music .xgplayer-controls .xgplayer-icon{ /* 播放按钮位置 */
        padding-top: 2px;
      }
      .xgplayer-icon-play{/* 播放 */
        .svgcommon(20px,28px);
        background:url('~@/assets/img/article/icon-play.png') no-repeat center;    
      }
      .xgplayer-icon-pause{/* 暂停 */
        .svgcommon(28px,28px);
        background:url('~@/assets/img/article/icon-pause.png') no-repeat center; 
      }
      .xgplayer-icon-large,.xgplayer-icon-small,.xgplayer-icon-muted{/* 音量 */
        .svgcommon(26px,24px);
        background:url('~@/assets/img/article/icon-shengyin.png') no-repeat center;    
      }
      .xgplayer-skin-default .xgplayer-drag{
        background: #F8A00D;
      }
      .xgplayer-skin-default.xgplayer-music .xgplayer-controls .xgplayer-volume{
        order: 10;
        margin-right: 40px;
        margin-top: -4px;
      }
      .xgplayer-skin-default .xgplayer-time span{
        color: #fff !important;
      }
    }
    

(5)、具体播放参数,参照官网修改即可

10、vue项目:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location

问题:

Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: "/operate/examinationScore".

解决办法:

项目中安装:npm i vue-router@3.0 -S

在main.js中输入:

    import Router from 'vue-router'

    const originalPush = Router.prototype.push
    
    Router.prototype.push = function push(location) {
      return originalPush.call(this, location).catch(err => err)
    }
11、页面中input标签添加.native修饰符报错

The .native modifier for v-on is only valid on components but it was used on

事件的native修饰符只能在组件上使用,原生的html标签是不能使用的,这是因为我在input标签使用了native修饰符。

12、Vue中将毫秒转换成时分秒格式
    filters:{
        realFormatsecond(second) {
            let secondType = typeof second
                if (secondType ==='number' || secondType ==='string'){
                    second = parseInt(second/1000)
                    let hours =Math.floor (second / 3600) 
                    second = second - hours *3600
                    let mimute =Math.floor(second /60)
                    second = second- mimute *60
                    return hours +':'+ ('0' + mimute).slice(-2) +':'+ ('0' + second).slice(-2) 
                } else{
                    return '0:00:00'
            }
        }
    },
13、flex布局 justify-content:space-between; 布局问题

(1)、原本按照正常排序对齐,左后一排缺少元素,两边对齐了

解决方案:使用after伪类,解决最后一排数量不够两端分布的情况。宽度就是每张图片的宽度

    .list{
        width:100%;
        height:500px;
        display:flex;
        justify-content:space-between;
    }
    .list:after {
        content: "";
        width: 1.87rem;
     }

(2)、flex布局的元素会有默认间隙(垂直间隙)

解决方案:使用 align-content:flex-start 解决

    .list {
        width: 100%;
        display: flex;
        justify-content: space-between;
        flex-flow: row wrap;
        margin: 0 0.53rem;
        padding-bottom: 0.67rem;
        align-content: flex-start; // 解决flex布局的元素会有默认间隙(垂直间隙)
        li {
            img {
                width: 1.87rem;
                height: 1.87rem;
                margin-top: 0.67rem;
            }
        }
    }
    .list:after {
        content: "";
        width: 1.87rem;
    }
}
14、vue项目布局问题

(1)、首先依据设计图,拆分模块,找出哪些是公用的,哪些是可以单独写在页面中的,然后依据结构布局,划分组件

(2)、最开始布局设计图时,可以依据规划好的组件结构,虚构一些假数据,研究好数据和样式如何布局

(3)、虚构好数据就可以先布局页面了,之后再请求接口,渲染真实数据,前期工作一定要规划好

15、前端页面高亮显示
<template>
  <div class="commonComponentStyle">
    <div class="rcMessage">
      <div class="rc-search">
        <div class="rc-search-content">
          <input type="text" v-model="searchVal" @keyup.enter="searchLight" @input="searchLight">
          <div class="lookFor">
            <img src="@/assets/img/article/search.png" alt="搜索" @click="searchLight">
          </div>
        </div>
      </div>
    </div>
    
    <div class="articleDetail" ref="articleDetailSize" v-html="articleDetail.text" v-if="isText"></div>
    <div class="articleDetail" ref="articleDetailSize" v-html="articleHighDetail.text" v-if="!isText"></div>
    
  </div>
</template>
<script>
import { articleDetailAPI } from '@/api/home/index'
export default {
  props:['articleDetail'],
  data(){
    return {
      searchVal:null,
      articleHighDetail:{},
      isText:true,
    }
  },
  methods:{
    delHtmlTag(str){
      if(str){
        return str.replace(/<[^>]+>/g,"");
      }
    },
    addHtmlTag(str){
      if(str){
        return str.replace(/\n/g,"<p class='content'>");
      }
    },
    searchLight(){
      if(this.searchVal&&this.searchVal.trim()){
        this.isText = false
        this.articleHighDetail = JSON.parse(JSON.stringify(this.articleDetail));
        this.changeTxtContent(this.searchVal)
        this.$nextTick(()=>{
          document.getElementById("maodian").scrollIntoView();
        })
      }else{
        this.isText = true
      }
    },
    changeTxtContent(obj){
      var str = this.articleHighDetail.text;
      let start = 0,end=0,current =1,str2,temp,pos;
      end= pos = str.indexOf(obj);
      let strlength = obj.length;
      while(end > start){
          if(str.charAt(end) == '<' ){
            current = 1;
            break;
          };
          if(str.charAt(end) == '>'){
            temp = str.slice(pos);
            temp = temp.replace(obj,"<span style='color:#f65e03;' id='maodian'>"+obj+"</span>")
                console.log(temp)
            str = str.slice(0,pos) + temp
            current = strlength + 32
            break;
          }
          current = 1;
          end--;
      }


      while (pos !== -1) {
        end = pos = str.indexOf(obj, pos + current);
        while(end > start){
          if(str.charAt(end) == '<' ){
            current = 1;
            break;
          };
          if(str.charAt(end) == '>'){
            temp = str.slice(pos);
            temp = temp.replace(obj,"<span style='color:#f65e03;'>"+obj+"</span>")
                
            str = str.slice(0,pos) + temp
                
            current = strlength + 32
            break;
          }
          current = 1;
          end--;
        }
        start = pos;
      }
      this.articleHighDetail.text = str
    },
  } 
}
</script>
16、安装本地服务器http-server

(1)、全局安装

    npm install http-server -g 

    pm i http-server

    yarn -g http-server

(2)、运行服务

    在dist打包文件运行 http-server
    
    cmd中输入命令 http-server
17、滚动条样式兼容火狐、谷歌
    	//在添加overflow-y的类名上添加以下样式可修改滚动条默认样式
        .dialog{overflow-y: auto; }
        //兼容谷歌
        .root .dialog::-webkit-scrollbar {
            width: 5px;
            border-radius: 8px;
        }
        /* 滚动条颜色 */
        .root .dialog::-webkit-scrollbar-track {
           background-color: #555;
        }
        .root .dialog::-webkit-scrollbar-thumb {
            border-radius: 8px;
            background: #333;
        }
        //兼容火狐、IE
        .root .dialog {
            scrollbar-width: thin;
            scrollbar-color: #333 transparent;
        }
18、删除IE浏览器文本框自带X号
   input::-ms-clear, input::-ms-reveal{display: none !important;}
19、Vue中设置公共方法(在main.js文件中)
    //截取字符串
    Vue.prototype.substrFuc = function(string, length, text) {
      return string
        ? string.length > length
          ? string.substr(0, length) + "..."
          : string
        : text
        ? "暂无"
        : "";
    };
    //去除标签并截取字符串
    Vue.prototype.delHtmlSubTag = function(string, length) {
      if(string&&string.replace(/<[^>]+>/g,"")){
        if(string.replace(/<[^>]+>/g,"").length > length){
          return string.replace(/<[^>]+>/g,"").substr(0, length) + "..."
        }else{
          string.replace(/<[^>]+>/g,"")
        }
      }
    };
    
    //去除标签
    Vue.prototype.delHtmlTag = function(string) {
      if(string){
        return string.replace(/<[^>]+>/g,"")
      }
    };
20、文章中的图片放大、缩小、翻转等功能

(1)、安装v-viewer依赖

    cnpm install v-viewer -S

(2)、在mian.js中引入

    import Viewer from 'v-viewer'
    import 'viewerjs/dist/viewer.css';
    Vue.config.productionTip = false
    Vue.use(Viewer, {
      defaultOptions: {
        zIndex: 9999
      }
    });

(3)、在文章div中应用

    <viewer :trigger="articleDetail.text">
        <div :class="[articleDetail.affiliate?'articleDetail newArticleWidth':'articleDetail',currentClass]" ref="articleDetailSize" v-html="articleDetail.text" v-if="isText"></div>
     </viewer>
21、IE兼容scrollTo()方法

在main.js中设置兼容方式

    方法一:
    if (!window.scrollTo) {
    	window.scrollTo = function(option) {
    		window.scrollLeft = option.left;
    		window.scrollTop = option.top;
    	};
    }
    
    if (!document.body.scrollTo) {
    	Element.prototype.scrollTo = function(option) {
    		this.scrollLeft = option.left;
    		this.scrollTop = option.top;
    	};
    }
    
    //方法二:直接使用
    this.$refs.articleDetailSize.scrollTop = 0 

然后使用this.$refs.articleDetailSize.scrollTo(0,0) 或者 window.scrollTo(0,0)即可

22、PC端自适应屏幕使用vw方法

(1)、安装npm install postcss-px-to-viewport -D

(2)、2.在package.json同级下新建文件vue.config.js,在vue.config.js中配置如下

    module.exports={
    css: {
        extract: false,//false表示开发环境,true表示生成环境
        sourceMap: false,
        loaderOptions: {
          postcss: {
            plugins: [
              require("postcss-px-to-viewport")({
                unitToConvert: "px",    // 需要转换的单位,默认为"px"
                viewportWidth: 1920,   // 视窗的宽度,对应pc设计稿的宽度,一般是1920
                viewportHeight: 1080,// 视窗的高度,对应的是我们设计稿的高度,我做的是大屏监控,高度就是1080
                unitPrecision: 3,        // 单位转换后保留的精度
                propList: [        // 能转化为vw的属性列表
                  "*"
                ],
                viewportUnit: "vw",        // 希望使用的视口单位
                fontViewportUnit: "vw",        // 字体使用的视口单位
                selectorBlackList: [],    // 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
                minPixelValue: 1,        // 设置最小的转换数值,如果为1的话,只有大于1的值会被转换
                mediaQuery: false,        // 媒体查询里的单位是否需要转换单位
                replace: true,        // 是否直接更换属性值,而不添加备用属性
                exclude: /(\/|\\)(node_modules)(\/|\\)/,        // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
              })
            ]
          }
        }
      }    
    }

(3)、在css中将div等设置宽高px即可

23、如何替换接口返回数据中的img标签src路径
    this.articleDetail.text = this.articleDetail.text.replace(
        /src="/g,
        `src="${process.env.VUE_APP_URL}`
    );
    if(this.articleDetail.cssPath) {
        const oScript = document.createElement('link')
        oScript.type = 'text/css'
        oScript.rel = 'stylesheet'
        oScript.href = this.courseUrl + this.articleDetail.cssPath
        document.getElementById('ebook').appendChild(oScript)
    }
24、PC端访问移动端页面,直接跳转移动端网址
    <script type="text/javascript">
        (function () {var sUserAgent = navigator.userAgent;if (sUserAgent.indexOf('Android') > -1 || sUserAgent.indexOf('iPhone') > -1 || sUserAgent.indexOf('iPad') > -1 || sUserAgent.indexOf('iPod') > -1 || sUserAgent.indexOf('Symbian') > -1) {location.href = 'http://test20.zhongdianyun.com/wap/#/';} else {}})();
    </script>
  
25、解决火狐浏览器设置placeholder颜色偏浅的问题

只要是火狐浏览器自带opacity:0.4的原因

    input::-webkit-input-placeholder,//chorme, safari
    input:-moz-placeholder,  //Firefox V18及以下
    input::-moz-placeholder, //Firefox 19
    input:-ms-input-placeholder  { //IE 10
        color #757575;
    }
        
    input:-moz-placeholder,
    input::-moz-placeholder {
        opacity: 1;
    }
26、使用font-family是需要注意的问题

常用技巧:

1、现在网页中普遍使用14px+。

2、尽量使用偶数的数字字号。ie6等老式浏览器支持奇数会有bug。

3、各种字体之间必须使用英文状态下的逗号隔开。

4、***中文字体需要加英文状态下的引号,英文字体一般不需要加引号。当需要设置英文字体时,英文字体名必须位于中文字体名之前

5、如果字体名中包含空格、#、$等符号,则该字体必须加英文状态下的单引号或双引号,例如font-family: "Times New Roman";。

6、尽量使用系统默认字体,保证在任何用户的浏览器中都能正确显示。

27、基于vue项目的省市区三级联动

(1)、下载 distpicker依赖

    npm install v-distpicker --save

或者

    yarn add v-distpicker --save

(2)、应用

全局应用:

    import VDistpicker from 'v-distpicker'

    component('v-distpicker', VDistpicker)

局部应用:

    import VDistpicker from 'v-distpicker'

    export default {
      components: { VDistpicker }
    }

默认值应用:

    <template>
      <v-distpicker :province="select.province" :city="select.city" :area="select.area"></v-distpicker>
    <template>
    
    <script>
        import VDistpicker from 'v-distpicker'
        
        export default {
          components: { VDistpicker },
          data() {
            return {
              select: { province: '广东省', city: '广州市', area: '海珠区' },
            }
          },
        }
    </script>
28、Vue中在某页面添加自动播放的背景音乐

(1)、在.vue页面中书写html

    <div class="bgAudioPlay">
        <span class="bgPlayIcon" @click="playing">
            <img src="@/assets/img/article/playing.png" alt="" v-if="musicTF" class="playingIconBtn">
            <img src="@/assets/img/article/pause.png" alt="" v-if="!musicTF">
        </span>
        <audio src="http://43.243.138.202:81/2021/05/11/wohewodezuguo.mp3" class="media-audio" loop autoplay ref="MusicPlay"></audio>
    </div>

(2)、在methods中添加方法

    data(){
        return {
            musicTF: true,
        }
    }
    methods:{
        playing(){
            this.musicTF = !this.musicTF;
            if(this.musicTF){
                this.$refs.MusicPlay.play();
            }else{
                this.$refs.MusicPlay.pause();
            }
        },
    }

(3)、书写css样式

    .bgAudioPlay{
        width: 56px;
        height: 56px;
        display: inline-block;
        position: absolute;
        top: -10px;
        right: 64px;
        .bgPlayIcon{
          width: 56px;
          height: 56px;
          display: inline-block;
          background: #FFF8E5;
          border: 2px solid #DEBB82;
          border-radius: 50%;
          cursor: pointer;
          display: flex;
          justify-content: center;
          align-items: center;
          .playingIconBtn{
            animation: rotationName 2s linear infinite;
          }
          @keyframes rotationName {
            0%{
              transform: rotate(0deg);
            }
            50%{
              transform: rotate(180deg);
            }
            100%{
              transform: rotate(360deg);
            }
          }
        }
    }
29、阻止页面内容被复制的css
   *{
        -moz-user-select: none;
        -webkit-user-select: none;
        -ms-user-select: none;
        user-select: none;
    } 
    
    
    //将双书名号替换成单书名号
    
    essay.chapterName.replace('《','〈').replace('》','〉')
    
30、vue中针对formDate形式的文件上传
    <!--弹出框-->
    <el-dialog :visible.sync="importStatus" width="800px" :title="importTitle">
      <el-form class="batchCommit" ref="imgForm" :model="imgForm">
        <div class="importTemplateBox">
          <div class="uploadTemplate">
            <p class="mainTip">1. 请先下载模板</p>
            <p class="annotationTip">必须按照EXCEL模板要求录入考生信息。</p>
            <p class="annotationTip">建议使用微软的2007或以上的Office版本编辑,不要使用WPS。</p>
            <div class="downloadTemBtn">
              <a class="templateBtn downloadBtn" :href="`${commonUrl}/template/考场申报导入表.xlsx`">下载EXCEL格式模板</a>
            </div>
            <p class="mainTip">2. 选择上传文件</p>
            <el-form-item>
              <span class="uploadContentBtn">
                <input type="file" class="uploadFileInput" @change="fileSelect" ref="file" accept=".xls, .xlsx" />
                <span class="templateBtn uploadBtn" style="background:#1F71FF;">选择文件并上传</span>
              </span>
              <span class="pdfTip" style="display:inline-block;margin-left:40px;">{{imgForm.name?imgForm.name:'未选择任何文件!'}}</span>
            </el-form-item>
            <div slot="footer" class="dialog-footer">
              <el-button @click="importTemplateConfirm" :loading="confirmLoading">执行导入</el-button>
              <el-button @click="importStatus = false">取消</el-button>
            </div>
          </div>
        </div>
      </el-form>
    </el-dialog>
    
    
    //方法:
    
    importTemplate(){
        this.importStatus = true
    },
    fileSelect() {
        if (this.$refs.file.files[0]) {
          let file = this.$refs.file.files[0];
          this.imgForm.name = file.name
        }
    },
    importTemplateConfirm(){
        this.confirmLoading = true
        let formData = new FormData();
        formData.append("file", this.$refs.file.files[0]);
        importExamAPI(formData).then((res) => {
          if(res.data.code == 0){
            this.$message.success('导入成功')
            this.importStatus = false
            this.confirmLoading = false
          }else{
            this.$message.error(res.data.msg)
          }
        })
    },
31、Vue中只传相关参数的导出
    //导出excel
    
    <div class="reset_btn" @click="downLoadExcl">导出</div>
    
    //一般是列表检索的参数:
    import { requestPath } from "@/utils/global.js";
    
    listQuery:{
        pageNum: 1,
        pageSize: 50,
        organiId:null,
        usageStatus:null,
        nai:null,
    },
    
    downLoadExcl() {
        let query=''
        for(let i in this.listQuery){
          i=='pageNum'||i=='pageSize'?false:query+="&"+i+"="+this.listQuery[i]
        }
        query=query.slice(1,(query.length))
        confirm.apply(this, ["确定要导出吗?"]).then(() => {
          window.open(`${process.env.VUE_APP_URL}${requestPath.resource}/maintain/export?${query}`)
        });
    },

32、Vue中获取数组中的最大值、最小值

    // 1.排序法
    var arr = [11,45,32,98,35];
    arr.sort(function(a,b){
    	return a-b;
    })
    console.log(arr)
    var min = arr[0];
    var max = arr[arr.length-1];
    console.log(min);
    console.log(max);
    
    
    // 2、假设法
    // 假设当前数组中的第一个值是最大值,然后拿这个值和后面的逐项比较,如果后面的某个值比假设的值还大,说明假设错了
    // 我们把假设的值进行替换,最后得到的结果就是我们想要的
    var arr = [23,11,67,45];
    var max = arr[0]
    for(var i=1;i<arr.length;i++){
    	var cur = arr[i];
    	cur>max?max=cur;null
    }
    console.log(max)
    
    // 获取最小值
    var arr = [45,33,12,7];
    var min = arr[0];
    for(var i=1;i<arr.length;i++){
    	var cur = arr[i];
    	cur<min?min=cur:null
    }
    console.log(min)
    
    
    // 3、使用Math中的max/min方法
    // 使用apply来实现 apply传入的是一个数组
    var arr = [44,22,11,66,21];
    var max = Math.max.apply(null,arr);
    var min = Math.min.apply(null,arr);
    console.log(max,min);
    
    
    
    ///4、使用ES6的扩展运算符
    var arr = [22,13,6,55,30];
    console.log(Math.max(...arr))
    console.log(Math.min(...arr))
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值