vue面试五

  • 一 vue修饰符 中 .lazy .number .trim 的用法
  • 二 Vue v2.4中新增的`$attrs`及`$listeners`属性的使用
  • 三 v-once 的使用场景
  • 四 vue组件里的定时器该如何销毁?
  • 五 如果有大量数据需要渲染,如何提升vue优化?
  • 六 vue递归组件是啥,手写一个递归组件?

一 vue修饰符 中 .lazy .number .trim 的用法

1 .lazy 的用法(使双向数据绑定不起作用,且失去焦点的时候,触发@change方法)

<template><div><div><input v-model="msg" @change="show"><span>{{msg}}</span></div></div>
</template><script>
export default {data () {return {msg: 123}},methods: {show () {console.log(this.msg)}}
}
</script>

v−model是双向绑定的如果这个时候,修改<input>框中的内容,<span>中内容也会修改v-model是双向绑定的如果这个时候,修改<input>框中的内容,<span>中内容也会修改v−model是双向绑定的如果这个时候,修改<input>框中的内容,<span>中内容也会修改

当使用 .lazy 时

<template><div><div><input v-model.lazy="msg" @change="show"><span>{{msg}}</span></div></div>
</template><script>
export default {data () {return {msg: 123}},methods: {show () {console.log(this.msg)}}
}
</script>

改变<input>框中的内容并不会使得<span>中的内容发生变化,此时当输入框失去焦点后触发change事件。也就是说加上.lazy后相当于双向数据绑定不起作用了改变<input>框中的内容并不会使得<span>中的内容发生变化,此时当输入框失去焦点后触发change事件。也就是说加上.lazy后相当于 双向数据绑定不起作用了改变<input>框中的内容并不会使得<span>中的内容发生变化,此时当输入框失去焦点后触发change事件。也就是说加上.lazy后相当于双向数据绑定不起作用了

2 .number 修饰符可以将输入的值转化为Number类型 ( 否则虽然你输入的是数字
但它的类型其实是String ) 在数字输入框中比较有用

<template><div><p>.number修饰符</p><input type="number" v-model.number="val"><p>我的数据类型是:{{ typeof(val) }}</p></div>
</template><script>export default {data(){return{val:''}}}
</script>

3 .trim 修饰符会自动过滤掉输入的首尾空格

<template><div><p>.trim修饰符</p><input type="etxt" v-model.trim="val"><p>val的长度是:{{ val.length }}</p></div>
</template><script>export default {data(){return{val:''}}}
</script>

二 Vue v2.4中新增的$attrs$listeners属性的使用

背景:组件之间传值

$attrs:
接收除了props声明外的子组件的所有绑定属性(class、style除外)(父组件向子组件传值)

由于child.vue 在 props 中声明了 name 属性,$attrs 中只有age、gender两个属性,输出结果为:
{ age: “20”, gender: “man” }


通过 v-bind="$attrs", 可以将属性继续向下传递,让 grandson.vue 也能访问到父组件的属性,这在传递多个属性时会显得很便捷,而不用一条条的进行绑定。
console的结果为:{ height: “180”, gender: “man” } (child.vue 在 props 中声明了 name 属性,grandson.vue在props 中有age属性)

$listeners
接收除了带有.native事件修饰符的所有事件监听器(子组件向父组件传值)


总结:在child组件上绑定$attrs 和 $listeners 使grandson组件获取parent传递的值并且可以调用在parent那里定义的方法


简单demo举例:

