vue项目技术小记

最近做的项目快要结尾了,本项目用前后端分离的,然后前端是用vue开发的,为什么选vue呢?一来公司要求效率要高些的,那就应该用到三大流行的框架之一,然后项目的内容不太复杂的,觉得用vue更合适的。二来正好应该要“炒熟”vue了哈。其中陷入了不少坑,一个一个爬过来的,总结下入坑的原因,另外会给出官方文档的对应内容,以便加深理解的。如有不足之处,请提出来哈~

  • 异步加载组件

    • 我们都知道vue一般都是单页面的,也就意味着一开始就要加载全部的组件,这太不友好的,加载时间会慢些。这时候我们就用到异步组件~
    const Index=()=>import('@/page/Index');
    const Home=()=>import('@/page/Home');
    const router=new Router({
        routes:[
        {
            path:'/index',
            component:Index
        },
        {
            path:'/home',
            component:Home
        }
        ]
    })
    

    然后你会发现js被分开的,这就是所谓的异步加载~

  • 在相同路由的情况下,再次点击导航栏上的本路由,再次刷新

    在vue中,路由地址相同的情况下,是不会再次刷新的,即使点击本路由的导航文字上。一开始我没想到解决的方案,后来寻求大佬商量,大佬说可以用事件传递的。然后他告诉我一句话的,

    vue.js一定不会阻碍传统方法实现的。

    这话说得我惭愧,我意识到我太依赖vue.js的框架,没拓展思维的。再次感谢大佬的点拔~

    • 对,是可以用事件传递来实现的。在主路由上绑定isFresh,判断需不需要刷新子路由,然后在子路由上绑定事件,传递到主路由的事件。主路由监听到事件的,就把isFresh变为false,以防下面还会需要到。不设置为false,下面的就不会刷新。看代码如下:
    • App.vue
    <router-view :isFresh="isFresh" @tempBtn="tempBtn"/>
    //data
    data(){
        return {
            isFresh:false,
        }
    }
    //事件函数
    tempbtn(){
        this.isFresh=false;
    }
    
    • Index.vue
    watch:{
        isFresh(){
            //console.log('ShopisFresh:'+this.isFresh);
            if(this.isFresh){
                Object.assign(this.$data,this.$options.data());
                this.fetchData();
            }
        }
    },
    //然后加载完后,还要绑定事件,传递到主路由的tempbtn事件
    this.$emit('tempbtn');
    

    嗯,在子路由上监听到isFresh为true,表示要刷新的,Object.assign是利用data的初始化数据覆盖,然后重新加载数据。

  • checkbox整体点击

    UI设计师要求能点击checkbox的整体,包括checkbox后面的文字,不是只能点击checkbox的框,这可把我为难了,然后艰难的爬出坑了。

    <div class="group_item" @click="selfChecked = !selfChecked">
        <input type="checkbox" v-bind:checked="selfChecked">
        <label>点我呀</label>
        data(){
            return {
                tempChecked:null
            }
        },
        props:['checked'],
        watch:{
            checked(){
                this.tmpChecked=this.checked
            }
        },
        computed: {
            selfChecked: {
                get: function(val){
                    return this.tmpChecked;
                },
                set: function(newVal){
                    this.tmpChecked = newVal
                    this.$emit('input', newVal)
                }
            }
        },
    </div>
    

    然后在父组件上用v-model即可。用selfChecked来判断是不是要点击,至于为什么要watch,是判断checked为真还是假,比如说在父组件上,提交后,表单要清空的,这时候要监听到checked为假的,然后传递到selfChecked的值。这样就能清空checkbox。

  • setInterval的问题

    用了setInterval之后,切换路由的时候发现还在计时,不得了,真的会影响性能唉,就吓的赶紧啃官方文档,找到了~

    beforeDestroy(){
        clearInterval(this.interId);
    }
    

    beforeDestroy是毁路由之前的函数,就是说毁路由之前就清除setInterval

    • 参考vue的生命周期
  • 在v-for循环中进行v-model数据绑定

    <div v-for="(item,index) in list">
        <textarea type="text" v-model="list[index]['content']"></textarea>
    </div>
    

