当前位置: 首页 > news >正文

【Vue五分钟】 vue练习题、面试题解答

📑博客主页:@丘比特惩罚陆

💖欢迎关注:点赞收藏⭐留言✒
💬系列专栏:web前端、嵌入式、笔记专栏
🎮 加入社区: 丘比特惩罚陆
🥇人生格言:选对方向,每走一步都是进步!
✒️欢迎大佬指正,一起学习!一起加油!

👏 希望大家能小手一动,帮忙点个赞!

😁资源邮箱:2237814512@qq.com

目录

1.第一题:Vue监控属性警告问题

2.第二题:this.$emit问题

3. 第三题:同名插槽问题

4.第四题:为什么index不可用做key?

5.第五题:底层原理问题

6. 第六题:防抖改造问题

7.第七题:设计秒杀倒计时组件

8.第八题:生命周期和指令钩子顺序

9.第九题:v-ant-ref指令回调问题


1.第一题:Vue监控属性警告问题

   子组件为什么不可以修改父组件传递的Prop,如果修改了,Vue是如何监控到属性的修改并给出相应的警告呢?

解答:
  因为 vue 是单向数据流。如果一开始没有 created 则可以修改,加上 created 里面的 proxy 就可以阻止子组件 proxy.vue去修改父组件的 info ,当然如果是通过 $emit 就可以。 Proxy.js 是对 Vue 底层处理方式的一个最简化情况。
<template>
<div>
  info: {{ info }}
    <input :value=""info.name" Qinput="handleChange"/</div>
</template>

