一些关于Vue2的面试题

embedded/2024/9/22 19:19:46/
1.v-if和v-show的区别?

v-show通过css中的display控制隐藏和显示,v-if是真的渲染和销毁

如果显示隐藏切换比较频繁,使用v-show,否则使用v-if

2.为什么v-for要使用key?

快速找到节点,减少渲染次数,提高性能

3.描述vue组件的生命周期?
单组件生命周期:

挂载:beforeCreate==》created==》beforeMount==》mounted

更新:beforeUpdate==》updated

销毁:beforeDestory==》destoryed

父子组件生命周期:

挂载:parent beforeCreate==》parent created==》parent beforMount==》child beforeCreate==》child created==》child beforeMount==》child mounted==》parent mounted

更新:parent beforeUpdate==》child beforeUpdate==》child updated==》parent updated

销毁:parent beforeDestory==》child beforeDestory==》child destoryed==》parent destoryed

4.vue组件之间如何进行组件通信的?
(1)父组件--->子组件:使用props
父组件:
<template><div><Student name= '张三' sex='男' :age='18'></Student></div>
</template><script>
import Student from './components/Student.vue'
export default {name: 'app',components:{Student}
}</script>
子组件:
<template><div><h1>{{msg}}</h1><h2>学生姓名:{{name}}</h2><h2>学生性别:{{sex}}</h2><h2>学生年龄:{{myAge+1}}</h2><button @click= 'updateAge'>尝试修改收到的年龄</button></div>
</template><script>
export default {name: 'Student',data() {return {msg:'我是一个学生',myAge:this.age}},methods: {updateAge() {this.myAge++}},// 简单声明接收props: ['name', 'age', 'sex'] // 接收的同时对数据类型进行限制// props: {//   name:String,//   age:Number,//   sex:String// }//接收的同时:对数据类型进行限制+默认值的指定+必要值的限定// props:{//   name: {//     type:String, // name的类型是字符串//     required:true // name是必要的//   },//   age: {//     type:Number,//     default:99 // 默认值//   },//   sex: {//     type:String,//     required:true//  }// }
}</script>
(2)子组件--->父组件:自定义事件
父组件:
<template><div class="app"><h1>{{msg}},学生姓名是:{{studentName}}</h1><!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据--><Student @ligong="getStudentName"/> </div>
</template><script>import Student from './components/Student'export default {name:'App',components:{Student},data() {return {msg:'你好啊!',studentName:''}},methods: {getSchoolName(name){console.log('App收到了学校名:',name)this.studentName = name}},}
</script>
子组件:
<template><div class="school"><h2>学校名称:{{name}}</h2><h2>学校地址:{{address}}</h2><button @click="sendSchoolName">把学校名给App</button></div>
</template><script>export default {name:'School',data() {return {name:'小剑',address:'北京',}},methods: {sendSchoolName(){this.$emit('ligong', this.name)}},}
</script>
(3)兄弟组件之间通信:使用全局事件总线($bus)

先安装全局事件总线:

