工作中的解题思想(二)

  1. vue中:scss、scoped、deep配合使用
    例子:

    1
    2
    3
    4
    5
    <style lang="scss" scoped>
    /deep/ .el-input,.el-select {
    width: 100%;
    }
    </style>

    scoped:
    a. 当 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素;
    b. 使用 scoped 后,父组件的样式将不会渗透到子组件中;
    c. 使用scoped需要注意:子组件的根节点会同时受到父组件作用域的css和子组件作用域的css的影响。
    deep深度作用选择器:
    如果你希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>> 操作符;
    注意: 有些像 Sass 之类的预处理器无法正确解析 >>>。这种情况下你可以使用 /deep/ 操作符取而代之,
    这是一个 >>> 的别名,同样可以正常工作。
    如果不使用scoped,还可以使用嵌套的方法来实现。

  2. 使用Intersection Observer实现图片懒加载(延迟加载)
    a. 其实有很多的延迟加载库可以完成这项工作,但是我们会发现绝大部分的这些库都是利用滚动事件或者使用定时器来
    检查一个元素是否在视区内,但是出现的问题是:它会强制浏览器重新布局整个页面,而且在特定的条件下会导致我们
    的网站出现卡顿的现象。scroll事件密集发生,计算量很大,容易造成性能问题。
    b. Intersection Observer内置于大多数现代浏览器,它的作用就是:让你知道元素何时进入或离开浏览器视口。
    它还有一个优点:它可以异步传输数据,并且不会影响主线程,这让它成为一个提供反馈的有效手段。
    c. Intersection Observer的使用:
    let io = new IntersectionObserver(callback, option)
    解析:
    (1)IntersectionObserver:是浏览器原生提供的构造函数,接收两个参数;
    (2)callback:目标元素的可见性变化时,就会调用观察器的回调函数callback,callback一般会触发两次,
    一次是目标元素刚刚进入视口(开始变成可以看见的),另一次是完全离开视口(开始变成不可以看见的);
    如:let io = new IntersectionObserver( entries => { console.log(entries) } )
    解析:callback函数的参数entries是一个数组,它里面的每个成员都是一个IntersectionObserverEntry对象(见d的解析),IntersectionObserverEntry接口描述了
    目标元素与其根元素容器在某一特定过渡时刻的交叉状态。然后举个例子来说,如果同时有两个被观察对象的可见性发生变化,entries数组就会有两个成员。
    (3)option是配置对象(该参数可选)。
    (4)构造函数的返回值是一个观察器实例,在这里即是io实例:
    // 开始观察
    io.observe(document.getElementById(‘example’))
    注意:observe的参数是一个 DOM 节点对象。如果要观察多个节点,就要多次调用这个方法。
    如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    io.observe(elementA)
    io.observe(elementB)
    // 停止观察
    io.unobserve(element)
    // 关闭观察器
    io.disconnect()```
    d. IntersectionObserverEntry对象:它提供目标元素的信息,一共有六个属性。
    ```javascript
    {
    time: 3893.92,
    rootBounds: ClientRect {
    bottom: 920,
    height: 1024,
    left: 0,
    right: 1024,
    top: 0,
    width: 920
    },
    boundingClientRect: ClientRect {
    // ...
    },
    intersectionRect: ClientRect {
    // ...
    },
    intersectionRatio: 0.54,
    target: element
    }

    (1)time:可见性发生变化的时间,是一个高精度时间戳,单位为毫秒;
    (2)rootBounds:根元素的矩形区域的信息,getBoundingClientRect()方法的返回值,如果没有根元素(即直接相对于视口滚动),则返回null;
    (3)boundingClientRect:目标元素的矩形区域的信息;
    (4)intersectionRect:目标元素与视口(或根元素)的交叉区域的信息;
    (5)intersectionRatio:目标元素的可见比例,即intersectionRect占boundingClientRect的比例,完全可见时为1,完全不可见时小于等于0;
    (6)target:被观察的目标元素,是一个 DOM 节点对象
    下面给大家看一张示例图:
    IntersectionObserverEntry对象示例图
    e. Option对象:IntersectionObserver构造函数的第二个参数是一个配置对象。它可以设置以下属性:
    (1)threshold属性:它决定了什么时候触发回调函数,它是一个数组,每个成员都是一个门槛值,默认为[0],即交叉比例(intersectionRatio)
    达到0时触发回调函数,用户可以自定义这个数组;
    如: new IntersectionObserver( entries => {/* … */}, { threshold: [0, 0.25, 0.5, 0.75, 1] } )
    解析:[0, 0.25, 0.5, 0.75, 1]就表示当目标元素 0%、25%、50%、75%、100% 可见时,会触发回调函数。
    (2)root属性:首先我们需要注意:目标元素不仅会随着窗口滚动,还会在容器里面滚动(比如在iframe窗口里滚动),容器内滚动也会影响
    目标元素的可见性。root属性指定目标元素所在的容器节点(即根元素),我们还需要知道的是容器元素必须是目标元素的祖先节点;
    (3)rootMargin属性:定义根元素的margin,用来扩展或缩小rootBounds这个矩形的大小,从而影响intersectionRect交叉区域的大小,
    它使用CSS的定义方法,比如10px 20px 30px 40px,表示 top、right、bottom 和 left 四个方向的值。
    如:

    1
    2
    3
    4
    5
    6
    7
    8
    let opts = {
    root: document.querySelector('.container'),
    rootMargin: "500px 0px"
    };
    let observer = new IntersectionObserver(
    callback,
    opts
    );

    这样设置以后,不管是窗口滚动或者容器内滚动,只要目标元素可见性变化,都会触发观察器。
    f. IntersectionObserver API是异步的,不随着目标元素的滚动同步触发,规格写明,IntersectionObserver的实现,应该采用requestIdleCallback(),
    即只有线程空闲下来,才会执行观察器。这意味着,这个观察器的优先级非常低,只在其他任务执行完,浏览器有了空闲才会执行。

  3. element ui中form表单中prop的一个特殊用法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <div>
    </div>
    export default {
    data() {
    return {
    form: {
    tmp_evaluation: [
    {
    award_name: '',
    award_amount: '',
    },
    ],
    }
    }
    }
    }

    关于prop中tmp_evaluation.${index}.award_name会自动解析成tmp_evaluation[index].award_name
    注意:如果写成tmp_evaluation[index].award_name它会失效的
    参考链接:https://segmentfault.com/q/1010000013673418
    element ui参考链接:https://element.eleme.cn/#/zh-CN/component/form#dong-tai-zeng-jian-biao-dan-xiang

  4. 按回车键自动提交表单的问题
    链接:http://www.xiaowangyun.com/wyblog/detail/?id=180
    如果在el-form中,还有一个解决办法:
    在el-form加上@submit.native.prevent
    如:

  5. 如果你当前是在新创建的new-dev分支上,如果你想上传到你远程的origin dev分支中,执行的命令是:
    git push origin new-dev:dev

  6. 使用$router来跳转到新的页面
    let routeData = this.$router.resolve({name: ‘routeName’, query: {data: “someData”}})
    window.open(routeData.href, ‘_blank’)
    参考链接:https://stackoverflow.com/questions/40015037/can-vue-router-open-a-link-in-a-new-tab

  7. JS 中数组字符串索引和数值索引研究
    参考链接:https://www.cnblogs.com/goloving/p/9180588.html