关于2020年8月7日—8月29日实习学习到的内容

关于2020年8月7日—8月29日实习学习到的内容

我是一名大三(准大四)的学生,本专业学习通信工程,从三月份自学前端至今,七月份找到了一份实习,感觉在实习中学习到的内容会比较深入一点叭。关于这篇文章有一些内容是我从网上搜索到的,并不都是个人编写的哈!如有侵权之类的,觉得不太好的可以和我讲。

2020/8/7
任务需求:
H5、PC端答题根据约定返回字段值显示隐藏页面奖励提示(控制按钮两层重叠);
前期代码v-if一个变化另一个会随着变化,改为v-show:
谦虚、谨慎
一、v-if、和v-show的区别为:
v-show:
1、v-show仅仅控制元素的显示方式,通过display属性的none;
2、当我们需要经常切换某个元素的显示与隐藏时,使用v-show会更加节省性能上的开销
v-if:
1、v-if会控制这个DOM节点的存在与否;
2、运行条件很少改变,使用v-if较好
二、字段对应位置:
本次任务后端给的接口字段不在应该出现的位置,解决思路为为现有字段追加对应属性;
前期还需要判断 1、所需对象是否存在; 2、所需对象是否存在所需属性; 3、Object.keys(xxx).length > 0 判断对象中的属性值的个数大于0
三、为对象增添属性、判断属性是否存在:
1、为对象添加属性: 对象名[‘属性名’]=属性值
awardObj[‘hideRewardPrompt’] = this.wj.hideRewardPrompt
2、判断属性是否存在: 对象名.hasOwnProperty(‘属性值’)
shareObj.hasOwnProperty(‘hideShareRewardPrompt’
四、利用双向绑定获取上次传参:
此次任务需要首先为v-model绑定的值赋初始值,利用接口去获得奖励信息,将奖励信息中对应字段的值赋给v-model绑定的值;然后将v-model绑定的值直接作为保存奖励信息接口的参数传递给后台;
五、计算属性中的方法可直接写在样式中,不需要加()
v-show=“getAwardType === 1”
六、解决冲突(标记为已解决):
遇到冲突之后先贮藏,解决冲突之后右击文件点击标记为已解决,即可继续提交代码;
七、错误处理信息提示(.catch);
.catch(err=>{
this.$message.error(err.message)
})
八、判断时精简代码:
0转换为布尔值是false,1转换为布尔值是true;
1==true
res:true
九、据说是vue基础:
mixins: [PatchMixins],另一个页面引用之后则可以使用PatchMixins中的全部内容;

2020/8/10
任务需求:发布设置-微信红包页面(增加单选框,进行切换控制)
一、双单选框之间进行切换,默认选中写法:


固定金额
随机金额


增加prop属性绑定,增加v-model双向数据绑定。主要问题涉及paymentInfo.status中的值与:label;
是否匹配,匹配则默认选中,此刻需注意: label=“1”,表示label的值为数字1; label=“1”,表;
示label的值为字符串1。
二、el-input中无法输入的问题:
el-input因层级嵌套太深,导致无法输入,可给其使用v-model进行双向绑定。
三、如何拿到对应验证表单中的值:
let val = this.paymentInfo[rule.fullField];使用rule.fullField。

2020/8/11
一、二倍图的使用方式:
引入二倍图之后设置宽和高,还需设置background-size
width: 20px;
height: 20px;
background-size: 20px 20px;
vant中van-notice-bar标签中的left-icon不仅可以引入图标,还可以引入图片;
二、font-size: $font-size-large;
font-size:small; 设置文字字体大小为小
font-size:x-large;设置对象字体大小为较大
font-size:larger;设置对象字体大小为大
三、elementUI中表单验证:
template中

data的return中
paymentInfoRules: {
maxNum: [{ validator: checkRandom, trigger: ‘blur’}]
},
const checkRandom = (rule, value, callback) => {
//可以分别打印
let val = this.paymentInfo[rule.fullField]
if (testRandom.test(rule.fullField) || val === ‘’) {
this.disabled = false
} else {
this.disabled = true
callback(‘请输入有效数字’)
}
}
四、Vant使用方式:
vant组件引入,官网有
五、JXS写法:
JSX中不能写指令v-for、v-if等,可以使用三元表达式代替;
{needAuditFlagAward ? ‘并审核通过’ : ‘’}
并且需要用大括号进行包裹

2020/8/12
一、滚动时单个显示的问题,转换思想:
标签包裹转换思维,无需添加多余类名,直接利用现有三元表达式进行判断;
二、移动端文字上下滚动用vant中的组件、PC端自行查找组件:
https://blog.csdn.net/xinzi11243094/article/details/88681511?ops_request_
misc=%257B%2522request%255Fid%2522%253A%2522159715053519724811837046%2522
%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159
715053519724811837046&biz_id=0&utm_medium=distribute.pc_search_result.none
-task-blog-2~all~first_rank_ecpm_v3~pc_rank_v2-2-88681511.first_rank_ecpm_
v3_pc_rank_v2&utm_term=vue+%E5%AE%9E%E7%8E%B0%E6%96%87%E5%AD%97%E4%B8%8A%E
4%B8%8B%E6%BB%9A%E5%8A%A8&spm=1018.2118.3001.4187
三、JSX中:
在export default中利用render(h, context)拿到所需要的属性;
不能够在JSX中使用data,结果还是underfined
四、复习CSS动画animation transition(过渡):
谁做动画给谁加:
    animation: myMove 5s ease-in infinite;
    transition:all 3s ease 0s;
    animation-fill-mode: forwards;
注意动画名称:
    @keyframes myMove {
      0% {
        transform: translateY(0);
      }
      100% {
        transform: translateY(-100px);
      }
    }

2020/8/13
一、JSX中判断类名写法:
<div class={animation ? 'slideBox animate' : 'slideBox awardAnimate'}>
JSX中多了很多用大括号进行包裹的地方;
二、学习王润泽滚动屏利用类名进行高度判断写法:
.finally(e => {
    setTimeout(() => {
      this.initInfoHeight && this.initInfoHeight()
    })
  })
},
他说加setTimeout为了防止不出错,目前未懂。
initInfoHeight() {
    let el = this.$refs.infoEl
    let oh = el.offsetHeight
    let wh = window.innerHeight
    if (oh > wh) {
      el.style.position = 'static'
      el.style.minHeight = '100%'
      el.style.height = ''
      this.$refs.infoScroll.refresh()
    } else {
      el.style.height = '100%'
    }
  },
