• vue移动端项目经验


    配置路径@(一般情况下搭建vue-cli,项目已经配置好了@路径。若自己需要改动可按照一下方法)

    vue-cli 2.x 版本创建项目时,我们可以在 build 文件夹下找到 webpack.base.conf.js 文件,在里面修改 resolve.alias 即可
    resolve: {
        extensions: ['.js', '.vue', '.json'],
        alias: {
          'vue$': 'vue/dist/vue.esm.js',
          '@': resolve('src'),
        }
      },
    
    
    vue-cli 3.0 创建项目时,目录结构精简化,找不到 build 和 config 文件夹,那么该如何修改路径别名呢?
    由于vue-cli 3.0 版本所有的配置项都放在了 vue.config.js 文件中,所以在里面进行配置就好了,代码如下:
    
    const path = require('path');
    function resolve (dir) {
        return path.join(__dirname, dir)
    }
    // 项目的主要配置文件
    module.exports = {
        // webpack 配置进行更细粒度的修改  https://cli.vuejs.org/zh/config/#chainwebpack
        chainWebpack: (config)=>{
            //修改文件引入自定义路径
            config.resolve.alias
                .set('@', resolve('src'))
                .set('style', resolve('src/assets/style'))
        }
    }
    
    配置好想用的路径别名后,重新启动项目,再引入文件时,使用别名即可
    import Demo from '@/demo/demoweb'
    

    使用iconfont

    1、在assets文件夹下新建iconfont文件夹
    2、从iconfont下载字体图标包,下载下来之后,将文件中的这6个文件放入iconfont中(见下图)
    3、在main.js中引入:import './assets/iconfont/iconfont.css'
    (若有报错,安装css-loader包)
    

    如何实现横向滚动(兼容safari,微信,浏览器)

    实现横向滚动需要以下几点:
    1、设置10000px这种大的宽度
    2、父级盒子要overflow-y:hidden;overflow-x:auto来防止页面宽度溢出,以及实现左右滚动效果
    3、::-webkit-scrollbar { display: none;}隐藏横向滚动条(此方法在ios和微信端无效),所以第四步实现兼容
    4、滚动条所存在的盒子为g,g之外再设置一个父盒子s并给定高度和overflow:hidden。通过s来遮盖g的滚动条即可实现隐藏滚动条。
    
    示例:
    <template>
        <div class="university">
           <div class="container">
                <div class="scroll-hidden">   <!--此盒子设置:height,overflow:hidden-->
                     <div class="scroll-body">  <!--此盒子设置:滚动条overflow-y:hidden,overflow-x:auto,滚动条display:none,padding-bottom-->
                        <div class="scroll-secbody">   <!--此盒子设置 :10000px宽度-->
                           <div v-for="(item,index) in universityList" :key="index" class="every_content">  <!--此盒子设置: 浮动.。注:不要用flex-->
                              <div class="content_img"><img :src="item.pimage" /></div>
                              <div class="content_name">{{item.pname}}</div>
                           </div>
                       </div>
                    </div>
                </div>
           </div>
        </div>
    </template>
    
    <script></script>
    
    <style scoped lang="less">
        .university{
            .container{
                .scroll-hidden{
                    height:152px;    //7、设置固定高度(以子盒子为准)
                    overflow:hidden;  //8、超出部分影隐藏
               
                    .scroll-body{
                        overflow-y: hidden;    //2、父级盒子:竖向超出部分隐藏
                        overflow-x: auto;  //3、父级盒子:控制横向可滚动,配合overflow-y:hidden共同控制内容不溢出当前屏幕
                        &::-webkit-scrollbar {   //4、父级盒子:隐藏滚动条(不兼容ios和微信端)
                            display: none;
                        }
                        padding-bottom: 100px; //5、通过padding-bottom将滚动条挤到盒子外
                        .scroll-secbody{
                            2000px;   //1、子级盒子:设置一个大的宽度,如2000,3000等
                            .every_content{
                                height:150px;
                                margin-right: 25px;
                                margin-bottom: 10px;
                                float: left;    //6、展示内容的盒子,设置浮动。注:这里设置盒子水平要用float布局,不要使用flex布局,会有bug
                                text-align: center;
                            }
                        }
                    }
                }
            }
        }
    </style>
    

    实现一个固定区域内竖向滚动(不隐藏滚动条)

    <div class="srollContent">
        <ul>
            <li>......</li>
            <li>......</li>
        </ul>
    </div>
    
    
    <style scoped lang="less">
        .scrollContent{
            height:300px;   //固定父盒子高度
            overflow-y:scroll;  //超出部分会以滚动条形式展示
        }
    </style>
    

    实现一个固定区域内竖向滚动(隐藏滚动条)

    
    <div class="content"> //一级盒子
        <div class="srollContent">  //二级盒子
            <ul>  //三级盒子
                <li>......</li>
                <li>......</li>
                <li>......</li>
            </ul>
        </div>
    </div>
    
    
    
    <style scoped lang="less">
        .content{
            300px;  //一级盒子固定宽度
            overflow:hidden; //超出部分隐藏
            .scrollContent{  
                500px; //二级盒子固定宽度,此宽度要比一级盒子大至少50px
                height:300px;   //二级盒子设置固定高度
                overflow-y:scroll;  // 二级盒子超出部分会以滚动条形式展示
                ul{
                    300px; //三级盒子固定宽度,此宽度要比一级盒子小或相等
                }
            }
        }
    </style>
    原理:滚动条在二级盒子超出一级盒子之外的部分。
    这里一级盒子300px,二级500px,滚动条在200px那块区间中
    

    安利一个不错的叙述vue移动端经验的博客

    https://www.cnblogs.com/wdlhao/p/9393539.html

    v-if简单使用

    <li class="every_content" v-for="(item,index) in heros" :key="index">
           <i v-if="item.type==0">我是亚索</i>
           <i v-else-if="item.type==1">我是剑姬</i>
           <i v-else-if="item.type==2">我是卡萨</i>
           <i v-else-if="item.type==3">我是狮子狗</i>                 
    </li>
    

    左侧图片右侧文字布局:图片宽度固定的,现在要实现当屏幕宽度改变时,右侧文字描述部分宽度自适应。

    1、使用flex布局可以解决左右布局宽度自适应问题
    2、但是flex布局时,若有文字溢出时展示省略号的需求,则需要配合overflow:hidden才可以
    
    示例:
    <div class="body">
        <ul class="bodyContent">
            <li class="everyContent" v-for="(item,index) in hotProductInfo" :key="index">
                <div class="contentImg"><img :src="item.pictures"/></div>   <!--左侧图片-->
                <div class="contentDetails">    <!--右侧文字描述-->
                    <div class="intro">{{item.intro}}</div>
                </div>
            </li> 
        </ul>
    </div>
    
    <style scoped lang="less">
                .body{
                    .bodyContent{
                        .everyContent{
                            display: flex;   //1、flex布局
                            .contentImg{
                                margin-right: 10px;
                                img{
                                    140px;
                                    height:80px;
                                }
                            }
                            .contentDetails{
                                flex:auto;  //2、flex:1,auto都可以。右侧文字描述部分宽度自适应
                                overflow: hidden;    //3、这里使用overflow:hidden,解决"文字溢出省略号展示功能"失效的问题
                                .intro{
                                    font-size: 16px;
                                    color:#333333;
                                    display: -webkit-box;   
          		    		-webkit-line-clamp: 2;   
          		    		-webkit-box-orient: vertical;   
          		    		overflow: hidden;   
                                    text-overflow: ellipsis; 
                                }
                            }
                        }
                    }
                }
    </style>
    

    Vue中使用vant-ui

    1、安装Vant-ui    yarn add vant & npm install vant -D
    2、安装按需引入的babel插件  yarn add babel-plugin-import & npm install babel-plugin-import -D
    3、在.babelrc文件(此文件在根目录下)中添加配置   
    {
      "plugins": [
        "transform-vue-jsx",
        "transform-runtime",
        ["import", {                      //将此代码添加进plugins里
          "libraryName": "vant",
          "libraryDirectory": "es",
          "style": true
        }]
      ]
    }
    4、在main.js中按需引入   
    import {Button,Tag} from 'vant';    //注意import {Button,Tag} from 'vant'要在Vue.use(Button).use(Tag)之前。即 使用之前先引入
    Vue.use(Button).use(Tag);
    5、按照vant官网api使用即可
    <van-button type="primary">按钮</van-button>
    

    配合vant-ui框架的List组件实现“上拉加载更多”功能 (懒加载)

    1、引入List组件(上面有介绍,句不过多赘述了)
    2、如何使用:看下方代码
    <template>
        <div>
            <!--【***①组件***】van-list用于监听滚动事件及设置加载相关事宜-->
            <van-list
                v-model="loading"
                :finished="finished"
                finished-text="-- 没有更多了 --"
                @load="onLoad" 
                :immediate-check=false    //初始化页面时不检查滚动位置  
             >           
            <!--这里写html代码-->
                        <ul class="universityInfo" >
                            <li class="everyInfo" v-for="(item,index) in universityList" :key="index">
                                    <div class="infoName"><span>{{item.pname}}</span></div>
                            </li>
                        </ul>
            </van-list>
        </div>
    </template>
    
    
    <script>
        import * as axios from 'axios'
        import common from '../../kits/common.js'
        export default {
            name:"pUniversityList",
            data(){
                //【***②参数***】
                return{
                    universityList:[],   //请求到的数据
    
                    loading: false,  //加载状态
                    finished: false,  //是否全部加载完毕
                    page:1,    //接口的请求页码
                    pagesize:15,   //每次请求数据数量,在设置:immediate-check=false后,pagesize最好设置大一点
                }
            },
            created(){
                this.getUniversityList();
            },
            methods:{
                getUniversityList(){
                    axios.get(`${common.coper}/allCooperation?page=${this.page}&pagesize=${this.pagesize}`)   //【***③请求***】动态设置请求的页码和数据数量
                    .then(res=>{
                        if(res.data.code==200){
                            this.loading = false   //请求接口成功时设置加载状态为false,【敲黑板,这里踩坑了,this.loading=false应该写在这里见下方解释】
                            if(res.data.data.list){   //因为不确定当没有数据时,后端接口返回给你的data.list是[],还是null,严谨一点,这里最好做一个判断。
                                this.universityList=this.universityList.concat(res.data.data.list);   //将请求的数据合并到之前的数据上
                                //this.universityList=res.data.data.list.reverse().concat(this.universityList);   //使数据倒叙排序
                                if(res.data.data.list.length<this.pagesize){     //当请求到的数据量小于请求的数据量时,说明数据已全部请求完毕
                                    this.finished = true;   //数据全部加载完毕
                                }
                            }else{
                                this.finished = true;  
                            }   
                        }
                    }).catch(err=>{})
                }
                //懒加载函数【***④函数***】
                onLoad() {
                    let times=setTimeout(()=>{
                        this.page+=1    //每请求一次,页面数+1
                        this.getUniversityList()
                        /*this.loading=false*/  
                        //之前的this.loading=false是写在这里的,导致了一个bug就是每次上拉页面onload函数会执行两次或多次。原因在于这里是异步执行,故this.loading=false不会立即执行,因此loading是true状态,函数onload也一直在执行中。此时就会出现多次调用接口的情况。所以要把this.loading=false设置在接口函数(见上方)中。保证在接口调用成功后,this.loading=false,即加载完成。
                        clearTimeout(times)   //执行完定时器后清除定时器
                    },500)
                }
            },
        }
    </script>
    
    

    上拉加载项目使用模板

    【①】html模板
            <van-list
                v-model="loading"
                :finished="finished"
                finished-text="-- 没有更多了 --"
                @load="onLoad"  
                :immediate-check=false 
             > 
                。。。。。。
            </van-list>
    
    【②】data参数设置
            data(){
                //【***②参数***】
                return{
                    universityList:[],   
    
                    loading: false, 
                    finished: false,  
                    page:1,    
                    pagesize:15,   
                }
            },
    
    【③】请求接口动态设置page,pagesize等
    getUniversityList(){
        axios.get(`${common.coper}/allCooperation?page=${this.page}&pagesize=${this.pagesize}`)   
            .then(res=>{
                if(res.data.code==200){
                    this.loading = false  
                    if(res.data.data.list){
                        this.universityList=this.universityList.concat(res.data.data.list);  
                        if(res.data.data.list.length<this.pagesize){     
                            this.finished = true; 
                        }
                    }else{
                        this.finished = true;
                    }
                }
            }).catch(err=>{})
        },
    
    【④】onload加载函数
    onLoad() {
        let times=setTimeout(()=>{
            this.page+=1    
            this.getUniversityList()
            clearTimeout(times)
        },500)
    }
    

    路由传值,取值(一个参数)

    1、路由部分配置:如router.js页面,在需要取值的页面的路由上添加/:testid
    {
        path:'/pUniversity/pUniversityInfo/:testid',    //添加/:testid
        component:pUniversityInfo
    },
    2、传值,在需要传值的页面(如列表页)
    <li class="everyInfo" v-for="(item,index) in universityList" :key="index">
        <router-link :to="'/pUniversity/pUniversityInfo/'+item.testid" >   //这里通过这种方式传入id值,注意to需要v-bind绑定,另外注意 / 符号别少了
            <div class="infoImg"><img :src="item.pimage" /></div>
            <div class="infoName"><span>{{item.pname}}</span></div>
        </router-link>
    </li>
    3、取值,在需要取值的页面(如详情页)
    data(){
        return{
            id:this.$route.params.testid    //注意这里是$route而不是$router
        }
    },
    

    路由传值取值(多个参数,params方式)

    1、路由页面
    {
        path:'/video/videoScreen',
        component:VideoScreen,
        name:'VideoScreen',   //params传多个参数必须要给路由命名,再通过命名方式跳转。
    },
    2、传值页面
    methods:{
        postData(){
            this.$router.push({name:'VideoScreen',params:{cid:this.demoCid,sid:this.demoSid,eid:this.demoEid}})   //params传多个值,只能通过name命名方式跳转,不可通过path路径方式
        },
    }
    3、取值页面
    data(){
        return{
            getData:this.$route.params   //取值
        }
    }
    
    丶丶丶【敲黑板】params通过路由name传值的方式有个缺点,就是在取值页面刷新后,传过来的值便被清空了。丶丶丶
    4、上述问题解决办法:
    在路由页面做如下改动
    {
        path:'/video/videoScreen/:cid/:sid/:eid',    //这里在路由后面配置一下需要传的参数即可,这样参数就跟着路由被带过来,不会被清空了
        component:VideoScreen,
        name:'VideoScreen',  
    },
    

    路由传值取值(多个参数,query方式)

    1、路由页面
    {
        path:'/video/videoScreen',
        component:VideoScreen,
    },
    2、传值页面
    methods:{
        postData(){
            this.$router.push({path:'/video/videoScreen',query:{cid:this.demoCid,sid:this.demoSid,eid:this.demoEid}})   //query传多个值,只能通过path路径方式跳转,不可通过name命名方式
        },
    }
    3、取值页面
    data(){
        return{
            getData:this.$route.query//取值
        }
    }
    

    Vue中使用三目运算符

    【1、直接使用】
    <template>
        <div>{{transIndex==1?"第一个":"第二个"}}</div>
    </template>
    
    <script>
        export default{
            data(){
                return{
                    transIndex:1,
                }
            }
        }
    </script>
    
    
    
    【2、在class中使用,用来动态绑定样式】
    <template>
        <div>
            <button id="1"  class="start"  :class="selectid==1?'active':''"  @click="select($event)">开始</button>    //注意这里active是属性,要加引号,不然会报错
            <button id="2"  class="stop"  :class="selectid==2?'active':''"  @click="select($event)">结束</button>    //在class里使用三木运算符时class需要v-bind绑定
        </div>
    </template>
    
    <script>
        export default{
            data(){
                return{
                    selectid:1,
                }
            },
            methods:{
                select(e){
                    this.selectid=e.currentTarget.id  //获取当前元素的id值
                }
            }
        }
    </script>
    

    vue通过js设置当前页面最小高度等于屏幕高度

    在mounted钩子函数中设置
    mounted(){
        document.getElementById('demo').style.minHeight = window.innerHeight + 'px';
    },
    
    

    vant-ui动态设值

    <template>
        <div>
            <van-popup v-model="menuShow" position="left" :duration="state" class="sideBarPop">    //这是vantui里的弹出层组件,duration不可直接设值(需要绑定才行),需要通过:duration="state"这种方式动态赋值,或者直接:duration="0.5"
                    <div>DEMO</div>
    	</van-popup>
        </div>
    </template>
    
    <script>
        export default{
            data(){
                state:0.5,
            }
        }
    </script>
    

    Vue中dom元素完全渲染完毕后再获取一些数据--例子:文本超过三行后显示展开收起功能。(知识点较多)

    1、完全渲染完毕后获取数据:watch对象配合Vue.nextTick方法
    2、判断文本是否超过三行:获取文本高度,获取行高,行数=文本高/行高
    
    【dom,css部分代码】
    <template>
    <div class="contentIntro">
        <div class="intro" id="intro"><span>{{goodsList.info}}</span></div>   //文本域
        <div v-show="isOpenShow">   //是否显示展开收起模块
            <span class="moreIntro" @click="openIntro" v-show="!isOpen">展开</span>
            <span class="moreIntro" @click="closeIntro" v-show="isOpen">收起</span>
        </div>
    </div>
    </template>
    
    <style scoped lang="less">
    .intro{
        color:#6f6f6f;
        font-size: 15px;
        line-height: 22px;   //一定要设置line-height,以便js部分获取line-height数据
         //下面设置超出部分用省略号表示
        display: -webkit-box;     //将此display改变即可使省略失效
        -webkit-line-clamp: 4;   //设定行数 
        -webkit-box-orient: vertical;   
        overflow: hidden;   
        text-overflow: ellipsis;
    }
    .moreIntro{
        float:right;
        font-size: 15px;
        color:#ff7700;
    }
    </style>
    
    【script部分代码】
    <script>
    import common from '../../common.js'
    import * as axios from 'axios
    data(){
        isOpenShow:false,   //是否显示展开收起按钮
        personInfo:[],    //个人信息
        personIntro:null,   //个人信息-描述   
    },
    watch:{   //watch配合nextTick实现dom渲染完毕后监听dom元素
            personIntro:function(){
                this.$nextTick(()=>{    //vue的nextTick方法,可以配合watch实现在对更新过后的dom的监听。这里是要监听【渲染完毕后】的文本高度和行高,所以使用这种方法
                    const elem=document.getElementById('intro')   
                    const H=elem.offsetHeight    //获取整个文本域的高度
                    /* const h=elem.style.lineHeight */    //获取文本的行高。这种方法只能获取行内样式里的样式,无法获取外联样式设置的样式,有局限性,这里不适用。但使用方式简单,有时可以用用。在移动端,内联样式是固定的,不会被编译器转化成rem等,没法自动适配屏幕,所以这里我们要获取外联样式,这样才能达到适配的目的,此方法只能获取内联样式是不行的。
                    const h=window.getComputedStyle(elem,null).getPropertyValue("line-height")   //获取文本的行高。window.getComputedStyle()方法可以获取元素的样式属性,包括外联和内联样式,局限性很小。
                    const lineNum=parseFloat(H/parseFloat(h)).toFixed(2)    //因为h的结果是带px单位的,所以这里要 parseFloat(h).toFixed(2)  转换为数字形式并保留两位小数。 lineNum=H/h的意思是行数=文本高度/行高
                    console.log(H)
                    console.log(h)
                    console.log(lineNum)
                    if(lineNum>3){   //行高大于3时,展开按钮出现,若移动端不出现展开按钮,可以将3设置小一点试试,如2.6,2.7
                        this.isOpenShow=true  
                    }
                })
            }
        },
    methods:{
        getPersonInfo(){
                axios.get(`${common.personindex}/getCooperation?pid=${this.pid}`).then(res=>{
                    if(res.data.code==200){
                        this.personInfo=res.data.data
                        this.personIntro=res.data.data.pdetails   //给personIntrof赋值以配合watch方法实现监听
                    }
                })
            },
            openIntro(){
                this.isOpen=true   //收起按钮出现
                document.getElementById("intro").style.display="block"   //设置display,使得文本省略失效,从而展示所有文本
            },
            closeIntro(){
                this.isOpen=false   //展开按钮出现
                document.getElementById("intro").style.display="-webkit-box"   //重新设置display,以...省略形式展示
            }
    }
    </script>
    

    给v-html中的标签添加css样式

    解决方案1:在updated生命周期函数中,js动态配置样式,代码如下
    updated() {
        $('.msgHtmlBox').find('p').css('color', 'blue');
     },
    
    解决方案2:去掉style标签中的scoped属性
    scoped属性导致css仅对当前组件生效(用css3的属性选择器+生成的随机属性实现的),而html绑定渲染出的内容可以理解为是子组件的内容,子组件不会被加上对应的属性,所以不会应用css.
    
    解决方案3:写样式的时候添加 >>> 符号(注:若使用了less,则不能使用此方法)
    <style scoped>
    .msgHtmlBox >>>  p{
       color: blue;
    }
    </style>
    

    input获取焦点失去焦点(注意浏览器兼容问题)

    原则上失去焦点是@blur,获取焦点是@focus
    但是苹果safari浏览器不能很好的兼容@focus,所以移动端的话@focus最好用@click代替
    js使input框获取焦点document.getElementById("inputName").focus()
    js使input框失去焦点document.getElementById("inputName").blur()
    
    

    vant-ui里toast的使用

    sendComment(){
                this.$toast({
                    message:'评论发表成功',
                    duration:2000,	
                })
                this.commentValue=''
                this.inputSelect=false
            },
    

    input输入框在呼出键盘后错位

    https://www.cnblogs.com/ljx20180807/p/9837748.html
    

    图片间隔处理方法(如5张图片,屏幕一行放下2张,中间间隔10px,两边无间隔)

    使用nth-child(odd),nth-child(2n)方式添加margin-right:10px样式
    注意看下方图片,一个是中间有间隔,两边无间隔。一个是所有图片右侧均有间隔
    

    实现短信验证码倒计时

    <span v-show="show" @click="getCode">获取验证码</span>
    <span v-show="!show" class="count">{{count}} s</span>
    
    data(){
      return {
       show: true,
       count: '',
       timer: null,
      }
     },
     methods:{
       getCode(){
         const TIME_COUNT = 60;
         if (!this.timer) {
           this.count = TIME_COUNT;
           this.show = false;
           this.timer = setInterval(() => {
           if (this.count > 0 && this.count <= TIME_COUNT) {
             this.count--;
            } else {
             this.show = true;
             clearInterval(this.timer);
             this.timer = null;
            }
           }, 1000)
          }
       }  
     }
    

    vue正则匹配(踩坑,不要用全局g)

    inputuname() {
        const pattern = /^[wu4e00-u9fa5]{3,8}$/     //注意这里不要用g全局匹配,否则若其他地方有不符合该正则的,则表达式会一直返回false。
        if (this.username.length==0) {
            this.errname = false
        }else if(pattern.test(this.username)==false){
            this.errname = true
        }else if(pattern.test(this.username)==true){
            this.errname = false
        }
    },
    

    input输入框光标高度问题

    IE:不管该行有没有文字,光标高度与font-size大小一致
    
    FF:该行没有文字时,光标大小与input的 height 大小一致;该行有文字时,光标大小与font-size大小一致
    
    chrome:有2种情况,①设置了line-height  该行没有文字时,光标大小与input的 line-height 大小一致; 该行有文字时,光标大小从input顶部到文字底部
    
               ②没有设置line-height  光标大小与font-size一样
    
    所以,input在使用的时候,最好不要设line-height, 可以设定一个较小的height, 然后用 padding 来撑开,这样基本上可以解决所有浏览器的问题
    input{
        height: 10px;
        padding: 10px 0px;
        font-size: 12px;
    }
    

    使用vant的upload组件上传头像,图片(上传图片使用form表单形式,而非json)

    <template>
        <div class="image">
            <span>头像:</span>
            <van-uploader class="imgDiv" :after-read="afterRead">
                <div class="uploaderStyle" v-if="!imgUrl">
                    <span>+</span>
                    <span>上传头像</span>
                </div>
                <div class="imageShow" v-if="imgUrl">
                    <img :src="imgUrl"/>
                </div>
            </van-uploader>
        </div>
    </template>
    
    <script>
        afterRead(file){
            /* console.log(file.file) */
            let param = new FormData();    //创建formData对象
            param.append('file', file.file);    //组件获取到的图片file有时需要经过处理后上传,这里需要上传file里面的file数据,所以file.file,见下图
            let config = {
                headers: {
                    'Content-Type': 'multipart/form-data'   //设置请求头格式
                }
            }; 
            axios.post(`${common.api}/upload`, param, config).then(res => {   //上传至 图片处理接口 拿到后台处理过后的图片url
                if(res.data.code==200){
                    this.imgUrl=res.data.msg  //这就是后台处理过后的url
                    axios.post(`${api.userApi}/demoimg?faceimg=${this.imgUrl}`).then(res=>{   //将处理过后的图片url上传至其他接口
                        if(res.data.code==200){
                            this.$toast("图片上传成功")
                        }
                    })
                }
            })
        }
    </script>
    

    上传图片小结

    这里上传的方式是在vant组件的after-read文件读取的钩子函数里拿到图片file,然后将file.file上传到后台的图片处理接口,再拿到处理接口返回的url,这时图片就转化成了url形式,再将这个url上传给其他需要的接口即可。
    即after-read读取文件-->file传处理接口-->拿到处理后url-->使用url传其他接口
    而需要说明的是并不是每个ui框架的上传组件都是这种处理模式,有的框架的文件读取是单独出来的api(如vant的after-read)。
    而有的文件读取是内嵌在组件内部的,比如antDesign的文件读取就在beforeUpload之中,element,mint,cube等每一个都有自己的模式。
    如果框架没有单独的文件读取api,可以参考 https://www.cnblogs.com/huihuihero/p/11060531.html 里的图片上传方式
    

    vue根据不同数据动态设置背景

    <div class="demo" :style="{background:'url('+require('../../assets/image/pic_'+(index+1)+'.png')+') no-repeat center'}"></div>
    注意:图片必须要以pic_1.png  pic_2.png  pic_3.png  pic_4.png这种数字型命名
    
  • 相关阅读:
    C#获取当前堆栈的各调用方法列表
    JS | 你真的会用 console.log 吗?
    antd form表单自定义验证
    C# 如何去空格
    CSS 网络安全字体
    Surface Book 3真是太快了
    Waypoints
    es6 去掉空格_js去除字符串中的所有空格(包括前后,中间存在的所有空格)
    Facebook 新一代 React 状态管理库 Recoil
    独处时必看悬疑推理剧大全
  • 原文地址:https://www.cnblogs.com/huihuihero/p/11493710.html
Copyright © 2020-2023  润新知