Vue空字符串不是假值吗怎么经过props就变成了true

  • Post author:
  • Post category:vue




Vue空字符串不是假值吗怎么经过props就变成了true

你定义了个组件

unhappy.vue

,在props中定义传入一个布尔值:

<template>
  <div>
    {{ active }}
  </div>
</template>

<script>
  export default {
    props: {
      active: {
        type: Boolean,
        default: false
      },
    },
  }
</script>

然后在

happy.vue

里调用它,但在这里

active

初始值是空字符串:

<template>
  <div>
    <Unhappy :active="active"></Unhappy>
  </div>
</template>

<script>
  import Unhappy from './unhappy.vue'

  export default {
    components: {
      Unhappy,
    },
    data() {
      return {
        active: ''
      }
    },
  }
</script>

我们知道在js里,空字符串是一个“假值”,它在布尔值上表现为false。

迄今为止,这两段代码看起来毫无问题——如果不看我标题的话,你甚至不会起疑心。但结果却让你以外,因为页面显示出了:

true

然后你一脸懵逼:“这里怎么会为true?”——这正是我在遇见这个情况的真实写照。

那么为什么呢?我扒出了vue的源码想一探究竟,然后参考了

leelxp

对源码的分析。发现了vue中,props从空字符串到false的真实情况:

export function validateProp(
  // 遍历propOptions时拿到的每个属性名。
  key: string,
  // 当前实例规范化后的props选项。
  propOptions: Object,
  // 父组件传入的真实props数据。
  propsData: Object,
  // 当前实例。
  vm?: Component
): any {
  // 当前key在propOptions中对应的值。
  const prop = propOptions[key]
  // 当前key是否在propsData中不存在,即父组件是否传入了该属性
  const absent = !hasOwn(propsData, key)
  // 当前key在propsData中对应的值,即父组件对于该属性传入的真实值。
  let value = propsData[key]
  // 如果prop.type定义的是Boolean类型则返回0
  const booleanIndex = getTypeIndex(Boolean, prop.type)
  // 0
  if (booleanIndex > -1) {
    if (absent && !hasOwn(prop, 'default')) {
      // 如果调用时没有传值,在规定props时没有定义默认值,则默认为false
      value = false
    } else if (value === '' || value === hyphenate(key)) {
      /*
        hyphenate:将驼峰形式转为连字符,比如——
        'UserName'.replace(/\B([A-Z])/g, '-$1').toLowerCase()
        结果为:'user-name'
      */
      // 如果prop.type定义的是String类型则返回0。实际定义的是Boolean。此处返回-1
      const stringIndex = getTypeIndex(String, prop.type)
      if (stringIndex < 0 || booleanIndex < stringIndex) {
        value = true
      }
    }
  }
  // ... 省略无关代码
  return value
}

这段代码在你定义props字段为

Boolean

类型,但传入

String

类型时,甚至可以简述为:

prop定义的类型是Boolean类型

调用时有传值

值为空字符串

prop定义的类型不为String类型

输出true

再简单点,子组件定义Boolean值,但传的值是空字符串时,输出

true



版权声明:本文为zoujiawei6原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。