前端---场景题

这篇具有很好参考价值的文章主要介绍了前端---场景题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 一个下拉框 200条数据 怎么优化 (默认展示10条)
  2. 60个请求(限制最多同时请求6个)请求并行方案
  3. 原生拖拽方案及实现细节(mouseMove、drag,drop) ✅ (有待继续完善)
  4. 数组遍历方法 哪个快
  5. 手写函数实现数组 。[12, 3, 24, 1, 932, 6423]按照首位排序
  6. 手写实现add函数 满足 add(1)(2)(3)() 返回 6

2、60个请求(限制最多同时请求6个)请求并行方案

  <script>
    /**
     * 此问题目的为了解决类似http请求的并发量过大导致内存可能溢出的问题。
        1、同时执行任务数6个
        2、每执行一次就需要将请求 --
        3、当前任务队列执行完成之后,执行下一个
        4、所有任务添加到队列后,自动开始执行任务
     */
    debugger
    function concurrentPoll() {
        this.tasks = []; // 任务队列
        this.max = 10; // 最大并发数
        // 函数主体执行完后立即执行,由于setTimeout是macrotask(宏任务),promise是microtask(微任务)
        // 所以,addTask方法添加的函数会优先执行
        setTimeout(() => {
            this.run()
        }, 2000)
    }

    concurrentPoll.prototype.addTask = function (task) { // 原型添加任务方法
        this.tasks.push(task)
    }

    concurrentPoll.prototype.run = function () { // 原型任务运行方法
        if (this.tasks.length == 0) { // 判断是否还有任务
            return
        }
        const min = Math.min(this.tasks.length, this.max); // 取任务个数与最大并发数最小值
        console.log('min', min)
        for (let i = 0; i < min; i++) {
            this.max--; // 执行最大并发递减
            const task = this.tasks.shift(); // 从数组头部取任务
            task().then((res) => { // 重:此时可理解为,当for循环执行完毕后异步请求执行回调,此时max变为0
                debugger
                console.log(res)
                console.log('res', this.max) // 0 1 2 3 4 5 6 7 8 9 / 10 11 12
            }).catch((err) => {
                console.log(err)
            }).finally(() => { // 重:当所有请求完成并返回结果后,执行finally回调,此回调将按照for循环依次执行,此时max为0.
                debugger
                this.max++; // 超过最大并发10以后的任务将按照任务顺序依次执行。此处可理解为递归操作。
                // 0++ = 1 0++ = 1 0++ = 1
                this.run(); 
                //               1-- = 0  1-- = 0  1-- = 0
                // tasks.length  2        1        0
                console.log('finally', this.max)// 0 0 0 1 2 3 4 5 6 7之后执行.then,执行完之后再执行 8 9 10
            })
        }
    }

    const poll = new concurrentPoll(); // 实例
    for (let i = 0; i < 13; i++) { // 数据模拟
        poll.addTask(function () {
            return new Promise(
                function (resolve, reject) {
                    // 一段耗时的异步操作
                    resolve(i + '成功') // 数据处理完成
                    // reject('失败') // 数据处理出错
                }
            )
        })
    }


  </script>

3、原生拖拽方案及实现细节(mouseMove、drag,drop)

