项目中的新特性及写法

  1. data.name?.length
    如果要访问 JavaScript 中对象的嵌套属性,则必须在每个级别检查是否为 null 或 undefined,否则最终将会抛出 TypeError。
    在以前,会通过这种写法避免(data.name && data.name.length),这种写法不美观,且占用内存空间

如果表达式返回 null 或 undefined,则可选链运算符的左侧将始终返回 undefined

  1. attrslisteners
    $attrs--继承所有的父组件属性(除了prop传递的属性、class 和 style )
    父组件传递下来的,但是在你调用的那个组件里没有注册使用,需要继续传递下下去的所有。
    根组件:
//根组件里的引用的子组件,需要将message title age name 等数据传递到son组件里
<son :title="title" :name="name" :age="age" ></son>

子组件:

//子组件里引用孙组件,子组件声明了title属性,剩下的age、name还需要继续往下传递
<grandson :age="age" :name="name"></grandson>

如此往下,如果根组件定义了很多自定义属性都要绑定,写起来很麻烦,所以$attrs就排上了用场,子组件可以这样写:

<grandson v-bind="$attrs"></grandson>

listeners--属性,它是一个对象,里面包含了作用在这个组件上的所有监听器,你就可以配合 v-on="listeners" 将所有的事件监听器指向这个组件的某个特定的子元素。(相当于子组件继承父组件的事件)

  1. jsx写法
    此处较多,详见“vue中使用jsx”

  2. && || 灵活运用
    a. :class="inputValue && 'hasInitial'"
    如果inputValue值不为空,则class='hasInitial',为空,则class=''

b. initialValue = initialValue[0] || []
如果initialValue[0]不为空,则initialValue[0],为空则[]

综合:&& 前true则后,前false则前
|| 前true则前,前false则后

  1. scss篇
  • 变量基本构成:
    $color:red; $ 变量声明符,color 变量名称,red 变量值
  • 多个值取一个值nth(开始的下标不是0是1)
$divColor: orange green;
div{
  background-color: nth($divColor,2)
}
  • 传递多个参数
  
@mixin box-shadow($shodw...){
    box-shadow:$shodow;
}
div{
    @include box-shadow(-5px 0 5px orange,5px 0px 5px blue)
}
  • 代替样式名称#{}
@mixin set-value($direction){
    margin-#{$direction}:10px;
    padding-#{$direction}:10px;
}
.input-box{
    @include set-value(bootom);
}

这样可以用于公共样式书写
eg:

@mixin btn-bg-color($btnclass,$bgcolor){
    .btn-#{$btnclass}{
        background-color:$bgcolor
    }
}
@include btn-bg-color('warning',#5cb85c)
  • 默认值的设置及修改
@mixin transform($deg:20deg){
    transform:rotate($deg);
    -webkit-box-shadow:rotate($deg);
    -moz-box-shadow:rotate($deg);
    -o-box-shadow:rotate($deg);
    -ms-box-shadow:rotate($deg);
}
.box{
    @include transform(50deg);
}
  • 混入mixin
    a. 定义通用的样式,在页面中使用
    _mixins.scss中:

    @mixin box-shadow($shodw...){ //传递多个参数
        box-shadow:$shadow;
      }
    

    普通页面中:

    .card{
      height: 50px;
       @include box-shadow(-5px 0 5px orange,5px 0px 5px blue)
    }
    

    b.递归出样式,适用于针对不同状态,赋予不同颜色等等

    @each $idx, $color in (1, $color-theme_blue),
      (2, $color-theme_orange),
      (3, $color-theme_red),
      (4, $color-theme_purple) {
      .legend-item--level#{$idx}{
         color: $color;
         &::before{
           background-color: $color;
          }
        }
     }
    

    c. 换肤功能
    variables.scss:

    $bg-body-black: #000000;
    $bg-body-light: #FFFFFF; //设置不同皮肤时变量色值
    :export {   //这里导出,是用于在script中使用色值。特别是echarts中
      lightBgBody:$bg-body-light;
      blackBgBody:$bg-body-black;
    }
    

    _mixins.scss:

    @mixins bg_color($color,$background-color:'background-color'){
       //此处为$background-color设置默认值‘background-color’,为了这个公共色值去设置color、border等其他属性
     #{$background-color}: $color;   
    //为属性设置变量
      [data-theme='light'] & {
        #{$background-color}: $bg-body-light;
       }
      [data-theme='black'] & {
        #{$background-color}: $bg-body-black;
       }
    }
    
    

换肤按钮所在页面:

  toggleTheme(type) {
      window.document.documentElement.setAttribute('data-theme', type)
      this.$store.dispatch('common/setTheme', {
        theme: type
      }) 
    }

用到需要换肤的页面:

<script>
import colors from '@/styles/_modules/_variables.scss'
export default{
  methods:{
    changeColor(){
       //换肤前的代码:
        // const color = colors.lightBgBody

        //换肤后的代码
        const theme = this.$store.state.common.theme || 'light'
        const color = theme === 'light' ? colors.lightBgBody : colors.blackBgBody
    }
  }
}

</script>
<style lang="scss" scoped>
  .app-main{
    //换肤前的代码:
    //background-color: $bg-body-light;

    //换肤后的代码
    @include bg_color($bg-body-light)
  }
</style>
  1. ResizeObserver对单个元素进行大小监听
const resizeOb= new ResizeObserver(entries => {
    for(const entry of entries) {
        console.log(entry)
    }
})
resizeOb.observe(document.getElementById("test"))
//打印结果 {target: div#test, contentRect: DOMRectReadOnly}

通过实例化一个监听器,然后调用observe方法传入一个要执行监听的DOM元素或SVG元素,那么每次resize事件触发时都会执行ResizeObserver实例化时传入的回调函数,改回调函数默认会返回一个数组,数组里包含了每个被执行了监听器的元素及其可读信息,元素的拜访顺序也是监听器执行的顺序(对,实例化一个监听器,可多次执行observe方法对不同元素进行监听!)
ResizeObserver是在resize的过程中调用的,resize本身属于频繁触发的事件,在期间穿插太多逻辑其实对性能影响较大,如果只是想对某个元素变动后执行某个回调的话,建议最好搭配函数节流进行使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353