1. 零散知识点二
    1. CSS兄弟元素选择器
    2. CSS圆心渐变
    3. CSS自定义属性(变量?)
    4. CSS resize
    5. 深拷贝中如何判断字符串是不是json?
    6. React的setState

零散知识点二

CSS兄弟元素选择器

ul > li + li

ul > li 代表ul元素下的直接li子元素

li + li 代表li元素后紧邻的li兄弟元素(同父级),注意是后,没有前

.demo ~ li 代表类名为demo元素后的所有li兄弟元素(同父级)

可以用来给列表加border

CSS圆心渐变

.demo { 
    width: 200px;
    height: 200px;
    border-radius: 50%;
    background: conic-gradient(blue60%,red 60% 80%, green 80%);
}

参数说明:

conic-gradient(<第一个颜色>[ <结束位置>][,<第n个颜色>[ <开始位置> <结束位置>],…],<最后一个颜色> [<开始位置>])

如果增加开始位置或结束位置,则不产生渐变

用来画饼状图

优点是不需要考虑整体和是否为100%的问题,因为有些时候,百分比传过来的值往往和为100.1%这样?

CSS自定义属性(变量?)

语法:–<属性名>: <属性值>

应用于进度条

<div class=“demo" style="--percent:20;"></div>
.demo {
    height: 50px;
    border: 1px solid;
    background-image: linear-gradient(red, red);
    background-repeat: no-repeat;
    background-size: calc(var(--percent) * 1%);
}

通过dom.style.cssText来控制进度

CSS resize

还记得textarea吗,原来右下角那个小东西可以拖动,现在可以通过resize属性实现任意元素的大小拖动

.demo {
    height: 1px;
    border: 1px solid;
    overflow: hidden;
    resize: auto;
}

上述除了resize属性之外,其他三者都是必须的,其中height必须>0

深拷贝中如何判断字符串是不是json?

function isJson(str) {
    try {
        return JSON.parse(str);
    }catch(e){
        return str;
    }
}

React的setState

此api用于更新组件状态(废话

但是,React在这上面做了一些手脚,导致这个api是异步的,作为初学者的我在写业务的时候也遇到了。

一般人来讲,更新了状态后回紧接着打印出来查看结果,但是在React中不会立即更新状态,因为它是异步的。

Component.prototype.setState = function(partialState, callback) { //React 16.8.X
    ...
    this.updater.enqueueSetState(this, partialState, callback, 'setState');
};

通过源码中的函数名称enqueueSetState就可以看出来,setState只是将要更新的状态加入了一个队列当中,类似于event loop中的队列,都是pedding状态并未执行。

然后在真的需要更新的时候去合并队列中的state。

但是真实情况更加复杂,react16引入了fiber这一概念,类似于操作系统的时间分片,具体内容这里不展开。

最后如果真的想要看到更新后的结果,可以通过第二个参数callback中去打印。