前端项目宣布后的题目总结

弁言

近来做的项目已靠近尾声,方才发到线上,回忆和总结一下这段时候碰到的题目和个人的一些主意。

select下拉修正和回复

//部份下拉选项
 <select  v-model="offer.measureUnit"  :data-index="index" v-select-change="offer.measureUnit">
                <option v-for="option in selectList['measureUnit']" v-bind:value="option" >
                        {{option}}
                 </option>
   </select>
  <!------------------------------------------->
 //select绑定的指令部份操纵
  Vue.directive('select-change', {
      update: function (el,binding) {
         var oldValue=binding.oldValue;
          var newValue=binding.value;
          if(cache.submitFlag==true){
              return;
          }
          if(validatorRules.isBlank(oldValue)||validatorRules.isBlank(newValue)||(oldValue==newValue)){
              return;
          }
          if(el.getAttribute("measureUnitFlag")!="1"){
            var index= el.dataset.index;
                  new Dialog.tip({
                     ………………xxx逻辑
                      close(){
                                   el.setAttribute('measureUnitFlag','1');
                                    vm.formData[index].measureUnit=oldValue;
                              },
                  })
          }else {
              el.setAttribute("measureUnitFlag","0");
          }
          return false;
      }
  })
    <!------------------------------------------->
    恢复按钮部份逻辑操纵
               vm.formData=formDataFail;
                   Vue.nextTick(function () {
                        cache.submitFlag=false;
                  })
                   

申明 需求:点击select下拉选项,弹窗提醒是不是修正(select最多有200个)。完成:不适合用watch和computed,因为offer.measureUnit太多,且每一个都是自力的差别的相应式属性,斟酌用指令,点击恢复按钮,列表从新衬着,此时指令会悉数实行一遍,因为指令是在同一个组件模板中。经由历程在指令中比较前后值,以及设置cache.submitFlag防备不必要更新致使的弹窗,衬着。衬着终了,回复submitFlag,防备select下拉选项单个点时击失效;measureUnitFlag是为了防备点击同一个下拉选项时,在弹窗逻辑中点击不修正赋原值时反复弹窗状况。

知识点1 指令的道理,在vue2中是函数式组件(就是说模板->render函数),因为数据变化,致使依靠watcher–>update(),在每次组件经vdom diff,update后绑定在组件上的指令,只需组件中相应式属性有一个更新,指令悉数实行一遍.
知识点2 nextTick的机制

export function queueWatcher (watcher: Watcher) {
  const id = watcher.id
  //这里保证了雷同的watcher只要一个会被加入到异步行列中,
  //虽然第一个watcher会放进去,然则对dom的操纵是在nextTick异步操纵中,所以终究实行依靠的update要领时,取的一定是最新的data值。
  if (has[id] == null) {
    has[id] = true
    if (!flushing) {
      queue.push(watcher)
    } else {
      //对应watch内里触发watch的状况,已革新的话,依据watcher标识的id删除watcher
      let i = queue.length - 1
      while (i >= 0 && queue[i].id > watcher.id) {
        i--
      }
      queue.splice(Math.max(i, index) + 1, 0, watcher)
    }
    // queue the flush
    if (!waiting) {
      waiting = true
      nextTick(flushSchedulerQueue)  //异步行列实行  将waiting和flushing都设为false
    }
  }
}
然后nextTick(flushSchedulerQueue)-->三种兼容机制完成异步处置惩罚(基于优先级递次依次是Promise、MutationObserver、setTimeout)-->nextTickHandler()-> watcher.run()

打包题目

因为几个项目依靠一个大众目次,项目1是基于webpack1,项目2是gulp。依靠的大众目次在被import时能被打包,然则不能编译。当时没找到缘由,一致改成webpack2能够了,末了做项目3时,基于vue2脚手架,涌现一样题目,探究一番,找到缘由,include致使能打包然则不能编译。

 {
        test: /\.js$/,
        loader: 'babel-loader',
         exclude: /node_modules/,
        // include: [resolve('src'), resolve('test')],
        options: {
          presets: [
            ['es2015']
          ]
        }
 }

数据校验

数据200条校验,在毛病多时要举行大批失足款式衬着,比较卡,改成异步(基于setTimeout)单条校验衬着,同时搭配上进度条动态展现处置惩罚历程,处理以上题目。

bug

get要求在ie和360兼容形式下屡次操纵被缓存,接口保护之前的,之前没测出来,发到线上测试考证时发明这个题目,同事一神助攻,协助我疾速定位找到这个bug,这个bug暴露我ie下调试东西运用短缺,指的是win7上ie调试东西,我日常平凡也没用到过。然后处理体式格局能够加时候戳或许改成post要求或许后端设置制止缓存的header。

require.ensure

require.ensure只能是用来完成按需加载,同时具有代码支解的作用,不能完成并行加载,假如要完成并行而且按递次能够用浏览器自身的机制。webpack的require.ensure底层是经由历程jsonp+promise的体式格局,下面是我写的例子被编译后source部份截取,展现出来以便更好的申明题目。

_//1:__webpack_require__.e 加载chunk.js 异步(动态建立script)的体式格局,这个操纵被封装成promise返回_
__webpack_require__.e/* require.ensure */(0).then((function (require) {
    console.log("begin");
    var module2 = __webpack_require__(2);
   
  }).bind(null, __webpack_require__)).catch(__webpack_require__.oe);
  
_  ---------------------------
 // 2:jsonp体式格局,主要功用是装置chunk_
   window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {
       var moduleId, chunkId, i = 0, resolves = [], result;
       for(;i < chunkIds.length; i++) {
          chunkId = chunkIds[i];
          if(installedChunks[chunkId])
             resolves.push(installedChunks[chunkId][0]);
          installedChunks[chunkId] = 0;
       }
       
       if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);
       while(resolves.length)
          resolves.shift()();  _//3:实行第一步promise的resolve要领,从而能够继承实行then当中的营业逻辑。_
  
    };

开辟

合理的运用dev-server的热加载机制,优化的开辟设置提拔开辟效力;合理的运用mixins选项,模块化拆分封装功用;应用函数式头脑,封装笼统函数单位,营业邻近的一组功用封装成一个模块;症结变量以及逻辑单位加上必要解释,范例的编程作风等。感悟:今后我在code时,half or one day time,先在头脑中先大抵走一遍,做好圆满的前期项目计划–>手艺选型、构造构造、难优化点、可归结的笼统功用等等 –>A good beginning is half of success.

总结

几乎没有完成不了的视觉和交互需求,只要小部份完成起来需斟酌时候本钱题目。范例、TDD、机能、开辟效力等等都寻求圆满有难题,找到一个优越的动态平衡点很主要。路漫漫其修远,吾将高低而求索。

    原文作者:jsdt
    原文地址: https://segmentfault.com/a/1190000009862697
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