首页 > 其他分享 >Props介绍

Props介绍

时间:2023-04-20 12:44:36浏览次数:103  
标签:default Props 介绍 prop 类型 props 组件 js

Props 声明

一个组件需要显式声明它所接受的 props,这样 Vue 才能知道外部传入的哪些是 props,哪些是透传 attribute (关于透传 attribute,我们会在专门的章节中讨论)。

props 需要使用 props 选项来定义:

js
export default {
  props: ['foo'],
  created() {
    // props 会暴露到 `this` 上
    console.log(this.foo)
  }
}

除了使用字符串数组来声明 prop 外,还可以使用对象的形式:

js
export default {
  props: {
    title: String,
    likes: Number
  }
}

对于以对象形式声明中的每个属性,key 是 prop 的名称,而值则是该 prop 预期类型的构造函数。比如,如果要求一个 prop 的值是 number 类型,则可使用 Number 构造函数作为其声明的值。

对象形式的 props 声明不仅可以一定程度上作为组件的文档,而且如果其他开发者在使用你的组件时传递了错误的类型,也会在浏览器控制台中抛出警告。我们将在本章节稍后进一步讨论有关 prop 校验的更多细节。

TypeScript 用户请参考:为组件 Props 标注类型 

传递 prop 的细节

Prop 名字格式

如果一个 prop 的名字很长,应使用 camelCase 形式,因为它们是合法的 JavaScript 标识符,可以直接在模板的表达式中使用,也可以避免在作为属性 key 名时必须加上引号。

js
export default {
  props: {
    greetingMessage: String
  }
}
template
<span>{{ greetingMessage }}</span>

虽然理论上你也可以在向子组件传递 props 时使用 camelCase 形式 (使用 DOM 模板时例外),但实际上为了和 HTML attribute 对齐,我们通常会将其写为 kebab-case 形式:

template
<MyComponent greeting-message="hello" />

对于组件名我们推荐使用 PascalCase,因为这提高了模板的可读性,能帮助我们区分 Vue 组件和原生 HTML 元素。然而对于传递 props 来说,使用 camelCase 并没有太多优势,因此我们推荐更贴近 HTML 的书写风格。

静态 vs. 动态 Prop

至此,你已经见过了很多像这样的静态值形式的 props:

template
<BlogPost title="My journey with Vue" />

相应地,还有使用 v-bind 或缩写 : 来进行动态绑定的 props:

template
<!-- 根据一个变量的值动态传入 -->
<BlogPost :title="post.title" />

<!-- 根据一个更复杂表达式的值动态传入 -->
<BlogPost :title="post.title + ' by ' + post.author.name" />

传递不同的值类型

在上述的两个例子中,我们只传入了字符串值,但实际上任何类型的值都可以作为 props 的值被传递。

Number

template
<!-- 虽然 `42` 是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :likes="42" />

<!-- 根据一个变量的值动态传入 -->
<BlogPost :likes="post.likes" />

Boolean

template
<!-- 仅写上 prop 但不传值,会隐式转换为 `true` -->
<BlogPost is-published />

<!-- 虽然 `false` 是静态的值,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :is-published="false" />

<!-- 根据一个变量的值动态传入 -->
<BlogPost :is-published="post.isPublished" />

Array

template
<!-- 虽然这个数组是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :comment-ids="[234, 266, 273]" />

<!-- 根据一个变量的值动态传入 -->
<BlogPost :comment-ids="post.commentIds" />

Object

template
<!-- 虽然这个对象字面量是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost
  :author="{
    name: 'Veronica',
    company: 'Veridian Dynamics'
  }"
 />

<!-- 根据一个变量的值动态传入 -->
<BlogPost :author="post.author" />

使用一个对象绑定多个 prop

如果你想要将一个对象的所有属性都当作 props 传入,你可以使用没有参数的 v-bind,即只使用 v-bind 而非 :prop-name。例如,这里有一个 post 对象:

js
export default {
  data() {
    return {
      post: {
        id: 1,
        title: 'My Journey with Vue'
      }
    }
  }
}

以及下面的模板:

template
<BlogPost v-bind="post" />

而这实际上等价于:

template
<BlogPost :id="post.id" :title="post.title" />

单向数据流

所有的 props 都遵循着单向绑定原则,props 因父组件的更新而变化,自然地将新的状态向下流往子组件,而不会逆向传递。这避免了子组件意外修改父组件的状态的情况,不然应用的数据流将很容易变得混乱而难以理解。

另外,每次父组件更新后,所有的子组件中的 props 都会被更新到最新值,这意味着你不应该在子组件中去更改一个 prop。若你这么做了,Vue 会在控制台上向你抛出警告:

