call、apply、bind自定义实现

问题背景:

自定义实现一个broadcast函数

  • 作用:事件广播

  • 实现思路:逐级遍历子组件,匹配组件名称,若匹配到则在该组件上触发对应的事件,否则继续往下遍历子组件

  • 问题:复用boradcast函数,通过call修改上下文为当前子组件,发现修改无效,导致死循环

export default {
    methods: {
        broadcast (componentName, eventName, params) {
            const children = this.$children
            if (children) {
                children.forEach(child => {
                    const name = child.$options.name
                    if (name === componentName) {
                        // 组件名称匹配则触发事件
                        child.$emit(eventName, params)
                    } else {
                        // 不匹配则继续往下遍历
                        this.broadcast.call(child, componentName, eventName, params)
                    }
                })
            }
        }
    }
}
移动端自适应方案变迁

假设设计稿是宽为1080px

px -> rem

优点:

  • 自适应
  • 限制页面大小

缺点:

  • 耗费性能,实时监听
  • 使用js计算,代码不优雅

方案:

  1. 针对设计稿,设置一个font-size,作为rem,这样设计稿中的所有px单位都可转成rem表示

    为了方便换算,设置font-size= 1rem = 10px,这样100px就可以表示为10rem

  2. 接下来则是在实际开发代码中保持比例,维持一个换算关系,从而在开发中使用rem单位

    1080px / 10px(1rem) = window.innerWidth(屏幕宽度) / x(待换算得出的不同页面的rem)

    x = window.innerWidth(屏幕宽度) / [1080px / 10px(1rem) ]

ThreeJS之魔方

魔方初体验

效果图:

初识ThreeJS

源码结构

基本程序结构

模型

对于网格模型Mesh而言,几何体geometry三个顶点为一组渲染出来一个三角形,

对于点模型Points而言,几何体的每个顶点对应位置都会渲染出来一个方形的点区域

几何体

网格模型就是通过多个三角形组合而成

对于球形网格则只要三角形细分足够多,则区域球形


JS存储Number

js中只有Number一种数字类型,采用的是IEEE754标准中的双精度浮点数进行存储,存储时是不区分整数和浮点数的,存储时是一致的。

IEEE754中浮点数的存储格式

主要分成3个部分:符号位(1bit)、指数位(11bit)、分数位(52bit)

符号位

0表示正

1表示负

指数位

指数位最大最小值用于表示特殊值,中间位则用于表示常规数字

分数位

分数位一共有52bit,而系统还默认保存了一位,其值为1,所以总共有53位(第一位默认位1,故不保存,节约了位置,以表示更多数)

UML类图&顺序图

UML简介

WHAT 什么是UML?

UML(Unified Modeling Language)统一建模语言,由一整套图标组成的标准化建模语言

WHY 为什么要用UML?

建筑行业中,设计师负责设计出房子,施工方使用这个设计来建造房子。

建筑越复杂,设计师和施工人员之间的交流就越重要,而建筑蓝图就成为了这个行业中的设计师和施工人员的必修课。

写软件就好像建造建筑物一样,系统越复杂,参与编写与配置软件的人员之间的交流也就越重要。

UML则是程序员对外沟通的“建筑蓝图”。进行项目的时候,通过使用 UML 的方式来更明确、清晰的表达项目中的架设思想、项目结构、执行顺序等一些逻辑思维。


Virtual DOM

WHAT

使用JS对象(虚拟DOM树)模拟真实DOM树

WHY

前端页面刷新变迁:

  • 整个页面刷新
    • 优点:操作简单
    • 缺点:渲染太耗时,费资源
  • 操作DOM(JQuery)局部刷新
    • 优点:渲染快速
    • 缺点:操作繁琐
  • MVVM(Angular)
    • 优点:渲染快速,操作简单
    • 缺点:脏检查效率不高
  • Virtual DOM(React、Vue)
    • 优点:渲染快速,操作简单,高效的Diff算法减少了DOM操作
webpack学习笔记

为什么使用webpack

前端模块化

随着前端项目越来与复杂,为了更好的复用代码,采用的模块化的思想来组织代码。

模块化解决了前端的哪些痛点:

  • 命名冲突
  • 文件依赖(js 加载顺序)
  • 代码复用

有了模块,我们就可以方便的复用他人的代码,那么问题来了,无规矩不成方圆,我们在使用他人代码的时候肯定是要遵循某种规范,所以就出现了 CommonJS、AMD 和 终极模块化方案 —— ES6 模块,这些都是前端模块化的规范。

我们来简单了解一下:

前端自定义实现CI/CD

初识Docker

在我们开发过程中肯定存在这么一个场景,我们开发完一套程序,在自己本机运行正常;

测试阶段,部署到测试环境发现跑不起来,解决完之后;

上线阶段,发现线上环境跑不起来~

那要怎么解决呢?

虚拟机

初期,我们使用虚拟机技术,将可运行的环境的进行复制粘贴

但是,虚拟机由于需要重新部署一个底层操作系统,而一个操作系统动则几G到几十G,占用内存,且启动也相对缓慢费时的

那么,有没有一种技术可以鱼与熊掌兼得,既能隔离环境,又方便部署呢?

排序算法

  • 基础排序算法:
    • 冒泡排序
    • 选择排序
    • 插入排序
  • 进阶排序算法:
    • 希尔排序
    • 归并排序
    • 快速排序
  • 高阶排序算法:
    • 堆排序
    • 计数排序
    • 桶排序
    • 基数排序

冒泡排序

冒泡排序的过程,就是从第一个元素开始,重复比较相邻的两个项,若第一项比第二项更大,则交换两者的位置;反之不动。

八股文

BFC

BFC 的创建

以下元素会创建 BFC

  • 根元素(<html>
  • 浮动元素(float 不为 none
  • 绝对定位元素(positionabsolutefixed
  • 表格的标题和单元格(displaytable-captiontable-cell
  • 匿名表格单元格元素(displaytableinline-table
  • 行内块元素(displayinline-block
  • overflow 的值不为 visible 的元素
  • 弹性元素(displayflexinline-flex 的元素的直接子元素)
  • 网格元素(displaygridinline-grid 的元素的直接子元素)
自动引入ElMessage,解决ts声明及ESLint报错问题

问题背景

按照Element-plus官网指南,按需引入组件

// vite.config.ts
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default {
  plugins: [
    // ...
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
}
vue3中获取顺序对应的refs数组

vue3项目中需要动态增加或删减子组件,因此用到了vue3中建议的的这个方式

<div v-for="item in list" :ref="setItemRef"></div>