new Vue({.....
beforeCreate() {
Vue.prototype.$bus = this//安装全局事件总线,$bus就是当前应用的vm},....
})

示例代码如下:

// 在main.js中安装全局事件总线
//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//关闭Vue的生产提示
Vue.config.productionTip = false//创建vm
new Vue({el:'#app',render: h => h(App),beforeCreate() {Vue.prototype.$bus = this //安装全局事件总线},
})

接收数据的组件:

接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身

methods:{demo(data) {.....}},mounted() {this.$bus.$on('xxx', this.demo)// 或者是写箭头函数的回调}

示例代码如下:

<template><div class="school"><h2>学校名称:{{name}}</h2><h2>学校地址:{{address}}</h2><h2>收到的学生的名字是:{{studentName}}</h2></div>
</template><script>export default {name:'School',data() {return {name:'小剑',address:'北京',studentName:''}},methods:{// getName(name) {//     this.studentName = name// },},mounted() {// 写法一,把回调函数写在methods函数当中// this.$bus.$on('hello', this,getName)// 写法二,直接写回调函数this.$bus.$on('hello', (name)=> {this.studentName = name})},beforeDestroy() {this.$bus.$off('hello')},}
</script>

提供数据 :this.$bus.$emit('xxx', 数据)

示例代码如下:

<template><div class="student"><h2>学生姓名:{{name}}</h2><h2>学生性别:{{sex}}</h2><button @click="sendStudentName">把学生名给School组件</button></div>
</template><script>export default {name:'Student',data() {return {name:'张三',sex:'男',}},methods: {sendStudentName(){this.$bus.$emit('hello',this.name)}},}
</script>
5.双向绑定v-model的实现原理?

首先是从data里面的数据通过绑定到input控件和p标签上,然后在input上通过input监听控件,触发

change事件,调用方法都可以默认获取e事件,e.target.value是获取调用该方法的dom对象上的

value值,把value值赋给data里面的初始数据,从而实现双向数据绑定的原理

6.对MVVM的理解?

M==>Model(数据模型),V==>View(代表UI组件,负责将数据转换为UI展现出来),

VM==>ViewModel,在MVVM架构下,View和Model没有直接的关系,而是通过ViewModel进行交

互的,Model和ViewModel之间的交互是相互,View数据的变化会同步到Model上,而Model

的变化也会同步到View上

7.data为什么是一个函数?

将data定义为一个函数,在该函数体内部返回一个函数,这样,在创建组件实例时,会调用data()方法,获取返回的新的数据对象,则各个组件实例就会有自己独立的数据对象,组件间互不影响

8.vue指令有哪些?

v-html   // html

v-text   // 元素里要显示的内容

v-bind:data    // 绑定动态数据   :data

v-on:click      // 绑定事件       @click

        .stop 阻止事件继续传播

        .prevent  阻止默认时间

        .capture 使用事件捕获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进行

处理

        .self 只当在 event.target 是当前元素自身时触发处理函数

        .once 事件将只会触发一次

        .passive 告诉浏览器你不想阻止事件的默认行为

v-for  // 循环,vue2中v-for的优先级高于v-if,不推荐一起使用

v-if   //  条件渲染指令  如果是真则渲染节点,否则不渲染节点

v-if、v-else 和 v-else-if :类似js的if...else判断语句

v-show:通过display:none;控制元素显示隐藏

v-model    //  双向绑定,用于表单

        .lazy 默认情况下,v-model同步输入框的值和数据。可以通过这个修饰符,转变为在change

事件再同步。

        .number 自动将用户的输入值转化为数值类型

        .trim 自动过滤用户输入的首尾空格

v-pre :主要用来跳过这个元素和它的子元素编译过程。

v-cloak :保持在元素上直到关联实例结束时进行编译。

v-once :关联的实例,只会渲染一次。之后的重新渲染,实例极其所有的子节点将被视为静态内

容跳过,这可以用于优化更新性能

9.vue.js的两个核心是什么?

数据驱动和组件化

10.vue动态组件?

多个组件通过同一个挂载点进行组件的切换,is的值是哪个组件的名称,那么页面就会显示哪个组

件。

11.路由传参的方式?

query传参和params传参

(1)声明式导航

不带参跳转 对应的地址为/foo

url字符串拼接传参 对应的地址为/foo?id=123

query方式对象形式传参 对应的地址为/foo?id=123

params方式对象形式传参 对应地址为 /path/123 , 注意params和query一起使用params会失效,

params与name一起使用

(2)编程式导航

(路由实例对象router=new VueRouter())

字符串router.push('home')

对象router.push({ path: 'home' })

命名的路由 对应路径为/path/123

router.push({ name: 'user', params: { userId: '123' }})

带查询参数,变成 /register?plan=123

router.push({ path: 'register', query: { plan: '123' }})

接收参数

this.$route.params.id

this.$route.query.xxx

12.vue生命周期的使用场景?

beforeCreate:创建前,访问不到data当中的属性以及methods当中的属性和方法,可以在当前生命周期创建一个loading,在页面加载完成之后将loading移除

created:创建后,当前生命周期执行的时候会遍历data中所有的属性,给每一个属性都添加一个getter、setter方法,将data中的属性变成一个响应式属性

beforeMount:模板与数据进行结合,但是还没有挂载到页面上。因此我们可以在当前生命周期中进行数据最后的修改

mounted:当前生命周期数据和模板进行相结合,并且已经挂载到页面上了,因此我们可以在当前生命周期中获取到真实的DOM元素,在这发起后端请求,拿回数据,配合路由钩子做一些事情

beforeUpdate:当数据发生改变的时候当前生命周期就会执行,因此我们可以通过当前生命周期来检测数据的变化,当前生命周期执行的时候会将更新的数据与模板进行相结合,但是并没有挂载到页面上,因此我们可以在当前生命周期中做更新数据的最后修改

updated:数据与模板进行相结合,并且将更新后的数据挂载到了页面上。因此我们可以在当前生命周期中获取到最新的DOM结构

beforeDestory:当前生命周期中我们需要做事件的解绑、监听的移除、定时器的清除等操作

destoryed:当前生命周期执行完毕后会将vue与页面之间的关联进行断开,当<keep-alive>包裹动态组件的时候会触发两个新的生命周期

activated:当组件为活跃状态的时候触发(活跃状态:进入页面的时候)

deactivated:缓存状态的时候触发

13.第一次页面加载会触发哪几个钩子?

会触发 beforeCreate, created, beforeMount, mounted 这几个钩子

14.为什么使用vue?

优点:轻量级的框架,双向数据绑定,组件化开发,单页面路由,学习成本低,虚拟DOM,渐进式框架,数据和结构分离,运行速度快,插件化

缺点:不支持IE8以下版本,社区不丰富,缺乏高级教程和文档,单页面应用不利于优化,首次加载耗时较久


http://www.ppmy.cn/embedded/102990.html

相关文章

深度学习:革新药物心脏毒性预测的新篇章

药物研发是一项充满挑战与风险的领域&#xff0c;尽管科学家们投入大量时间与资源&#xff0c;但仍有高达90%的药物因无法通过临床试验而宣告失败。其中&#xff0c;药物的心脏毒性是一个尤为棘手的问题&#xff0c;不少药物在上市后因被发现对心脏有潜在伤害而被迫召回&#x…

一、菜单扩展

一、创建文件夹 创建一个名为Editor的文件夹。unity会默认这个名字为工程文件夹 二、创建代码 实现点击unity菜单&#xff0c;对应代码的方法 引用命名空间&#xff1b;使用这个menuitem 注&#xff1a;必须有一个子路径&#xff0c;不然会报错 这里是这个方法的参数 每一个…

CSS 的object-position属性的作用规则

object-position CSS 属性用于指定替换元素&#xff08;如 <img> 或 <video>&#xff09;的内容在其容器内的对齐方式。这个属性与 object-fit 紧密相关&#xff0c;因为 object-fit 控制了内容如何适应其容器的大小&#xff0c;而 object-position 则决定了内容在…

Java 泛型与增强for

泛型 泛型就是在集合中指定存储的数据类型&#xff0c;而且只能存储这种类型&#xff0c;在List<类型>必须要指定&#xff0c;ArrayList<>可以指定可以不指定&#xff0c;基本数据类型不能作为泛型。 确定了泛型为 String&#xff0c;调用该方法时传递的参数类型也…

PyQt 迁移到 PySide

将 PyQt 迁移到 PySide 的过程主要包括以下几个步骤。PySide 和 PyQt 的 API 基本相似&#xff0c;但是仍有一些细微的差别。下面是一些通用的迁移步骤&#xff1a; 1. 安装 PySide 首先&#xff0c;你需要安装 PySide2 或 PySide6&#xff08;取决于你希望使用的版本&#x…

SSRF漏洞(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言&#xff1a; 本文基于pikachu&#xff08;皮卡丘&#xff09;靶场进行SSRF渗透攻击教学。 靶场环境搭建&#xff1a;SSRF漏洞&#xff08;三&#xff09; 一&#xff0c;SSR…

Jhipster应用,cdn加速方案。

Jhipster, 采用springbootwebfluxreacttypescript技术栈。项目部署是采用k8shelm 部署在GCP上的&#xff0c;所以这个单体项目幕后是跑在pod上的。 项目上线后&#xff0c;发现单页面应用加载速度很慢&#xff0c;如图所示长时间处于加载状态&#xff1a; 仔细分析一下原因&am…

第十二章 rust中的项目管理

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust项目管理 目录 注意一、前言二、模块三、lib四、工作空间五、引入问题一、前言 前面我们已经使用了很多别人写的包,而本文就将详细介绍我们如何去写一个属于自己的包。 包的作用相信大家已经有所领悟:可以共…