前端基础面试题(二)

news2024/11/20 16:30:35

摘要:最近,看了下慕课2周刷完n道面试题,记录下...

1. offsetHeight scrollHeight clientHeight 区别

        计算规则:

        offsetHeight offsetWidth : border + padding + content

        clientHeight clientWidth: padding + content

        scrollHeight scrollWidth: padding + 实际内容尺寸(当显示滚动条时,就大于content尺寸)

2. HTMLCollection 和 NodeList区别

        Node 和Element

        DOM是一棵树,所有的节点都是Node

        Node是Element的基类

        Element是其他HTML元素的基类,如HTMLDivElement

        HTMLCollection是Element的集合;NodeList是Node的集合

        注:获取Node和Element的返回结果可能不一样

        如果elem.childNode和elem.children不一样

        前者包含Text和Comment等节点,后者不包含

        扩展:HTMLCollection和NodeLIst都是类数组,将类数组转换为数组的几种方式

const arr1 = Array.from(list)
const arr2 = Array.prototype.slice.call(list)
const arr3 = [...list]

3. Vue computed和watch的区别

        两者用途不同

        computed用于计算产生新的数据;watch用于监听现有数据;

        另外,computed有缓存,method没缓存

4. Vue组件通讯有几种方式,尽量全面

        Vue组件间通讯分为不同场景的:

  • 父子组件
  • 上下级组件(跨多级)通讯
  • 全局组件

        几种组件通讯方式:

props和Event

        父组件通过 props 向子组件传递数据,子组件通过 events 向父组件发送消息;

<!--Home.vue-->
<template>
  <HelloWorld msg="Welcome to your Vue.js App" @showMsg="showMsg"/>
</template>
<script>
  import HelloWorld from '@/component/HelloWorld.vue'
  export defult {
    name: 'Home',
    components: {
      HelloWorld,
    },
    methods: {
      showMsg(msg) {
        console.log(msg)
      }
    }
  }
</script>

<!--HelloWorld.vue-->
<template>
  <h1 @click="clickHandler"> {{msg}} </h1>
</template>
<script>
  export default {
    name: 'HelloWorld',
    props: {
      msg: String
    },
    emits: ['showMsg'],  // Vue3新增属性
    methods: {
      clickHandler() {
        this.$emit('showMsg', 'hello world')
      }
    }
  }
</script>

自定义事件

        Vue 实例可以通过 $on 方法监听自定义事件,通过 $emit 触发自定义事件,从而实现组件之间的通讯。自定定义事件常用于兄弟组件,跨多级通讯,灵活但容易用乱。

<!--ParentComponent.vue-->
<template>
  <CustomEvent1/>
  <CustomEvent2/>
</template>
<script>
  import CoustomEvent1 from '@/component/CoustomEvent1.vue'
  import CoustomEvent1 from '@/component/CoustomEvent2.vue'
  export defult {
    name: 'Home',
    components: {
      CustomEvent1,
      CustomEvent2
    },
    methods: {
      showMsg(msg) {
        console.log(msg)
      }
    }
  }
</script>

<!--CustomEvent1.vue 接收方-->
<template>
  <p> recive coustom event</p>
</template>
<script>
import event from '../utils/event.js'  //引入event发布订阅的总线
export default {
  name: 'CustomEvent1',
  methods: {
    showMsg(msg) {
      console.log(msg)    
    }
  },
  mounted() {
    event.on('showMsg', this.showMsg)  // 监听
  },
  // vue 2.x beforeDestroy 需要销毁避免内存泄漏
  beforeUnmount() {
    event.off('showMsg', this.showMsg)  // 销毁;监听和销毁要写函数名字,处理同一个函数
  }
}
</script>

<!--CustomEvent2.vue 发送方-->
<template>
  <p><button @click="trigger">trigger coustom event<button></p>
</template>
<script>
import event from '../utils/event.js'  //引入event发布订阅的总线
export default {
  name: 'CustomEvent2',
  methods: {
    trigger() {
      event.emit('showMsg', 'hello coustom event')
    }
  },
}
</script>


//event.js
import ee from 'event-emitter'
// Vue2 : new Vue()就是 event
// Vue3 : 引入第三方库
const event = ee()

export default event

$attrs

        之前资料$attrs 和 $listeners比较多,但是后者在Vue3中已经移除;子组件可以通过 $attrs 获取父组件传递的非 prop 和emits特性。

<!--ParentComponent.vue-->
<template>
  <AttrsDome/>