下面说说和vue没关系的问题

  • 上线时去掉console

    我们一般都会用console来打印,以便检查的,万一console写多了,上线时总不能打印出console吧,要注释掉,但太费时间吧,这时候webpack神器上场(本人用webpack3)

    • 在webpack.prod.config.js中
    new UglifyJsPlugin({
      uglifyOptions: {
        compress: {
          warnings: false,
          drop_debugger: true,
          drop_console: true
        }
      },
      sourceMap: config.build.productionSourceMap,
      parallel: true
    }),
    

    这prod是生产环境的,然后drop_console为true,是去掉console

  • 兼容ie的问题

    部署到生产环境后,测试ie11时发现空白屏的,我慌了,不是说可以兼容到ie9吗?还是说没配置好的,然后google查,ie还没支持js新的api,比如promise,所以需要babel-polyfill来转换的。真是蛋疼的ie,还能怎么办呢?当然是加babel-polyfill插件的。

    npm install babel-polyfill --save
    //然后在webpack.base.config.js中引用这插件
    module.exports=require('babel-polyfill');
    module.export={
        ...
        entry:{
            app:['babel-polyfill','./src/main.js']
        }
    }
    
  • 打包第三方库

    打包时把第三方库合并成vendor.js,但是这个vendor.js有hash,这就意味着每次打包时vendor.js的hash会变化的,然后在浏览器会重新加载。vendor.js的代码本来就很少被改变的,重新加载就影响加载时间的。从目前搜索的解决方案,比较好的方案有两种:
    1、 第一种用dll来打包的,webpoack自带的

    • 首先在build里新建一个文件,命名为webpack-dll.config.js
    const webpack=require('webpack')
    const path=require('path')
    
    module.export={
        entry:{
            vendors:['vue.js','axios','vue-router','vuex','vue/dist/vue.esm.js']   //加入要打包的第三方库
        },
        output:{
            filename:'[name].dll.js',  //输入的文件名
            path:'path.join(__direname,'../static')',   //输入的路径
            library:'[name]'
        },
        plugin:[  //为了和第三方库的dll.js对应,build时不会把这个打包进去,就是说能减少build构建的时间
            new webpack.DllPlugin({
                path:path.join(__direname,'../','[name]-mainfest.json'),  //输入的mainfest文件的路径
                name:'[name]'
            })
        ]
    }
    
    • 然后命令生成vendor-mainfest.json
    //在package.json添加一行
    "dll":"webpack --config build/webpack.dll.config.js"
    

    然后npm run dll,就生成vendor-mainfest.json

    • 然后还要在webpack.base.conf.js配置,改变构建的配置
    //添加一行
    const mainfest=require('../vendors-mainfest.json')  //
    //在module.exports添加配置
    module.exports={
        ...
        plugins:[
            new webpack.DllReferencePlugin({
                mainfest
            })
        ],
        ...
    }
    

    然后把CommonsChunkPlugin的这块注释掉,不然要重复打包。

    • 最后在index.html加上一行
    <script src="./static/vendors.dll.js"></script>
    
    2、 第二种方案就是用bootcdn
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容

  • 相关概念 混合开发和前后端分离 混合开发(服务器端渲染) 前后端分离后端提供接口,前端开发界面效果(专注于用户的交...
    他爱在黑暗中漫游阅读 2,777评论 4 45
  • vue-cli搭建项目 确保安装了node与npm 再目标文件夹下打开终端 执行cnpm i vue-cli -g...
    Akiko_秋子阅读 3,215评论 1 22
  • 一把年纪了,还是喜欢做一些没什么用的事。 还是喜欢看书,看来看去的,最后买回家的,多数还是纯文学的书,在这样一个文...
    铅笔芒种阅读 514评论 0 1
  • 我终于长大了。是个成年人了。 而你却老了,好老好老了。 你的老已经不是用皱纹来形容了。 而是记性,是话语,是行动。...
    甫萧鹏阅读 218评论 0 0
  • 5月回顾 001生活 5月重新租了房子,于是买了一个小电饭煲,试着自己给自己煮粥喝,早上终于不再只吃包子豆浆了。因...
    凉意的秋阅读 165评论 0 1