前端学习31 相关面试题

1.手撕版本号排序

// 版本号排序
function compareV(a,b){
    const Sorta = a.split('.').map(Number);
    const Sortb = b.split('.').map(Number);
    const maxLength = a.length > b.length ? a.length : b.length;
    for(let i=0;i<maxLength;i++){
        const numA = a[i] || 0;
        const numB = b[i] || 0;
        if(numA < numB) return -1;
        if(numA > numB) return 1;
    } 
    return 0;
}
const versions = ["1.2.0", "1.11.0", "1.2.1", "1.2", "1.2.0.0", "1.10"];
versions.sort(compareVersion);

2.BFC

开启BFC的方法:

  • overflow: hidden/auto/scroll 最常用的清除浮动方法
  • display: flow-root 现代 CSS 推荐方式
  • float 本身会触发 BFC
  • position: absolute/fixed 常用于定位时隔离布局
  • display: inline-block/table

其中position:relative 不会开启BFC。

BFC 的本质是隔离内部浮动不影响外部布局,触发 BFC 的父元素可以包裹浮动子元素,从而清除浮动带来的高度塌陷问题。

BFC还可以解决margin合并问题。

在垂直方向上,块级元素的 margin 可能发生合并,BFC 可以有效阻止这种合并行为。特别是在父子元素和兄弟元素之间,通过触发 BFC(如设置 overflow: hidden 或 display: flow-root),可以避免布局错乱和多余间距。

注意:这时候会涉及脱离文档流的问题。BFC(Block Formatting Context)不会脱离文档流

BFC 是一种布局机制,它不会让元素本身脱离文档流,而是让其内部的布局独立于外部元素影响

文档流

元素可以通过设置 float、position: absolute/fixed、display: none 来脱离文档流。

其中 position:relative 不会脱离文档流因为它仍保留原来的位置,只是视觉上偏移。

3.nextTick

在 Vue 3 中,数据更新是异步的,修改响应式数据后,视图不会立即更新到真实 DOM。nextTick 用于在下次 DOM 更新循环结束后执行回调,确保获取到最新的 DOM 状态。常见用法是在修改数据后调用 nextTick,在回调中访问或操作已更新的 DOM 元素。这样可以避免访问到旧的 DOM 内容,保证操作时机正确。

<template>
  <div>
    <p ref="text">{{ message }}</p>
    <button @click="changeMessage">修改内容</button>
  </div>
</template>

<script setup>
import { ref, nextTick } from 'vue'

const message = ref('初始内容')
const text = ref(null)

function changeMessage() {
  message.value = '更新后的内容'

  // 立即打印,DOM 还没更新
  console.log(text.value.textContent)  // 还是“初始内容”

  // 使用 nextTick,确保 DOM 更新后访问
  nextTick(() => {
    console.log(text.value.textContent)  // 这里是“更新后的内容”
  })
}
</script>

全部评论

相关推荐

05-18 00:37
快手_前端开发
在使用&nbsp;React&nbsp;进行前端开发时,调用后端接口往往会遇到&nbsp;跨域问题。这是前端开发中一个非常常见但又容易让初学者困惑的问题。本文将从跨域的基本原理讲起,结合&nbsp;React&nbsp;项目的实际开发,讲解如何优雅地解决跨域问题。一、什么是跨域?“跨域”是指浏览器出于安全策略(同源策略&nbsp;Same-Origin&nbsp;Policy)的限制,阻止一个网页去请求另一个“源”的资源。所谓“源”指的是:协议、域名、端口。只要其中一个不同,就算是跨域。例如:-&nbsp;✅&nbsp;http://localhost:3000向&nbsp;http://localhost:3000请求&nbsp;——&nbsp;同源-&nbsp;❌&nbsp;http://localhost:3000向&nbsp;http://api.example.com请求&nbsp;——&nbsp;跨域-&nbsp;❌&nbsp;http://localhost:3000向&nbsp;https://localhost:3000请求&nbsp;——&nbsp;跨域(协议不同)-&nbsp;❌&nbsp;http://localhost:3000向&nbsp;http://localhost:5000请求&nbsp;——&nbsp;跨域(端口不同)二、React&nbsp;项目中的跨域场景React&nbsp;开发环境通常使用&nbsp;create-react-app脚手架,该脚手架会在&nbsp;localhost:3000启动一个开发服务器。如果你的&nbsp;API&nbsp;接口部署在另一个地址,比如:fetch('http://localhost:5000/api/user')浏览器就会报类似下面的错误:Access&nbsp;to&nbsp;fetch&nbsp;at&nbsp;'http://localhost:5000/api/user'&nbsp;from&nbsp;origin&nbsp;'http://localhost:3000'&nbsp;has&nbsp;been&nbsp;blocked&nbsp;by&nbsp;CORS&nbsp;policy:&nbsp;No&nbsp;'Access-Control-Allow-Origin'&nbsp;header&nbsp;is&nbsp;present&nbsp;on&nbsp;the&nbsp;requested&nbsp;resource.这说明前端请求被浏览器拦截了,产生了跨域错误。三、解决方案:使用本地代理(推荐)在&nbsp;React&nbsp;项目中,我们推荐使用&nbsp;代理转发(proxy)的方式解决跨域问题。1.&nbsp;配置方法方法一:使用&nbsp;vite(推荐现代项目)在&nbsp;vite.config.js中添加:export&nbsp;default&nbsp;{&nbsp;&nbsp;server:&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;proxy:&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'/api':&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;'http://localhost:5000',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeOrigin:&nbsp;true,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rewrite:&nbsp;path&nbsp;=&gt;&nbsp;path.replace(/^\/api/,&nbsp;'')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;}}请求写法:fetch('/api/user')&nbsp;&nbsp;//&nbsp;实际会代理到&nbsp;http://localhost:5000/user方法二:使用&nbsp;create-react-app在项目根目录下创建&nbsp;setupProxy.js文件(适用于&nbsp;react-scripts):npm&nbsp;install&nbsp;http-proxy-middleware&nbsp;--save//&nbsp;src/setupProxy.jsconst&nbsp;{&nbsp;createProxyMiddleware&nbsp;}&nbsp;=&nbsp;require('http-proxy-middleware');module.exports&nbsp;=&nbsp;function(app)&nbsp;{&nbsp;&nbsp;app.use(&nbsp;&nbsp;&nbsp;&nbsp;'/api',&nbsp;&nbsp;&nbsp;&nbsp;createProxyMiddleware({&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target:&nbsp;'http://localhost:5000',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;changeOrigin:&nbsp;true,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathRewrite:&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'^/api':&nbsp;''&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;);};此时你可以在前端发请求如下:fetch('/api/user')代理服务器会将请求自动转发到后端地址&nbsp;http://localhost:5000/user,浏览器认为是本地访问,从而不会报跨域错误。四、后端支持&nbsp;CORS(跨域资源共享)如果你无法使用代理(比如项目已部署上线),需要让后端支持&nbsp;CORS。以&nbsp;Node.js/Express&nbsp;为例:npm&nbsp;install&nbsp;corsconst&nbsp;express&nbsp;=&nbsp;require('express');const&nbsp;cors&nbsp;=&nbsp;require('cors');const&nbsp;app&nbsp;=&nbsp;express();app.use(cors());app.get('/user',&nbsp;(req,&nbsp;res)&nbsp;=&gt;&nbsp;{&nbsp;&nbsp;res.json({&nbsp;name:&nbsp;'张三'&nbsp;});});后端添加&nbsp;Access-Control-Allow-Origin等响应头后,浏览器就能正常接收响应。五、其他跨域解决方式(了解)
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务