<script>
export default {
  name: 'drag',
  data() {
    return {
      afterData: ['', '', '', ''],
      beforeData: ['花', '好', '月', '圆'],
      resData: [
        ['花', '好', '月', '圆'],
        ['百', '年', '好', '合'],
        ['一', '帆', '风', '顺']
      ],
      beforeId: '',
      dragId: '',
      downMoveX: 0, // 按下的 div 移动的坐标
      downMoveY: 0,
      mouseX: 0, // 鼠标在 div中 x坐标
      mouseY: 0,
    }
  },
  mounted() {
    this.dragId = document.getElementById('drag')
    this.oldBlanks = document.querySelectorAll('.after')
    console.log('oldBlanks', this.oldBlanks)
    console.log('drag-offsetTop', this.dragId.offsetTop)
  },
  methods: {
    // handleDarg() {
      
    // },
    handleBeforeDown(e, id) {
      this.beforeId = document.getElementById(id)
      console.log('eeee->', e)
      const { offsetX, offsetY } = e
      this.mouseX = offsetX
      this.mouseY = offsetY
      this.downMoveX = this.beforeId.offsetLeft     
      this.downMoveY = this.beforeId.offsetTop
      console.log('this.downMoveY',  this.downMoveY)
      const setDiv = this.beforeId.style
      setDiv.background = 'pink'
      setDiv.position = 'absolute'
      setDiv.top = this.downMoveY + 'px'
      setDiv.left = this.downMoveX + 'px'
      setDiv.width = '98px'
      setDiv.height = '98px'
      
      this.beforeId.addEventListener('mousemove', this.handleBeforeMove)
      console.log('beforeId', this.beforeId)
    },
    handleBeforeMove(e){
      console.log('9023', e)
      console.log('232', window.event)
      const { offsetX, offsetY, clientX, clientY } = e
      let moveY = clientY - this.dragId.offsetTop - this.mouseY
      let moveX = clientX - this.dragId.offsetLeft - this.mouseX
      console.log('moveY-->', moveY)
      console.log('moveX-->', moveX)
      // 2、设置边界
      if (moveY <= 0) {
        moveY = 0
      } else if (moveY >= 500) {
        moveY = 500
      }
      if (moveX <= 0) {
        moveX = 0
      } else if (moveX >= 500) {
        moveX = 500
      }
      // 1、开始移动距离
      this.beforeId.style.top = moveY + 'px'
      this.beforeId.style.left = moveX + 'px'
    },
    handleBeforeUp() {
      if (this.beforeId) {
        this.handleDIvAdsorption()
        // this.beforeId.style = {}
        this.beforeId.removeEventListener('mousemove', this.handleBeforeMove)
        this.beforeId = ''
        this.mouseX = 0
        this.mouseY = 0
        this.downMoveX = 0  
        this.downMoveY = 0
      }
    },
    // 拖动的div,查看吸附哪个空白div上
    handleDIvAdsorption() {
      const whiteDivArea = this.oldBlanks[0].offsetWidth * this.oldBlanks[0].offsetHeight
      for (let i = 0;i < this.oldBlanks.length; i++) {
        if (this.afterData[i] !== '') {
          continue;
        }
        const oldDiv = this.oldBlanks[i]
        const { offsetTop, offsetLeft } = this.beforeId
        debugger
        let verticalLength = oldDiv.offsetHeight - ( offsetTop - oldDiv.offsetTop )
        console.log('verticalLength', verticalLength)
        let transverseLength = 0
        if (offsetLeft >= oldDiv.offsetLeft) {
          transverseLength = oldDiv.offsetWidth - (offsetLeft - oldDiv.offsetLeft)
        } else {
          transverseLength = oldDiv.offsetWidth - (oldDiv.offsetLeft - offsetLeft)
        }
        if (verticalLength > 0 && transverseLength > 0) {
          const occupiedArea = transverseLength * verticalLength
          console.log('transverseLength', transverseLength)
          if (occupiedArea / whiteDivArea >= 0.5 ) {
            console.log('在指定区域,可以吸附')
            this.handleSetMouseDiv(oldDiv.offsetTop, oldDiv.offsetLeft)
            this.afterData.splice(i, 1, this.beforeId.innerText)
            return
          }
          console.log('不可以吸附')
          this.handleSetMouseDiv(this.downMoveY, this.downMoveX)
        }
      }
    },
    handleSetMouseDiv(top, left){
      const setDiv = this.beforeId.style
      setDiv.top = top + 'px'
      setDiv.left = left + 'px'
    }
  }
}
</script>

文章来源地址https://www.toymoban.com/news/detail-512738.html