</template>
<script>
  import AttrsDome from '@/component/AttrsAndListeners/Level1.vue' //主需要引用Level1
  export defult {
    name: 'Home',
    components: {
      AttrsDome,
    },
    methods: {
      showMsg(msg) {
        console.log(msg)
      }
    }
  }
</script>

<!--Level1-->
<template>
  <p>Level1</p>
  <Level2  :a="a" :b="b" :c="c" @getA="getA" @getB="getB" @getC="getC"></Level2>
</template>
<script>
import Level2 from './Level2'
export default {
  name: 'Level1'
  components: {Level2},
  date() {
    return {
      a: 'aaa',
      b: 'bbb',
      c: 'ccc'
    }
  },
  methods: {
    getA(){
      return this.a
    },
    getB(){
      return this.b
    },
    getC(){
      return this.c
    }
  }
}
</script>

<!--Level2-->
<template>
  <p>Level2</p>
  <Level3  :x="x" :y="y" :z="z" @getX="getx" @getY="gety" @getZ="getz"></Level3>
  v-bind="$attrs"  //将attrs传入下一级Level3,
</template>
<script>
import Level3 from './Level3'
export default {
  name: 'Level2'
  components: {Level3},
  // 只接受Level1传入的a和getA
  props: ['a'],   // Vue2中属性在$attrs,方法在$listener中
  emits: ['getA']
  date() {
    return {
      x: 'xxx',
      y: 'yyy',
      z: 'zzz'
    }
  },
  methods: {
    getX(){
      return this.x
    },
    getY(){
      return this.y
    },
    getZ(){
      return this.z
    }
  },
  created() {
    console.log('level2', Object.keys(this.$attrs))  // ['b', 'c','onGetB', 'onGetC']
    // 也就是说,Level1传入的属性,没有被包含在props和$emits,就会放在attrs中;是前两者的后补
  }
}
</script>

<!--Level3-->
<template>
  <p>Level3</p>
</template>
<script>
export default {
  name: 'Level3',
  // 只接受Levelx传入的a和getX
  props: ['x'],
  emits: ['getX']
  inheritAttrs: false,// 避免属性继承
  date() {
    return {
  
    }
  },
  mounted() {
    console.log('Level3 $attrs', Object.keys(this.$attrs))//['y','z','onGetY','onGetZ']
    // Level2中增加v-bind传入attrs后,上面输出为['y','z','onGetY','onGetZ','b', 'c','onGetB', 'onGetC']
  }
}
</script>

$parent和 $refs

        Vue2中可以通过 $parent 和 children 直接访问父组件和子组件的实例,进行直接的组件通讯(父子组件通讯);Vue3中children建议用$refs来获取,可以使用 $refs 获取对子组件实例的引用,从而直接调用子组件的方法或访问子组件的数据。

        上例子中Level3,可以通过$parent直接获取父节点,获取属性调用方法都可以;

<!--Level3-->
<template>
  <p>Level3</p>
  <!--添加子组件HelloWorld的ref属性,为读取是的名称-->
  <HelloWorld msg="hello czh" ref="hello1"/>
</template>
<script>
import HelloWorld from '../HelloWorld'

export default {
  name: 'Level3',
  components: {HelloWorld},
  // 只接受Levelx传入的a和getX
  props: ['x'],
  emits: ['getX']
  inheritAttrs: false,// 避免属性继承
  date() {
    return {
  
    }
  },
  mounted() {
    console.log(this.$parent)  //父节点
    console.log(this.$parent.y)   //yyy   ,获取属性
    console.log(this.$parent.getX())   //xxx   ,调用方法
    console.log(this.refs.hello1.name)  // hello-world
  }
}
</script>

<!--HelloWorld.vue-->
<template>
  <h1 @click="clickHandler"> {{msg}} </h1>
</template>
<script>
  export default {
    name: 'HelloWorld',
    props: {
      msg: String
    },
    emits: ['showMsg'],  // Vue3新增属性
    data() {    // 新增data中的name属性
      return {
        name: 'hello-world'
      }
    },
    methods: {
      clickHandler() {
        this.$emit('showMsg', 'hello world')
      }
    }
  }
</script>

        需要注意$parent 和 $refs获取父组件和子组件,需要在mounted中获取,因为created中组件还未渲染完成。

provide/inject

        provide/inject是多层级组件间通讯较完美的解决方案,父组件通过 provide 向子孙组件注入数据,子孙组件通过 inject 接收注入的数据(可以跨级接收注入的数据)。

<!--Level1-->
<template>
  <p>Level1 :<input v-model=name></p>
  <Level2></Level2>
