博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
日常开发问题总结
阅读量:3949 次
发布时间:2019-05-24

本文共 5229 字,大约阅读时间需要 17 分钟。

日常开发问题总结

2021/06/21

new Array().fill() 用法

问题描述
  • 当借助 new Array() 生成指定数组长度的假数据时,发现并没有填充数据,返回依然是空数组
const data = new Array(5)console.log(data); // [empty x 5]
问题原因
  • 数组参数
    • elementN
      • Array 构造器会根据给定的元素创建一个 JavaScript 数组,但是当仅有一个参数且为数字时除外
      • 注意,后面这种情况仅适用于用 Array 构造器创建数组,而不适用于用方括号创建的数组字面量
    • arrayLength
      • 一个范围在 0 到 232-1 之间的整数,此时将返回一个 length 的值等于 arrayLength 的数组对象
      • 该数组此时并没有包含任何实际的元素,不能理所当然地认为它包含 arrayLength 个值为 undefined 的元素
      • 如果传入的参数不是有效值,则会抛出 RangeError 异常
解决方法 fill()函数
  • fill()函数方法,使用给定的元素填充数组默认为undefined,让数组有值
const data1 = new Array(5).fill()console.log(data1); // [undefined, undefined, undefined, undefined, undefined]const data2 = new Array(5).fill(false)console.log(data2); // [false, false, false, false, false]
fill() 函数用法
  • 函数参数
    • value:填充值
    • start:填充起始位置,可以省略
    • end:填充结束位置,可以省略,实际结束位置是end-1
arr.fill(value, start, end)// 采用一默认值填初始化数组const arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]arr1.fill(7) // 7,7,7,7,7,7,7,7,7,7,7// 制定开始和结束位置填充,实际填充结束位置是前一位const arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]arr3.fill(7, 2, 5) // 1,2,7,7,7,6,7,8,9,10,11// 结束位置省略,从起始位置到最后const arr3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]arr3.fill(7, 2) // 1,2,7,7,7,7,7,7,7,7,7

this.$set() 用法

问题描述
  • 在开发中,为 data 中的某一个对象添加一个属性,发现对象已经添加该属性,但是视图层并没有更新该数据
{
{ student.name }}
data() {
return {
student: {
name: "张三", }, };},created() {
},methods: {
setMessage() {
this.student.age = 15; console.log(this.student); },}
问题原因
  • 由于受 JavaScript 的限制vue 不能监听对象属性的添加和删除,因为在 vue 组件初始化的过程中,会调用 getter 和 setter 方法,所以该属性必须是存在在data中视图层才会响应该数据的变化
解决方法 this.$set(obj, key, value)
setMessage() {
this.$set(this.student, "age", 15); console.log(this.student);},
解决方法 Vue.set(obj, key, value)
import Vue from 'vue'...setMessage() {
Vue.set(this.student, "age", 15); console.log(this.student);},
解决方法 Object.assign(target, …sources)
setMessage() {
this.student.age = 15 this.student = Object.assign({
}, this.student) console.log(this.student)}

2021/06/24

mixins() 用法

问题描述
  • 当项目越来越大,组件之间可能存在很多相似的功能,如果每个组件中去重复定义属性和方法会使得项目出现代码冗余提高了维护难度,针对这种情况官方提供了 Mixins 特性
解决方法 Mixins
  • 什么是 Mixins
    • 一种分发 Vue 组件中可复用功能的非常灵活的方式
    • Mixins 是一个 js 对象
      • 包含组件中 script 项中的任意功能选项,如data、components、methods 、created、computed等等
    • 将共用的功能以对象的方式传入 Mixins 选项
      • 当组件使用 Mixins 对象时所有 Mixins 对象的选项都将被混入该组件本身的选项中来
    • 可以提高代码的复用性保持代码干净和易于维护
  • 什么时候用 Mixins
    • 存在多个组件中的数据或者功能很相近时,可以利用 Mixins 将公共部分提取出来
    • 通过 Mixins 封装的函数,组件调用是不会改变函数作用域外部的
  • 如何使用 Mixins
    • 需要调用的组件中引入 Mixins 文件,然后在 export default 中引入需要的组件即可
import {
myMixins } from "@/components/myMixins"export default {
mixins: [myMixins]}
Mixins 特点
  • 方法和参数在各组件中不共享
    • 组件调用 Mixins将其属性合并到自身组件中
    • 但是其属性只会被当前组件所识别并不会被共享
    • 其他组件无法从当前组件中获取到 Mixins 中的数据和方法
Mixins 合并冲突
  • 问题描述
    • 引入 Mixins 后组件会对其进行合并
    • Mixins 中的数据和方法拓展到当前组件中
    • 合并的过程中会出现冲突
  • 冲突点
    • 对象(components、methods 、computed、data)的选项,混入组件时选项会被合并键冲突时优先组件组件中的键会覆盖混入对象的
    • 函数(created、mounted)的选项,混入组件时选项会被合并调用混合对象里的钩子函数在组件里的钩子函数之前调用
Mixins 与 Vuex 区别
  • vuex
    • 用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改
  • Mixins
    • 可以定义共用的变量在每个组件中使用,引入组件中之后,各个变量是相互独立的值的修改在组件中不会相互影响