js
export default {
  props: ['foo'],
  created() {
    // ❌ 警告!prop 是只读的!
    this.foo = 'bar'
  }
}

导致你想要更改一个 prop 的需求通常来源于以下两种场景:

  1. prop 被用于传入初始值;而子组件想在之后将其作为一个局部数据属性。在这种情况下,最好是新定义一个局部数据属性,从 props 上获取初始值即可:

    js
    export default {
      props: ['initialCounter'],
      data() {
        return {
          // 计数器只是将 this.initialCounter 作为初始值
          // 像下面这样做就使 prop 和后续更新无关了
          counter: this.initialCounter
        }
      }
    }
    
  2. 需要对传入的 prop 值做进一步的转换。在这种情况中,最好是基于该 prop 值定义一个计算属性:

    js
    export default {
      props: ['size'],
      computed: {
        // 该 prop 变更时计算属性也会自动更新
        normalizedSize() {
          return this.size.trim().toLowerCase()
        }
      }
    }
    

更改对象 / 数组类型的 props

当对象或数组作为 props 被传入时,虽然子组件无法更改 props 绑定,但仍然可以更改对象或数组内部的值。这是因为 JavaScript 的对象和数组是按引用传递,而对 Vue 来说,禁止这样的改动,虽然可能生效,但有很大的性能损耗,比较得不偿失。

这种更改的主要缺陷是它允许了子组件以某种不明显的方式影响父组件的状态,可能会使数据流在将来变得更难以理解。在最佳实践中,你应该尽可能避免这样的更改,除非父子组件在设计上本来就需要紧密耦合。在大多数场景下,子组件应该抛出一个事件来通知父组件做出改变。

Prop 校验

Vue 组件可以更细致地声明对传入的 props 的校验要求。比如我们上面已经看到过的类型声明,如果传入的值不满足类型要求,Vue 会在浏览器控制台中抛出警告来提醒使用者。这在开发给其他开发者使用的组件时非常有用。

要声明对 props 的校验,你可以向 props 选项提供一个带有 props 校验选项的对象,例如:

js
export default {
  props: {
    // 基础类型检查
    //(给出 `null` 和 `undefined` 值则会跳过任何类型检查)
    propA: Number,
    // 多种可能的类型
    propB: [String, Number],
    // 必传,且为 String 类型
    propC: {
      type: String,
      required: true
    },
    // Number 类型的默认值
    propD: {
      type: Number,
      default: 100
    },
    // 对象类型的默认值
    propE: {
      type: Object,
      // 对象或者数组应当用工厂函数返回。
      // 工厂函数会收到组件所接收的原始 props
      // 作为参数
      default(rawProps) {
        return { message: 'hello' }
      }
    },
    // 自定义类型校验函数
    propF: {
      validator(value) {
        // The value must match one of these strings
        return ['success', 'warning', 'danger'].includes(value)
      }
    },
    // 函数类型的默认值
    propG: {
      type: Function,
      // 不像对象或数组的默认,这不是一个
      // 工厂函数。这会是一个用来作为默认值的函数
      default() {
        return 'Default function'
      }
    }
  }
}

一些补充细节:

  • 所有 prop 默认都是可选的,除非声明了 required: true

  • 除 Boolean 外的未传递的可选 prop 将会有一个默认值 undefined

  • Boolean 类型的未传递 prop 将被转换为 false。这可以通过为它设置 default 来更改——例如:设置为 default: undefined 将与非布尔类型的 prop 的行为保持一致。

  • 如果声明了 default 值,那么在 prop 的值被解析为 undefined 时,无论 prop 是未被传递还是显式指明的 undefined,都会改为 default 值。

当 prop 的校验失败后,Vue 会抛出一个控制台警告 (在开发模式下)。

注意

注意 prop 的校验是在组件实例被创建之前,所以实例的属性 (比如 datacomputed 等) 将在 default 或 validator 函数中不可用。

运行时类型检查

校验选项中的 type 可以是下列这些原生构造函数:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol

另外,type 也可以是自定义的类或构造函数,Vue 将会通过 instanceof 来检查类型是否匹配。例如下面这个类:

js
class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName
    this.lastName = lastName
  }
}

你可以将其作为一个 prop 的类型:

js
export default {
  props: {
    author: Person
  }
}

Vue 会通过 instanceof Person 来校验 author prop 的值是否是 Person 类的一个实例。

Boolean 类型转换