</template>
<script>
import {computed} from 'vue'  // 传入data中响应式的数据需要使用computed包裹
import Level2 from './Level2'
export default {
  name: 'Level1'
  components: {Level2},
  date() {
    return {
     name: 'czh'
    }
  },
  // provide: {    // 传入数据为静态字符串
  //   info: 'aaa'
  // },
  provide () {   //传入data中响应式的数据
    return {
      info: computed(() => this.name)  // 使用computed包裹
    }
  }
}
</script>

<!--Level2-->
<template>
  <p>Level2  {{info}}</p>   <!--使用注入的数据info-->
  <Level3></Level3>
</template>
<script>
import Level3 from './Level3'
export default {
  name: 'Level2'
  components: {Level3},
  inject: ['info'],   // 接收注入的数据
}
</script>

<!--Level3-->
<template>
  <p>Level3 {{info}}</p>   <!--使用注入的数据info-->
</template>
<script>
export default {
  name: 'Level3',
  inject: ['info'],   // 接收注入的数据
}

Vuex

        使用 Vuex 来进行状态管理,实现组件之间共享状态和通信。

5. Vuex 中mutation和action的区别

        mutation:原子操作,必须是同步代码;action: 可包含多个mutation,可包含异步代码;

         具体来说:

        mutation:

  • mutation 是 Vuex 中用于修改状态的唯一途径;
  • mutation 必须是同步函数,用于直接改变状态;
  • 在组件中通过 commit 方法来触发 mutation;
  • 由于 mutation 是同步执行的,因此可以更容易地追踪状态的变化和调试。

        action:

  • action 类似于 Mutation,但是可以包含任意异步操作;
  • action 可以包含业务逻辑、异步请求等操作,并且最终提交 mutation 来修改状态;
  • 在组件中通过 dispatch 方法来触发 action;
  • action 可以处理复杂的逻辑,例如异步请求、多个 mutation 的组合等。

6. JS严格模式有什么特点

7. HTTP跨域时为何要发送option请求

未完待续……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1475307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity学习(42)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——服务器收包2

1.解决上一次留下的问题&#xff1a; log和reg的时候也有session&#xff0c;输出看一下这两个session是同一个不&#xff1a; 实测结果reg log accOnline中的session都是同一个对象&#xff0c;但是getAccid时候的session就是另一个了。 测试结果&#xff0c;说明在LogicHan…

lv21 QT对话框3

1 内置对话框 标准对话框样式 内置对话框基类 QColorDialog, QErrorMessage QFileDialog QFontDialog QInputDialog QMessageBox QProgressDialogQDialog Class帮助文档 示例&#xff1a;各按钮激发对话框实现基类提供的各效果 第一步&#xff1a;实现组件布局&…

水电表远程集中抄表管理系统

水电表远程集中抄表管理系统是当前水电行业智能化发展的关键技术之一&#xff0c;为水电企业和用户提供了便捷、高效的抄表管理解决方案。该系统结合了远程监控、自动抄表、数据分析等多种功能&#xff0c;实现了水电抄表的智能化和精准化&#xff0c;为用户节省了大量人力物力…

The authenticity of host ‘github.com (20.205.243.166)‘ can‘t be established.

1、运行git clone报错&#xff1a; The authenticity of host github.com (20.205.243.166) cant be established. ECDSA key fingerprint is SHA256:p2QAC1TJYererOttrVc98/R1BWERWu3/LiyFdHfQM. Are you sure you want to continue connecting (yes/no/[fingerprint])? 这个…

【六袆-Golang】Golang:安装与配置Delve进行Go语言Debug调试

安装与配置Delve进行Go语言Debug调试 一、Delve简介二、win-安装Delve三、使用Delve调试Go程序[命令行的方式]四、使用Golang调试程序 Golang开发工具系列&#xff1a;安装与配置Delve进行Go语言Debug调试 摘要&#xff1a; 开发环境中安装和配置Delve&#xff0c;一个强大的G…

2024年腾讯云4核8G12M配置的轻量服务器同时支持多大访问量?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例

组网需求 如 图 2-15 所示&#xff0c;用户网络 1 通过 LSW1 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数&#xff0c;对 VLAN2 进…

Eclipse是如何创建web project项目的?

前面几篇描述先后描述了tomcat的目录结构和访问机制&#xff0c;以及Eclipse的项目类型和怎么调用jar包&#xff0c;还有java的main函数等&#xff0c;这些是一些基础问题&#xff0c;基础高清出来才更容易搞清楚后面要说的东西&#xff0c;也就是需求带动学习&#xff0c;后面…