三、解决方式:采取CSS动画
在PC端尤其JSX中显示页面提示语滚动最后采取的方式仍未CSS动画;单个显示利用判断类名。
四、逻辑思维:
微信红包中的答题红包新增字段前期准备中,自己发现有一个bug,直接进来显示正常而当叉
掉不刷新再次点击会出现问题和对应状态不保存的问题;仔细想想发现在叉掉dialog时,没有
将对应字段数据重置,导致缺少字段造成;

2020/8/14
一、Window open() 方法:
open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口。
二、setTimeout用法:
setTimeout(function(){ alert("Hello"); }, 3000);
三、float: left;
以为float: left;不起作用,其实是本身float: left;后的元素会占据原有位置;position:
absolute则不会;
垂直居中:
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
四、用v-if控制整个标签的显示与隐藏
五、js中try、catch、finally的执行规则
try:语句测试代码块中的错误;
catch:只有try里面的代码块发生错误时,才执行这里面的代码;
finally:无论有无异常里面的代码都会执行;
六、promise用法:
var promise = new Promise(function(resolve, reject) {
  if (/* 异步操作成功 */){
  resolve(value);
  } else {
  reject(error);
  }
});
promise.then(function(value) {
 // success
}, function(value) {
 // fail
await后面必须跟promise才能产生同步效果;
后面的函数不方便用.then的时候,可以直接在promise函数中写
resolve()这样能够继续执行后续代码;
七、宏任务、微任务;
setTimeout(_ => console.log(4))

new Promise(resolve => {
  resolve()
  console.log(1)
}).then(_ => {
  console.log(3)
})

console.log(2)
//res:1 2 3 4
也就是new Promise在实例化的过程中所执行的代码都是同步进行的,而then中注
册的回调才是异步执行的。在同步代码执行完成后才检查是否有异步任务完成,并
执行对应的回调,而微任务又会在宏任务之前执行。
setTimeout(_ => console.log(4))

new Promise(resolve => {
  resolve()
  console.log(1)
}).then(_ => {
  console.log(3)
  Promise.resolve().then(_ => {
    console.log('before timeout')
  }).then(_ => {
    Promise.resolve().then(_ => {
      console.log('also before timeout')
    })
  })
})
console.log(2)
即便继续在Promise中实例化Promise,其输出依然会早于setTimeout的宏任务
八、同步任务与异步任务:
同步任务:会立即执行的任务
异步任务:不会立即执行的任务(异步任务又分为宏任务与微任务)
https://blog.csdn.net/qq_42833001/article/details/87252890

2020/8/17
一、this.$store.dispatch
vuex中的内容:
this.$store.dispatch('setWj', res.data.data)
表示调取setWj方法,并更新;
二、prop
父组件向子组件传值用prop;
prop是单向数据流;
三、elementUI 表单验证:
表单验证理解好了也不是很难;
有关属性绑定:要给el-form增加:rules属性规则:rules="xxx",xxx来定义验证规则;
其次要给单独表单列表项prop属性设置为需校验的字段名;
this.$refs[formName].validate((valid) => {
if (valid) {
  alert('submit!');
} else {
  console.log('error submit!!');
  return false;
}
官网上述内容是为了点击确定按钮的时候对表单整体进行校验;
四、项目搭建
1.使用cnpm install -g @vue/cli安装vue脚手架(cnpm为淘宝镜像,npm为国外地址)
使用vue -V查看安装vue脚手架的版本;
  注:在这个过程中,遇到“无法加载文件 C:\Users\28031\AppData\Roaming\npm\
  vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.micro
  soft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。”此问题:
  解决方式为:
    运行powershell(管理员身份)
    输入 set-ExecutionPolicy RemoteSigned
  指定版本: cnpm install -g @vue/cli@版本号
2.搭建项目:
  vue create vue-demo3.0(名字)
  接下来可以默认、手动安装;
  Babel将ES6语法转换为浏览器能够识别的;

2020/8/18
一、计算属性:
计算属性一般就是用来通过其他的数据算出一个新数据,而且它有一个好处,把新的数据缓存下来,
当其他的依赖数据没有发生改变,它调用的是缓存的数据,极大提高了程序的性能;
二、@:
import logoImg from '@/config/logo/logo.png' @表示进入到对应的根目录下;
三、图片地址:
当将图片地址写在双向绑定的数据中,需要加require,
require("@/assets/img/1.jpg"),
四、window.open()方法:
第一个参数可以写要跳转的地址,第二个参数可以写跳转页面的形式(当前页面打开、新页面打开、......)
_blank新页面打开;
_self当前页面打开;
还有很多巴拉巴拉,可以上网去查;
五、JSX中属性绑定,和事件绑定
属性绑定:v-model={publish} 
事件绑定:onChange = {context.listeners.publishToHall}
主要是{}语法,和相关参数的传递;
六、报错:You may have an infinite update loop in a component render function.
https://blog.csdn.net/u011584949/article/details/83821278

2020/8/19
一、$route、$router
$route表示当前路由信息对象;可以获取一些名字啊等等信息;
$router表示路由全局的实例对象,可以实现跳转功能;
二、vuex
在vuex中把对应的辅助函数引进来,import {mapGetters} from 'vuex'

2020/8/20
一、LeetCode:除自身以外数组的乘积:
未优化之前:
  var productExceptSelf = (nums) => {
    const N = nums.length
    const leftOutput = []
    const rightOutput = []
    const output = []
    leftOutput[0] = 1
    rightOutput[N-1] = 1
    for (let i = 1; i < N; i++) {
      leftOutput[i] = leftOutput[i - 1] * nums[i-1]
    }
    for (let i = N-2; i > 1; i--) {
      rightOutput[i] = rightOutput[i-1] * nums[i+1]
    }
    for (let i = 0; i < N; i++) {
      output[i] = leftOutput[i]*rightOutput[i]
    }
    return output
  }

注重复杂度:
 var productExceptSelf = (nums) => {
   const N = nums.length
   const output = []
   output[0] = 1
   for (let i = 1; i < N; i++) {
     output[i] = output[i] * nums[i-1]
   }
   let rightOutput = 1
   for (let i = N-1; i >= 0; i--) {
     output[i] = output[i] * rightOutput
     rightOutput = rightOutput * nums[i]
   }
   return output
 }
 二、括号生成;DFS回溯
 const generateParentthesis = (n) => {
   const res = []
   function dfs(leftRemain, rightRemain, str) {
     if(leftRemain === 0 && rightRemain === 0) {
       res.push(str)
       return
     }
     if(leftRemain > 0) {
       dfs(leftRemain-1, rightRemain, str + '(')
     }
     if(leftRemain < rightRemain) {
       dfs(leftRemain, rightRemain-1, str + ')')
     }
   }
   dfs(n, n, '')
   return res
 }
 三、小偷如何偷最多的money
 优化前:
 const rob = (nums) => {
   const len = nums.length
   if (len === 0) return 0
   if (len === 1) return nums[0]
   let dp = new Array[len]
   dp[0] = nums[0]
   dp[1] = Math.max(nums[0], nums[1])
   let res = dp[1]
   for(let i = 0; i < len; i++) {
     dp[i] = Math.max(nums[i] + dp[i-2],dp[i-1])
     res = Math.max(res, dp[i])
   }
   return res
 }

 优化后:
 const rob = (nums) => {
   const len = nums.length
   if (len === 0) return 0
   if (len === 1) return nums[0]
   let preMax = nums[0]
   let curMax = Math.max(nums[0], nums[1])
   let res = curMax
   for(let i = 0; i < len; i++) {
     let temp = curMax
     curMax = Math.max(nums[i] + preMax, curMax)
     preMax = temp
     res = Math.max(res, curMax)
   }
   return res
 }

 2020/8/21
 一、LRU缓存机制 LRU Cache|双向链表 哈希表JS
 class ListNode {
    constructor(key, value) {
      this.key = key
      this.value = value
      this.next = null 
      this.prev = null
    }
 }

 // 内存所接受的容量
 class LRUCache {
    constructor(capacity) {
      this.capacity = capacity
      this.hashTable = {}
      this.count = 0
      this.dummyHead = new ListNode()
      this.dummyTail = new ListNode()
      this.dummyHead.next = this.dummyTail
      this.dummyTail.prev = thi.dummyHead
    }

    get(key) {
      let node = this.hashTable[key]
      if (node === null) return -1
      this.moveToHead(node)
      return node.value
    }

    put(key, value) {
      let node = this.hashTable[key]
      if (node === null) {
        let newNode = new ListNode(key, value)
        this.hashTable[key] = newNode
        this.count++
        this.addToHead(newNode)
        if (this.count > this.capacity) {
          this.removeLRUItem()
        }
      } else {
        node.value = value
        this.moveToHead(node)
      }
    }

    moveToHead(node) {
      this.removeFromList(node)
      this.addToHead(node)
    }

    removeFromList(node) {
      let tempForPrev = node.prev
      let tempForNext = node.next
      tempForPrev.next = tempForPrev
      tempForPrev.prev = tempForPrev
    }

    addToHead(node) {
      node.prev = this.dummyHead
      node.next = this.dummyHead.next
      node.next.prev = node
      this.dummyHead.next = node
    }
 }

 二、Webpack 极速配置技巧
 三件套:
    webpack
    webpack-cli
    webpack-dev-server

  处理JS -> ES6 ES7 ES8 装饰器

  六件套:
  babel-loader@7
  babel-core
  babel-preset-env 

  babel-plugin-transform-runtime

  babel-plugin-transform-decorators
  babel-plugin-transform-decorators-legacy

  处理  sass -> css -> style

  四大件
  sass-loader
  node-sass
  css-loader
  style-loader

  // 需要加前缀
  postcss-loader autoprefixer

  处理模板
  ejs-loader
  (ejs tpl后缀)

  处理HTML
  
  html-webpack-plugin

  --save-dev (-D) :安装在开发环境下
  --save (-S):安装在生产环境下

  2020/8/24
  一、key关键字的作用:
  本次bug是对应地址的视频显示不一致的问题,这个过程中打印了各种url,发现都是正确的。
  本次是有一个弹层中有一个组件,在组件中是视频播放控制,由于组件中没有绑定key值,所
  以显示有问题;当有了关键字之后可以用完即销毁,则不缓存上次的url。
  二、vue中loading组件样式:
  https://blog.csdn.net/cuk5239/article/details/107664087
  :legend="false" 判断是否显示数字
  
  2020/8/25
  一、avue相关内容的使用
  avue中的设置表格底色变换,利用方法添加类名的方式;
  二、转换思维,td>>>tr
  需求:需要点击对应表格后面的按钮致使整行底色发生变化;但是由于表格本身的隔行变色以
  及鼠标经过底色变换会覆盖需要变换的颜色,利用avue添加类名的方式给tr设置底色,并不能
  实现此效果,此时需要变换td的底色,进行更深层次的变换,能够解决此问题;

  2020/8/26
  一、toLocaleString()运行环境不一样产生结果不一致
  需求:需要将国际时间转换为北京时间:2017-03-31T08:02:06Z ---> 2017-03-31 16:02:06
  历经千难万险终于找到的下面这个方法:
    var utc_datetime = "2017-03-31T08:02:06Z";        

    function utc2beijing(utc_datetime) {
    // 转为正常的时间格式 年-月-日 时:分:秒
    var T_pos = utc_datetime.indexOf('T');
    var Z_pos = utc_datetime.indexOf('Z');
    var year_month_day = utc_datetime.substr(0,T_pos);
    var hour_minute_second = utc_datetime.substr(T_pos+1,Z_pos-T_pos-1);
    var new_datetime = year_month_day+" "+hour_minute_second; // 2017-03-31 08:02:06        

    // 处理成为时间戳
    timestamp = new Date(Date.parse(new_datetime));
    timestamp = timestamp.getTime();
    timestamp = timestamp/1000;       

    // 增加8个小时,北京时间比utc时间多八个时区
    var timestamp = timestamp+8*60*60;        

    // 时间戳转为时间
    var beijing_datetime = new Date(parseInt(timestamp) * 1000).toLocaleString().replace(/年|月/g, "-").replace(/日/g, " ");
    return beijing_datetime; // 2017-03-31 16:02:06
    }       

    console.log(utc2beijing(utc_datetime));       
    结果兴高采烈的在Node环境中执行得到了想要的北京时间格式,但是,到项目中的浏览器环境中运
    行时就出现了问题,也就是所得格式有点差距;
    问了前端大佬说可能是toLocalString()这个方法在不同环境中所得到的结果不同,(虽然我没在
    网上查到)
    最后的解决方式出奇的气人,由于使用的是element UI组件库,只需要给日期控件加上两个format
    方法就可以了,我哭了。
    format="yyyy 年 MM 月 dd 日"
    value-format="yyyy-MM-dd"


    2020/8/27
    一、isequal和 == 区别(字符串和数组)
    isequal是需要自己定义的一个方法;
    都是用来判断是否相等
    二、store.dispatch
    vuex的状态管理,主要可能是vuex不了解,所以觉得这个地方是个问题,不太明白状态管理的意思,
    也不知道啥时候能明白;现在能够记住的是store.dispatch是异步的,store.commit是同步的
    三、vue使用.env文件配置全局环境变量       
    vue项目使用.env文件配置全局环境变量
      .env 全局默认配置文件,不论什么环境都会加载合并
      .env development开发环境下的配置文件
      .env production生产环境下的配置文件

    关于文件内容:
      属性名必须以VUE_APP_开头

    关于文件的加载:
    根据启动命令vue会自动加载对应的环境,vue是根据文件名进行加载的,所以上面说“不要乱起名,也无需专门控制加载哪个文件”
    比如执行npm run serve命令,会自动加载.env.development文件

    但是要注意重启项目之后才会生效。
    
    2020/8/29
    一、最小栈 Min Stack辅助栈
    var MinStack = function () {
      this.stack = []
      this.min_stack = []
    };
    MinStack.prototype.push = function (x) {
      this.stack.push(x)
      if (x <= this.min_stack[this.min_stack.length-1] || this.min_stack.length === 0) {
        this.min_stack.push(x)
      }
    };
    MinStack.prototype.pop = function () {
      let out = this.stack.pop()
      if(this.min_stack[this.min_stack.length - 1] === out) {
        this.min_stack.pop()
      }
    };
    MinStack.prototype.top = function () {
      return this.stack[this.stack.length - 1]
    };
    MinStack.prototype.getMin = function() {
      return this.min_stack[this.min_stack.length - 1]
    };
  二、Pow(x, n)快速幂:
  var myPow = function (num, power) {
    if (power < 0) return 1 / (num * myPow(num, -(power+1)))
    if (power === 0) return 1
    if (power === 1) return num
    let res = 1
    while (power > 1) {
      if (power % 2 === 1) {
        power--
        res = res*num
      }
      num = num * num
      power = power / 2
    }
    return res * num
  }

  递归
  var myPow = function (num, power) {
    if (power < 0) return 1 / (num * myPow(num, -(power+1)))
    if (power === 0) return 1
    if (power === 1) return num
    if (power % 2 === 1) {
      return num*myPow(num, power-1)
    } else {
      return myPow(num*num , power/2)
    }
  }

  二叉树的最近公共祖先
  var lowestCommonAncestor = function(root, p, q) {
    if(root === null || root === q || root === p) {
      return root
    }
    let left = lowestCommonAncestor(root.left, p, q)
    let right = lowestCommonAncestor(root.right, p, q){
      if (left && right) {
        return root
      }
      return left ? left : right
    }
  }

emmm 越学感觉越差的多的样子,希望以后的我有所进步ba!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值