// 父组件
<template><div>//给子组件传递两个值<child-dom:foo="foo"     :coo="foo"></child-dom></div>
</template>
<script>import childDom from "./ChildDom.vue";export default {data() {return {foo:"Hello, world",coo:"Hello,rui"}},components:{childDom},}
</script>// 子组件
<template><div><p>foo:{{foo}}</p><p>attrs:{{$attrs}}</p>  //通过$attrs获取非props的值<childDomChild v-bind="$attrs"></childDomChild>  // 通过v-bind传递值给孙子组件</div>
</template>
<script>
import childDomChild from './childDomChild';
export default {name:'child-dom'props:["foo"],inheritAttrs:false,
}
</script>// 孙子组件
<template><div><p>coo:{{coo}}</p></div>
</template>
<script>export default {name:'childDomChild'props:["coo"],     // 获取子组件传来的值inheritAttrs:false}
</script>
// 父组件
<template><div><child-domv-on:upRocket="reciveRocket"></child-dom></div>
</template>
<script>import childDom from "@/components/ChildDom.vue";export default {name:'demoNo',data() {return {}},components:{childDom},methods:{reciveRocket(){console.log("reciveRocket success")}}
}
</script>// 子组件
<template><div><childDomChild v-on="$listeners"></childDomChild>    // 孙子组件向父组件传值,调用方法</div>
</template>
<script>
import childDomChild from './childDomChild';
export default {name:'child-dom'
}
</script>// 孙子组件
<template> <div><button @click="startUpRocket">我要发射火箭</button></div>
</template>
<script>export default {name:'childDomChild',methods:{startUpRocket(){this.$emit("upRocket");console.log("startUpRocket")}}
</script>

将这个两个demo合在一起则是:

// 父组件
<template><div>//1 父组件要给子孙组件传递的值,以及子孙组件让父组件调用的方法<child-dom:foo="foo":coo="coo"v-on:upRocket="reciveRocket"></child-dom></div>
</template>
<script>import childDom from "@/components/ChildDom.vue";export default {name:'demoNo',data() {return {foo:"Hello, world",coo:"Hello,rui"}},components:{childDom},methods:{reciveRocket(){console.log("reciveRocket success")}}
}
</script>// 子组件
<template><div><p>foo:{{foo}}</p><p>attrs:{{$attrs}}</p><childDomChild v-bind="$attrs" v-on="$listeners"></childDomChild>   // 2  v-bind绑定父组件的值,并传给孙子组件,v-on使孙子组件的值,传给父组件</div>
</template>
<script>
import childDomChild from './childDomChild';
export default {name:'child-dom'props:["foo"],inheritAttrs:false,
}
</script>// 孙子组件
<template> <div>// 3 可获取父组件的传来的值,可调用方法,使父组件方法执行<p>coo:{{coo}}</p><button @click="startUpRocket">我要发射火箭</button></div>
</template>
<script>export default {name:'childDomChild',props:['coo'],methods:{startUpRocket(){this.$emit("upRocket");console.log("startUpRocket")}}
</script>

三 v-once 的使用场景

背景:v-once的使用
没有使用v-once下的情景:


打开浏览器,并修改值的时候,mes也会跟着修改,正常,正是vue的双向绑定

当把上述代码,修改成v-once以后
打开浏览器,并修改值的时候,mes不会发生改变

v-once只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。

使用场景:

上面是种理想状态,实际开发的时候要想做到上面的理想状态,很难。
当然如果是纯粹的展示大量静态内容,可以用v-once避免重复渲染,提高效率

四 vue组件里的定时器该如何销毁?

this.$once(‘hook:beforeDestroy’,()=>{});
直接在需要定时器的方法或者生命周期函数中声明并销毁,代码如下:

export default{methods:{fun1(){const timer = setInterval(()=>{//需要做的事情console.log(11111);},1000);this.$once('hook:beforeDestroy',()=>{clearInterval(timer);timer = null;})}}
}

关于this.$once
this.$once是个事件函数,是一个用于监听自定义的函数,或者vue生命周期函数的一个函数
用法this.$once(参数1,参数2)
第一个参数即是被监听的函数(自定义函数,或者vue生命周期函数)
第二个参数就是第一个函数执行后的回调函数

五 如果有大量数据需要渲染,如何提升vue优化?

优化方案:
1 按需加载局部数据, 虚拟列表,无限下拉刷新。(vue-virtual-scroll-list)

2 js运行异步处理: 分割任务,实现时间切片处理, 类似react fiber, 每次执行记录时间, 超过一定执行时间则settimeout或requestAnimation推迟到下一个时间片,一般一个时间片为16ms。

3 大量纯展示的数据,不需要追踪变化的 用object.freeze冻结(可以使用虚拟列表,Object.freeze冻结对象,Object.preventExtentsion阻止对象扩展来阻止vue给每个对象加上get,set,但是缺点是不能响应了)

4 数据量大的时候,可以做分页处理。翻页一次请求10-20条数据。

补充背景:
Object.freeze() 方法可以冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。
vue1.0.18+对其提供了支持,对于data或vuex里使用freeze冻结了的对象,vue不会做getter和setter的转换。

补充背景:
vue-virtual-scroll-list官网地址 https://tangbc.github.io/vue-virtual-scroll-list/#/
https://www.npmjs.com/package/vue-virtual-scroll-list

六 vue递归组件是啥,手写一个递归组件?

递归组件,顾名思义,就是自己的内部实现又调用自己的组件。比如Vue官方给的treeView的例子,父目录下有子目录,子目录下还有子目录,子子孙孙,无穷尽也。就像俄罗斯套娃

手写一个递归组件:

// 父组件
<template><div id="app">   <category :datalist="datalist"></category></div>
</template><script>
import category from './category.vue'
export default {name: 'app',data () {return {datalist:[{title:'手机',level:1,children:[{title:'三星',level:2,children:[  {title:'三星1',level:3}]},{title:'华为',level:2},{title:'苹果',level:2}]}   ]}},components:{category},
}
</script><style>
</style>// 子组件 (递归调用)
<template><div id="phone"><div v-for="(item ,index) in datalist" :key="index">{{item.title}}<div v-if="item.children" class="item-chilren"><phone :datalist="item.children"></phone></div></div></div>
</template><script>
export default {name: 'phone',data () {return {}},props:{datalist:Array},
}
</script><style>
.item-chilren{
}.item-chilren div{padding: 2px;padding-left: 20px;margin-bottom: 2px;
}
</style>

什么要给名字?这个名字是干什么用呢?这个名字很大的一个用处,就是为了我们使用递归组件的时候来使用 。
如果一个组件要使用自己的时候 ,我就可以通过自己的名字来使用自己。

<phone :datalist="item.children"></phone>

vue面试五之vue修饰符中 .lazy 等用法、Vue v2.4中新增的$attrs及$listeners属性的使用、v-once 的使用场景、vue组件里的定时器该如何销毁、vue海量数据优化等相关推荐

  1. [vue] vue组件里的定时器要怎么销毁?

    [vue] vue组件里的定时器要怎么销毁? const timer = setInterval(() =>{ // 某些定时器操作 }, 500); // 通过$once来监听定时器,在bef ...

  2. 037——VUE中表单控件处理之表单修饰符:lazy/number/trim

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  3. Vue事件绑定以及事件修饰符

    事件 要理解事件绑定,就得先了解事件. 浏览器是事件驱动型的,根据用户的行为触发不同的事件,根据事件执行相应的操作.我们较为熟悉的事件有三大类型: 鼠标键盘事件 鼠标键盘事件 事件介绍 onclick ...

  4. Vue——v-model的三种修饰符lazy、number、trim

    Vue--v-model的三种修饰符lazy.number.trim v-model.lazy:值修改操作完成之后才会发生变化. v-model.number:值修改时,保持其值为Number类型. ...

  5. C#基础11:五种访问修饰符

    五种访问修饰符: public:公开的访问权限,当前类.子类.实例对象都可以访问到 private:私有的访问权限,只能在当前类内部进行访问使用,子类和实例对象都访问不到 protected:受保护的 ...

  6. java中的权限修饰符_Java的权限修饰符的区别和用法总结

    类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.friendly(包访问权限). 1.public:public表明该数据成员.成员函数是对所有用户开放的, ...

  7. 表单下拉框、表单修饰符(.lazy、.number、.trim)

    表单下拉框 知识点 v-model select 表单下拉框绑定 <div id="myApp"><h3>你最喜欢的NBA球星是:</h3>&l ...

  8. Vue之@click、事件修饰符@click.stop与@click.prevent、按键修饰符@keyup.enter

    1.绑定监听@click: (以监听click为例,其他如keyup,用法类似)  v-on:click="fun"   @click="fun"   @cli ...

  9. Vue.js--表单修饰符(.lazy、.number、.trim)详解

    .lazy 在输入框中,v-model默认是在input事件中同步输入框的数据(除了输入法中文输入的情况),使用修饰符 .lazy 会转变为 change 事件中同步(类似懒加载): <div ...

  10. Vue数据代理+事件处理+事件修饰符的作用+计算属性的使用,尚硅谷Vue系列教程学习笔记(2)

    尚硅谷Vue系列教程学习笔记(2) 参考课程:<尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通> 参考链接:https://www.bilibili.com/video/ ...

最新文章

  1. [Git]常用的Git命令行
  2. 编译 glibc-2.14 时出现的一个LD_LIBRARY_PATH不路径bug
  3. python 类属性排序_Python实现多属性排序的方法
  4. 汇编语言的相对跳转和绝对跳转以及反汇编代码解析
  5. 其他数据类型存储空间大小(信息学奥赛一本通-T1018)
  6. Deep Reinforcement Learning for Dialogue Generation-关于生成对话的深度强化学习
  7. 中英文国家名及手机号码前缀
  8. CentOS7增加或修改SSH端口号
  9. UCI数据库Heart Disease数据集下载
  10. ClickHouse数据库介绍
  11. latex如何设置字体并加粗_LaTex中文字体加粗的问题
  12. 625线,525线什么意思?
  13. 解决接口慢的几种方法
  14. 【工程源码】stmdb和ldmia汇编指令
  15. 飞机游戏中子弹与飞机的移动与边界源码
  16. JS安全防护算法与逆向分析——新浪微博登录JS加密算法
  17. JUC详解(各种乱七八糟的锁)
  18. 问题 C: LD的神奇魔法
  19. python简单网页爬虫代码
  20. 手动备份还原win系统的驱动程序

热门文章

  1. 学习大数据,为大家推荐几本好书
  2. word刷子刷格式_【Word中格式刷】Word格式刷在哪里?Word格式刷用法大全!
  3. 简单系统U盘制作 / 安装系统
  4. melogin.cn主页登录_melogin.cn登陆界面
  5. java中三个点的用法
  6. Discuz仿魔客吧模板/素材资源站模板/包含DIY文件
  7. Halcon 算子 complement
  8. PS用圆角矩形工具画出来的是实线而是虚线,哪里出问题了?
  9. 英语四级和计算机二级考试时间安排,计算机二级考试时间一年几次呢
  10. Unity3D开发游戏坦克大战