到了这里,关于前端---场景题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决前端vue框架select下拉数据量过大造成卡顿问题

    问题:当加载上百条、上千条数据,导致下拉框数据卡顿 解决:将数据分割成更小的单元,每次下拉到底部加载一部分  利用下拉滚动事件  视图部分: a-select label-in-value :default-value=\\\"{ key: \\\'lucy\\\' }\\\" style=\\\"width: 120px\\\" @change=\\\"handleChange\\\" @popupScroll=\\\"handldpopupscroll\\\" a-select-option/a-selec

    2024年02月16日
    浏览(42)
  • 前端开发怎么解决性能优化的问题? - 易智编译EaseEditing

    前端性能优化是确保网站或应用在加载速度、响应性和用户体验等方面达到最佳状态的关键任务。以下是一些解决前端性能优化问题的方法: 压缩和合并代码: 压缩和合并CSS、JavaScript和HTML文件可以减少文件大小,加快加载速度。使用压缩工具(如UglifyJS和CSSNano)和构建工具

    2024年02月11日
    浏览(47)
  • 【介绍一个组件】go: Copy-On-Write map,对读极多和写极少的场景做优化

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 代码请看:https://github.com/ahfuzhang/cowmap 有这样一种场景:数据量不多的map,在使用中读极多写极少。为了在这种场景下做极致的优化,我实现了 copy-on-write 的map: 其实现

    2024年04月24日
    浏览(29)
  • vue前端判断某一个String类型的集合中是否包含某一个字符串怎么做

    在上面的代码中,我们使用 includes() 方法判断 strList 数组中是否包含 targetStr 字符串,如果包含则输出“字符串集合中包含目标字符串”,否则输出“字符串集合中不包含目标字符串”。 该博文为原创文章,未经博主同意不得转。本文章博客地址:https://cplusplus.blog.csdn.net/a

    2024年02月21日
    浏览(76)
  • 大数据场景下clickhouse查询时长优化sop

    ClickHouse的优化需要结合实际的数据特点和查询场景,从多个方面进行综合优化,以提高系统的性能和可靠性。 数据模型设计 :在使用ClickHouse之前,需要充分考虑数据模型的设计,因为数据模型的设计对查询性能有很大的影响。通常来说,ClickHouse适合存储大量的、高维度的

    2024年02月16日
    浏览(39)
  • 数据仓库内容分享(十七):Doris实践分享:它做了哪些架构优化和场景优化?

    Apache Doris是一款开源的实时数据仓库,由百度旗下的技术团队开发。它具有高性能、高可靠性、易扩展等特点,能够满足大规模数据实时查询和分析的需求。目前,Apache Doris已经成为国内外众多企业的首选数据仓库解决方案,包括阿里巴巴、美团、京东、滴滴等知名企业。

    2024年02月21日
    浏览(55)
  • 判断一个数据是否为 JSON 数据与使用场景

    判断一个数据是否为 JSON 数据,可以通过以下几个步骤: 首先,判断该数据是否为字符串类型。因为 JSON 数据通常是以字符串形式传输的。 然后,使用 try...catch 语句尝试将该字符串解析为 JSON 数据。如果解析成功,则说明该数据为 JSON 数据;否则,说明该数据不是 JSON 数据

    2024年02月09日
    浏览(54)
  • Unity切换场景保存上一个场景的数据,Unity切换场景的案例,Unity切换场景再返回数据丢失的解决方案

    Unity在切换场景之后在再次返回上不会保存上一个场景的数据的。 但是大多数时候我们是需要这些数据的,这应该如何解决呢? 文件链接:我将解决方案打包了,点我下载,免费,或者私信我发你 首先将需要存储到一个class中,这里以学生为例子 然后我们再创建一个脚本,

    2024年02月02日
    浏览(50)
  • 如何vue使用ant design Vue中的select组件实现下拉分页加载数据,并解决存在的一个问题。

        需求:拉下菜单中数据过多,200条以上,就会导致select组件卡死。所以需要使用滑动到底部使其分页加载     可以借助 onPopupScroll 事件来监听下拉菜单的滚动事件,并判断当前是否已经到达了下拉菜单底部。具体可以通过以下步骤实现:     1、在组件中绑定 @popupScro

    2023年04月20日
    浏览(54)
  • Python —— 特殊场景处理(下拉框、鼠标、键盘操作&文件上传)

    1、概述 使用Selenium的ActionChains类来模拟鼠标操作,导入模块如下: 通过ActionChains对象可以发起鼠标左键、右键、移动鼠标等操作,最后使用perform方法执行操作。一些操作的方法如下所示: 一个简单的示例如下: 2、实战 1、概述 Selenium中send_keys除了可以模拟键盘输入之外,

    2024年02月06日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包