Mixins 与公共组件的区别
  • 组件
    • 在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据 props 来传值,但本质上两者是相对独立
  • Mixins
    • 则是在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件

Vue.extend 用法

问题描述
  • 在 vue 项目中,初始化的根实例后,所有页面基本上都是通过 router 来管理,组件也是通过 import 来进行局部注册
  • 缺点
    • 组件模板都是事先定义好的,如果要从接口动态渲染组件怎么办?
    • 所有内容都是在 #app 下渲染注册组件都是在当前位置渲染
    • 如果要实现一个类似于 window.alert() 提示组件要求像调用 JS 函数一样调用它,该怎么办?
    • 这时候,Vue.extend + vm.$mount 组合就可以解决
解决方法 Vue.extend(options)
  • 参数
    • {Object} options
  • 用法
    • 使用基础 Vue 构造器创建一个子类
    • 参数是一个包含组件选项的对象
    • data 选项是特例,在 Vue.extend() 中它必须是函数
// 创建构造器var Profile = Vue.extend({
template: '

{

{firstName}} {
{lastName}} aka {
{alias}}

', data: function () {
return {
firstName: 'Walter', lastName: 'White', alias: 'Heisenberg' } }})// 创建 Profile 实例,并挂载到一个元素上。new Profile().$mount('#mount-point')

Walter White aka Heisenberg

  • 参考
    • extend 创建的是 Vue 构造器,而不是平时常写的组件实例
    • 所以不可以通过 new Vue({ components: testExtend }) 来直接使用
    • 需要通过 new Profile().$mount('#mount-point') 来挂载到指定的元素
    • 或者使用 vue.component 进行实例化来模拟组件
    • 在实例化 extends 组件构造器时,传入属性必须是 propsData、而不是props

2021/06/28

iOS 获取时间为 NAN

问题描述
  • 在 PC 和 Android 上选取时间是正常的,但是在 iOS 上拿到的时间为 NAN
问题原因
  • 在日期的处理方式 Android 和 iOS 两个系统是有所区别的
    • iOS 端是以 / 做分割的,而常用的都是以 - 分割,所以导致 iOS 下时间解析不了就变成NAN了
解决方法 fill()函数
  • 将时间格式中 - 换成 /
new Date("2019/01/01 00:00:00").getTime()"2019-01-01 00:00:00".replace(/\-/g, '/') // 正则

2021/07/01

vue 遍历对象顺序不对问题

问题描述
  • 在 Vue 的 for 循环遍历对象时,无法保证指定顺序
问题原因
  • Vue 进行 for 循环遍历对象时的过程
    • 先判断是否有 iterator 接口,如果有,循环执行 next() 方法
    • 没有 iterator 的情况下,会调用 Object.keys() 方法,在不同的浏览器中,JS 引擎不能保证输出顺序一致
解决方法
  • 保证对象的输出顺序可以把对象放到数组中,作为数组的元素
// 将对象转成数组并依据id排序data() {
return {
navListArr: [] };},created() {
// 方案一 let arr = [] Object.keys(this.navList).forEach((key, index) => {
arr.push(this.navList[key]) }) arr.sort(this.compare("id")) this.navListArr = arr // 方案二 let array = []; for (var i in this.navList) {
if (Object.hasOwnProperty.call(this.navList, i)) {
const element = this.navList[i] array.push(element) } } array.sort(this.compare("id")) this.navListArr = array},methods: {
// 对象排序 compare(property) {
return function(a, b) {
var value1 = a[property] var value2 = b[property] return value1 - value2 } }}

转载地址:http://cjqwi.baihongyu.com/

你可能感兴趣的文章
Abstracting the New APIs 抽象出新的API
查看>>
Proxying to the New APIs 代理新的API
查看>>
Creating an Implementation with Older APIs 用较早版本的APIs实现抽象类
查看>>
Using the Version-Aware Component 使用版本识别组件
查看>>
Enhancing Security with Device Management Policies 加强安全与设备管理策略 Developing for Enterprise
查看>>
Advertising without Compromising User Experience 不降低用户体验的广告
查看>>
Planning Screens and Their Relationships 规划屏幕和它们的关系
查看>>
Planning for Multiple Touchscreen Sizes 规划多个触摸屏尺寸
查看>>
Providing Descendant and Lateral Navigation 提供下一代和横向导航
查看>>
GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG解释 + 数据解析
查看>>
android如何使得电阻屏在第一次开机时自动叫起屏幕校准程序
查看>>
android如何实现:当开启图案解锁时,取消滑动解锁
查看>>
Providing Ancestral and Temporal Navigation 设计高效的应用导航
查看>>
Putting it All Together: Wireframing the Example App 把APP例子用线框图圈起来
查看>>
Implementing Lateral Navigation 实现横向导航
查看>>
Implementing Ancestral Navigation 实现原始导航
查看>>
Implementing Temporal Navigation 实现时间导航
查看>>
Responding to Touch Events 响应触摸事件
查看>>
Defining and Launching the Query 定义和启动查询
查看>>
Handling the Results 处理结果
查看>>