<script>
import proxy from "./proxy";
  export default {
   props:{
   info: object),
   created({
this.temp = ( name:"";
Object. keys(this.temp).forEach(key >{proxyfthis.info,this.temp,key););
),
methods: {
handleChange(e) {
//this.info.name = e.target.value;
 //this.SforceUpdateO);
this.$emit("change", e.target.value);)
}}};
</script>

proxy.js

const sharedPropertyDefinition = {
  enumerable: true,
  configurable: true
};
  export default function proxy(target,temp,key) {
  sharedPropertyDefinition.get = function proxyGetter() {
  return temp[key];
};
sharedPropertyDefinition.set = function proxySetter(val){
  temp[key) = val;
  if (!window.isUpdatingChildComponent) {
   console.error('不可以直接更改:$ikey'} ;
  window.isUpdatingChildComponent= false;;
Object.defineProperty(target, key,sharedPropertyDefinition);,

2.第二题:this.$emit问题

问题:this.$emit的返回值是什么?  --this;--如果需要返回值可以使用回调参数。

解答:

   

handleChange(e){
const res = this.$emit("change",e.target.value,val →> {console.log(val);
});
console.log(res,res =ss this);
},

handleEventChange(val,callback){
this.name = val;
callback("hello")Areturn "hello";
}
子组件返回了值和回调函数,我们这里就接受了值和回调函数即 callback 则不需要后面的 return 了。

3. 第三题:同名插槽问题

 问题:

     相同名称的插槽是否合并还是替换?

解答:

     Vue2.5版本,普通插槽合并、替换;Vue2.6版本,都是替换;

methods: {
validate(phone = "") {
  return phone 8& /^1[8-9]{10$/. test (phone);
}
}

4.第四题:为什么index不可用做key?

问题:

    为什么不能用index作为key?

解答;

   因为index设计到更新DOM性能问题以及会引起状态BUG问题,所以不可以用为key;

<template>
<div class="border">
  <Children v-for="(key, index) in list" :key=" index">
  <button @click="() => handleDe Lete (key)">删除</button>
  </Children>
  <button @click="handleAdd">添加</button>
</div>
</template>

<script>
import Children from "./Children" ;
 let key = 1;
export default {
  components:{
  Children 
  },
  data() {
   return {
     list: []
};
},
methods: {
  handleAdd() {
   this. list. push(key++);
},
handLeDe Lete(key) {
  const index = this. list. findIndex(k = k === key; 
  this. list. splice(index, 1);
}
}
};
</script>

<template>
<div class=" border2">
<input v-model=" phone" type=" number" />
<slot></slot>
</div>
</template>

<script>
export default {
data() {
  return {
   phone:""
};
}
};
</script>
如图每次点击添加的时候就会往数组加 1 ,而删除的时候则是数组变成了长度为 2 index 也跟着变了,那么删除的就是最后一个了,不管点的是哪一个。
修改后:(这样就正常了!!!)
<template>
<div class="border">
<Children v-for="key in List"( ey="key">
button @click="() => handleDe Lete( key )">删除</button>
</Children>
<button @click="handleAdd">添加</ button>
</div>
</ template>
<script>
import Children from "./Children" ;
let key = 1;
export default {
components: {
Children
},
data() {
return {
list: []
};
},
methods: {
handleAdd() {
this.list. push(key++);
},
},
handleDelete(key) {
const index = this. list. findIndex(k = k === key); 
this.list. splice(index, 1);
}
};
</script> 

5.第五题:底层原理问题

问题:

   数组有哪些方法支持响应式更新,如不支持如何处理,底层原理如何实现的?

解答:

  • 支持: push(、pop(、shift()、 unshift(、 splice(、 sort(、 reverse()
  • 不支持: filter()、concat()、 slice()
  • 原理同样是使用Object.defineProperty对数组方法进行改写

   对不支持的方法也很简单,只需要更改整个数组,赋值成一个新的数组就行。这里的改写其实就是中间做了一个代理层。


6. 第六题:防抖改造问题

 问题:

    对Watch1 Demo进行防抖改造,即直到用户停止输入超过500毫秒后,才更新fullName ;

解答:

  • setTimeout
  • lodash debounce
  • Demo 1.5/Wattch1 pro
第一种就是利用定时器做一个 500 毫秒的延迟就行(计算属性无法做到)。另一种就是利用第三方库什么的。
<template>
<div>
{{ fulUName }}
<div>f irs tName: <input v-model="f irs tName" /></div>
<div>lastName: <input v-mode L="las tName" /></div> 
</div>
</template>
<script>
export default {
data: function() {
return {
firstName: "Foo", 
lastName: "Bar" ,
fulIName: "Foo Bar"
};
},
watch: {
firstName: function(val) {
clearTimeout(this. firstTimeout);
this. firstTimeout = setTimeout() => {
this. fullName = val +””+ this. las tName; 
}, 5000
},
lastName: function(val) {
clearTimeout(this. lastTimeout);
this. LastTimeout = setTimeout(() => {
this. fulName = this. firstName +””+ val;
},500);
}
}
};
</script>

7.第七题:设计秒杀倒计时组件

    问题:设计一个秒杀倒计时组件;

   解答:

<template>
<div> 
<Spike :start-t ime="startTime" :end-t ime="endTime" />
</div>
</template>
<script>
import moment f rom "moment" ;
import Spike from "./Spike" ; 
export default {
components: {
Spike
},
data() {
return {
startTime: moment("2019-03-10 14:44:00"), 
endTime: moment("2019-03-08 14:46: 00")
};
}
};
</scripts>

难点在于如何对时间进行校验(因为时间是可以被修改的),一般是通过获取服务器的时间与本地时间计算一个时间差。


8.第八题:生命周期和指令钩子顺序

问题:

   怎么查看组件生命周期和指令周期钩子的顺序?

解答:

   新建是先组件再指令,更新是先指令再组件,销毁也是先组件再指令。

<temptate>
  <div class="border">
   <h1>A结点</h1>
   <button @click="() => changeColor()">改变color</button>
  <ChildrenB />
  <ChildrenC />
  <ChildrenD />
  </div> 
</template>

<script>
import Vue from "vue" ;
import ChildrenB from "./ChildrenB";
import ChildrenC from "./ChildrenC"; 
import ChildrenD from "./ChildrenD";
export default {
 components: {
  ChildrenB,
  ChildrenC,
  ChildrenD 
},
provide() {
this. theme = Vge. observable({
  color: "blue"
});
return {
 theme: this . theme
};
},
methods: {
  changeColor(color) { 
   if (color) {
    this. theme.color = color;
} else {
   this. theme.color = this. theme.color === "blue" ? "red" : "blue";
}
}
};
通过 observable 来实现响应式数据。


9.第九题:v-ant-ref指令回调问题

问题:

    v-ant-ref指令回调中能不能对更改响应式数据?为什么?

解答:

   不能,会死循环!!!

组件更新就会触发回调,如果回调中更改数据又会触发组件更新又会触发回调,一直下去。

   
 

相关文章:

  • APS智能排产在电子行业的应用
  • 使用 Umi 的微生成器快速助力业务交付
  • flink窗口聚合函数之aggregateFuction学习
  • DNS域名解析系统-BIND服务
  • 【rainbowzhou 面试21/101】综合提问--为什么选择做测试/大数据测试?
  • 【日拱一卒行而不辍20220923】自制操作系统
  • 【高质量C/C++】3.命名规则
  • 湖仓一体电商项目(二十):业务实现之编写写入DM层业务代码
  • Msquic客户端详解
  • Eclipse Theia技术揭秘——构建桌面IDE
  • 交换机的构成以及其工作原理
  • 想换壁纸找不到高质量的?来这里用python采集上万张壁纸
  • Mybatis-Plus(核心功能篇 ==> 条件构造器
  • vue2.X+Cesium1.93Demo
  • 适配器模式【Java设计模式】
  • (三)从jvm层面了解线程的启动和停止
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • canvas 五子棋游戏
  • Cumulo 的 ClojureScript 模块已经成型
  • express + mock 让前后台并行开发
  • Flex布局到底解决了什么问题
  • Magento 1.x 中文订单打印乱码
  • mongo索引构建
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React Transition Group -- Transition 组件
  • scrapy学习之路4(itemloder的使用)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 检测对象或数组
  • 前端代码风格自动化系列(二)之Commitlint
  • 世界上最简单的无等待算法(getAndIncrement)
  • zabbix3.2监控linux磁盘IO
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • !!Dom4j 学习笔记
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十八)三元表达式和列表解析
  • (四)汇编语言——简单程序
  • (一) springboot详细介绍
  • .NET 4.0中的泛型协变和反变
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 服务 ServiceController
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .sys文件乱码_python vscode输出乱码
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Controller和@RestController的区别?
  • @SuppressWarnings注解
  • [].slice.call()将类数组转化为真正的数组