element el-table表格内容宽度自适应,不换行,不隐藏

2024.2.27今天我学习了如何用el-table实现表格宽度的自适应&#xff0c;当我们动态渲染表格数据的时候&#xff0c;有时候因为内容太多会出现挤压换行的效果&#xff1a; 我们需要根据内容的最大长度设置动态的宽度&#xff0c;这边我在utils里面封装了一个js&#xff1a; //…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(八)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

数据界的达克摩斯之剑----深入浅出带你理解网络爬虫(Third)

目录 网络爬虫示例 1.爬行策略 1.1 选择策略&#xff1a; 1.1.1 限定访问链接 1.1.2 路径检索 1.1.3 聚焦抓取 1.1.5 WEB3.0检索 1.2重新访问策略 1.3 平衡礼貌策略 1.4 并行策略 2.网络爬虫体系结构 2.1 URL一般化 接上文数据界的达克摩斯之剑----深入浅出带你理解…

【主题广范|见刊快】2024年电力电气与机械,能源工程国际会议(ICPEMEE 2024)

【主题广范|见刊快】2024年电力电气与机械&#xff0c;能源工程国际会议&#xff08;ICPEMEE 2024&#xff09; 重要信息 会议官网&#xff1a;http://www.icpemee.com会议地址&#xff1a;合肥截稿日期&#xff1a;2024.03.10召开日期&#xff1a;2024.03.20 &#xff08;先投…

【C语言】学生宿舍信息管理系统

目录 项目说明 1. 数据结构设计 2. 功能实现 3. 主菜单设计 4. 文件操作 5. 系统使用 项目展示 1.主菜单功能界面 ​编辑 2.添加信息 3.查询信息 4.修改信息 5.删除信息 6.退出程序 项目完整代码 结语 在这篇博客中&#xff0c;我们将探讨如何使用C语言来开发…

虚拟机JVM

虚拟机 1、定义jvm 假想计算机 运行在操作系统之上 和硬件之间没有直接交互 包括 一套字节码指令、寄存器、栈、垃圾回收、堆 一个存储方法域 jvm:承担一个翻译工作&#xff0c;动态的将java代码编译成操作系统可以识别的机器码。 从软件层面屏蔽了不同操作系统在底层硬件与指…

备战蓝桥杯————k个一组反转单链表

k个反转单链表&#xff0c;顾名思义就是k个节点为一组进行反转&#xff0c;这是一道困难的题目&#xff0c;如何解答&#xff0c;可以在我们前面的反转链表中得到思路。 如何 K 个一组反转单链表 题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xf…

四院士领衔,多位大学院校教授,3月齐聚泉城,2024发酵展即将盛装启幕!

2024济南生物发酵系列展同期举办 2024北方工业节能装备展 2024山东国际风机工业展 2024国际合成生物学产业展 2024国际生物制药与技术装备展 2024国际生化仪器与实验室装备展 2024山东国际卫生级流体、泵阀管道展 即将盛大开幕 30000平方米展示面积 500家知名企业参展…

完全分布式运行模式

完全分布式运行模式 分析&#xff1a;之前已经配置完成 ​ 1&#xff09;准备3台客户机&#xff08;关闭防火墙、静态ip、主机名称&#xff09; ​ 2&#xff09;安装JDK ​ 3&#xff09;配置环境变量 ​ 4&#xff09;安装Hadoop ​ 5&#xff09;配置环境变量 ​ 6&am…

无人机飞行控制系统技术,四旋翼无人机控制系统建模技术详解

物理建模是四旋翼无人机控制系统建模的基础&#xff0c;主要涉及到无人机的物理特性和运动学特性。物理建模的目的是将无人机的运动与输入信号&#xff08;如控制电压&#xff09;之间的关系进行数学描述。 四旋翼无人直升机是具有四个输入力和六个坐标输出的欠驱动动力学旋翼…

Liunx前后端项目部署(小白也可安装)

文章目录 一、CentOS服务器的安装二、jdk安装三、Tomcat安装四、MySQL安装、五、nginX安装六、多个项目负载均衡&#xff0c;部署后端项目七、前端项目部署 一、CentOS服务器的安装 选择liunx&#xff0c;下面选择CentOS 7 ![在这里插入图片描述](https://img-blog.csdnimg.cn…

springboot之jdbc、druid、mybatis

springboot整合jdbc spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.52.3:3306/mybatis?useUnicodetrue&characterEncodingutf-8&serverTimezoneUTCusername: rootpassword: root<?xml version"1.0" encodi…