为了更贴近原生 boolean attributes 的行为,声明为 Boolean 类型的 props 有特别的类型转换规则。以带有如下声明的 <MyComponent> 组件为例:

js
export default {
  props: {
    disabled: Boolean
  }
}

该组件可以被这样使用:

template
<!-- 等同于传入 :disabled="true" -->
<MyComponent disabled />

<!-- 等同于传入 :disabled="false" -->
<MyComponent />

当一个 prop 被声明为允许多种类型时,例如:

js
export default {
  props: {
    disabled: [Boolean, Number]
  }
}

无论声明类型的顺序如何,Boolean 类型的特殊转换规则都会被应用。

标签:default,Props,介绍,prop,类型,props,组件,js
From: https://www.cnblogs.com/yitongtianxia666/p/17336377.html

相关文章

  • MySQL InnoDB Architecture 简要介绍
    MySQLInnoDB存储引擎整体架构图:一、内存存储结构 1、BufferPoolbufferpool是主内存中的一块儿存储区域,用于存储访问的表及索引数据。这样从内存中直接访问获取使用的数据可以极大的提升访问效率。在一些特殊专用的服务里,几乎80%的内存区域都被赋于bufferpool。为了......
  • Oracle CASE WHEN 用法介绍
    1.CASEWHEN表达式有两种形式 --简单Case函数CASEsexWHEN'1'THEN'男'WHEN'2'THEN'女'ELSE'其他'END--Case搜索函数CASEWHENsex='1'THEN'男'WHENsex='2'THEN'女&......
  • 自动化介绍
    一、自动化测试理论1、介绍 2、实施Ul自动化测试的前置条件需要回归测试的项目:甲方公司自己运营的项目、金融、电商、需求变更不频繁、项目周期长(如:京东) 3、UI自动化测试执行时机(什么时候该执行:手工测试完成后) 二、工具及选择介绍1、认识......
  • Colab平台介绍及使用
    免费GPU——Colab平台使用一、简介colab是google提供的一个免费GPU的Jupyter云服务平台,可以应用各种流行库,如深度学习的pytorch,tensorflow和keras等。二、colab使用1,访问colabhttps://colab.research.google.com/notebooks/welcome.ipynb(注:访问google需要tz才能注册、使......
  • js介绍
    1、介绍javascript,简称为js,是一种解释型脚本语言,一般在浏览器运行,被所有现代浏览器支持,在h5中,默认脚本就是js。当然,也可以在其他支持js解析的环境中允许,比如服务端的node.js。js主要可以分为四个部分:基本语法,与es强烈相关,提供支持。包括语法规范、数据类型、运算符、控制结构......
  • 【Nginx】Nginx介绍及配置详解
    Nginx是什么Nginx("enginex")是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强。Nginx官网:http://nginx.org/Nginx安装Nginx官网下载地址:http://nginx.org/en/download.html其中nginx-1.23.4这一列是Linux版本。Windows安装解压Nginx压缩包后,目录如下:启动n......
  • 简单介绍十几款常用的画架构图流程图的软件
    简单介绍十几款常用的画架构图流程图的软件draw.iodraw.io是开源免费的在线画图工具,还提供桌面版本。特性:实时协作;支持在线离线版本;存储支持多种方式:GoogleDrive,OneDrive,GitHub,GitLab,Dropbox等;许多丰富的图标库。ProccessOnProccessOn是一款优秀的国产在线协......
  • java大数据培训专业课程与教学模式的介绍
    很多人想要报名java大数据培训班,但是却不知道怎么选择java大数据培训班,也不知道学习Java都需要掌握哪些知识,java大数据没有你们想象的那么难,Java大数据培训班的选择技巧:一、java大数据培训班需要有专业课程java大数据学员选择培训班的首要条件就是:java大数据课程。Java大数据课程有......
  • 数据分析的基本知识介绍,通过Python创建一些漂亮的数据可视化
    近一年势头不灭的Python在数据分析领域,是专家们的必备技能。随着IT行业的增长,对有经验的数据科学家的需求也水涨船高,而Python也一跃而成最受欢迎的语言。介绍数据分析的基本知识,并利用Python创建一些漂亮的数据可视化。概要为什么要学数据科学中的Python?Python简介为数据......
  • 云计算基本概念的介绍,理解的误区有哪些?
    或许会以为企业中的基层IT员工和负责人应该很了解云计算的优势和劣势。然而他们对一些基本概念的错误认识实在是令人不安。以下就是非常普遍存在的四大误区。只要使用了公有云,就会有安全风险。这是个很让我感觉不安的误区,我也在博客中多次探讨过这一问题。事实上,在你使用公有云服务......