如果你一直在阅读有关"props"内容,你会发现我们可能也一直在使用它们(即使没有意识到),但也许你并不完全确定它们是什么。或者如何正确使用它们,并充分利用它们。

当你读完这篇指南时,你就会知道成为一名高效的Vue开发者所需要知道的关于props的一切。

在本指南中,我们将介绍关于 props 的最重要的事情:

什么是 props ?

props 的两个主要特点

如何将 props 传递给其他组件

添加 props 类型

添加必填的 props

设置默认值

什么是 props ?

props 是我们在不同组件之间传递变量和其他信息的方式。这类似于在 JS 中,我们可以将变量作为参数传递给函数:

const myMessage = "I'm a string";

function addExclamation(message) {

return message + '!';

}

console.log(addExclamation(myMessage)); // I'm a string!

这里,我们将变量myMessage作为参数message传递给函数。在函数内部,我们可以将该值作为message访问。

props的工作原理与此非常相似。我们将props传递给另一个组件,然后该组件可以使用该值。但是首先需要了解一些规则。

props 的两个主要特点

在处理props时,有两件事需要特别注意:

props 通过组件树传递给后代(而不是向上传递)

props 是只读的,不能修改

Vue 使用单向数据流,这意味着数据只能从父组件流向子组件,不能将数据从子对象传递到父对象。因为父组件“拥有”它传递的值,所以子组件不能修改它。如果只允许一个组件更改它,那么跟踪bug就更容易了,因为我们确切地知道应该从哪里查找。

在开发确保没有违反这两条规则,开发就会变得更容易些,出问题也比较好找原因。接着来看看如何将 props 从一个组件传递到另一个组件。

将 props 传递给其他组件

如果希望将值从组件传递到子组件,这与添加HTML属性完全相同。

Camera组件将使用name和img props 来渲染自身页面。内容大概如下:

{{ name }}

在这里,我们将name渲染到h2标记中,并使用img设置img标记上的src属性。

但是,如果我们将此信息存储在某个位置的变量中怎么办?

为此,我们需要使用稍微不同的语法,因为我们希望使用 JS 表达式而不是传递字符串。

v-bind:name="cameraName"行告诉Vue将 JS 表达式cameraName绑定到 prop name。JS 表达式是 JS 的任何代码段。 可能是像我们在此处这样的变量名,或更复杂的名称。

还可以使用逻辑或 img 设置图像路径:

v-bind 可以用简写形式 :

添加 props

在此代码实际起作用之前,我们需要获取Camera组件才能实际收听props。 默认情况下,组件会忽略它们。为此,我们必须在组件定义中添加一个props部分:

export default {

name: 'Camera',

props: ['name', 'img'],

}

通常不建议这么写,应该为props对象指定类型:

export default {

name: 'Camera',

props: {

name: {

type: String,

},

img: {

type: String,

}

}

}

通过从数组到对象,我们可以指定更多的 props 细节,比如类型。我们为什么要向 props 添加类型?

在Vue中,props 可以有很多不同的类型:

String

Number

Boolean (true 或者 false)

Array

Object

通过添加类型,我们可以设置我们期望收到的数据类型。如果我们将camera的props中的name设置为true,它将无法正常工作,因此Vue会警告我们使用错误。

接着添加一个rating到我们的Camera组件中,该 rating 类型为 Number:

export default {

name: 'Camera',

props: {

name: {

type: String,

},

img: {

type: String,

},

rating: {

type: Number,

},

}

}

然后在 template 中显示 rating:

{{ name }}

{{ rating }}

在外层调用:

必填的 props

不是所有的 props 都是一样的,为了使组件正常工作,其中一些要求必填的。

对于我们的Camera组件,我们肯定需要一个name,但 img 和 rating 不是必需的。

export default {

name: 'Camera',

props: {

name: {

type: String,

required: true,

},

img: {

type: String,

},

rating: {

type: Number,

},

}

}

通过设置 required: true 要求我们的 name 是必需要传入的,相反,required 为 false 对应的props可传可不传。

默认值

对于不是每次都传入的 props,我们可以为其,添加默认值。

export default {

name: 'Camera',

props: {

name: {

type: String,

required: true,

},

img: {

type: String,

default: '../no-camerage-found.jpg',

},

rating: {

type: Number,

},

}

}

前面我们通过逻辑或为img添加默认值,这次我们使用 default 属性为img设置默认值。

同样也需要为我们的rating设置默认值。如果没有设置也没有从外部传入,我们访问的时候就会得到undefined,这可能会给我们带来一些问题

在模板外使用 props

虽然能够在template中使用props很棒,但是真正强大的功能来自于在方法、计算属性和组件中在使用其他 JS 中使用它们。

在我们的template中,我们看到我们只需要props名称,例如:{{rating}}。 但是,在Vue组件的其他任何地方,我们都需要使用this.rating访问我们的props。

让我们重构应用程序,以便为图像使用标准的URL结构。 这样,我们不必每次都将其传递给Camera组件,而只需从名称中找出即可。

我们将使用以下结构:./images/cameras/${cameraName}.jpg

因此,如果 camera 是Sony A6400,则URL将变为./images/cameras/Sony%20A6400.jpg。 %20来自对空格字符的编码,因此我们可以在URL中使用它。

首先,我们将移除不再需要的img props

export default {

name: 'Camera',

props: {

name: {

type: String,

required: true,

},

rating: {

type: Number,

default: 0,

},

}

}

然后,我们将添加一个计算属性,该属性将为我们生成图像URL:

export default {

name: 'Camera',

props: {

name: {

type: String,

required: true,

},

rating: {

type: Number,

default: 0,

},

},

computed: {

img() {

return ./images/cameras/${encodeURIComponent(this.name)}.jpg;

}

}

}

并非所有字符都可以在URL中使用,因此encodeURIComponent会为我们转换这些字符。

因为我们可以使用与常规props相同的方式来访问此计算 props,所以我们根本不需要更改模板,并且模板可以像以前一样保持不变:

{{ name }}

{{ rating }}

您可以在以下位置使用组件的props:

watch 中

生命周期 hook

method

computed 中

以及组件定义中的其他任何地方!

Vue中 props 这些知识点的更多相关文章

  1. vue中的一些知识点--多看文档

    重温vue,一些知识点简单记录. 1.我们都知道当数据变化时,视图会重新渲染.注意:只有当vue实例被创建时,data中存在的属性才是响应式的.后续新添加的属性不会触发视图变化. 使用 Object. ...

  2. 关于Vue中props的详解

    看一下官方文档: 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据.父组件的数据需要通过 prop 才能下发到子组件中. 也就是props是子组件访问父组件数 ...

  3. MVC,MVVM,MVP的区别/ Vue中忽略的知识点!

    按照顺序学习: https://scotch.io/courses/build-an-online-shop-with-vue/hello-world Vue Authentication And R ...

  4. vue中 props 多层组件嵌套传值

    如:三层嵌套. 父组件=>子组件=>孙子 1. 父组件引用子组件component11 , isShow传值给子组件component11 2. 子组件用  props 接受父组件的值, ...

  5. vue 中的小知识点

    1)使用is解决小bug <!DOCTYPE html><html lang="en"> <head> <meta charset=&qu ...

  6. [转]Vue中用props给data赋初始值遇到的问题解决

    原文地址:https://segmentfault.com/a/1190000017149162 2018-11-28更:文章发布后因为存在理解错误,经@Kim09AI同学提醒后做了调整,在此深表感谢 ...

  7. Vue中用props给data赋初始值遇到的问题解决

    Vue中用props给data赋初始值遇到的问题解决 更新时间:2018年11月27日 10:09:14   作者:yuyongyu    我要评论   这篇文章主要介绍了Vue中用props给dat ...

  8. vue中父组件使用props或者$attras向子组件中传值

    知识点:vue中使用props或者$attras向子组件中传值 (1) props传值 子组件必须注册好要传的数据() props:['id'] (2)$attrs传值 该数据在props中,没有注册 ...

  9. vue中直接修改props中的值并未给出警告,为啥?

    问:vue中直接修改props中的值并未给出警告,为啥? 答:如果props传入的值是引用类型,在子组件中改变其元素,不改变引用,那么不报错: 如果是基本类型,那么在修改时浏览器控制台会有报错信息. ...

随机推荐

  1. .clearfix 清除浮动,@import

    我们知道,在网页的DIV+CSS布局中,很多时候要用到浮动. 既然有浮动,那就有清除浮动. 清除浮动有很多种方式,而在实际项目中,比较常用的是这一种. .clearfix:after { conten ...

  2. 2.UDP协议

    UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能. 应用层给UDP多长的报文,UDP就照样发送,即一次发送一个完整报文 一.UDP首部格式 这里的长度是指(首部+数据) UDP校验 ...

  3. 如何证明sleep不释放锁,而wait释放锁?

    wait 加锁示例 public class WaitDemo { private static Object locker = new Object(); public static void ma ...

  4. [并发编程] -- ThreadPoolExecutor篇

    Executor框架 Executor框架的两级调度模型(基于HotSpot) 在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定 ...

  5. 回文树(回文自动机)(PAM)

    第一个能看懂的论文:国家集训队2017论文集 这是我第一个自己理解的自动机(AC自动机不懂KMP硬背,SAM看不懂一堆引理定理硬背) 参考文献:2017国家集训队论文集 回文树及其应用 翁文涛 参考博 ...

  6. 数据库(十三):MySQL内置方法

    进击のpython ***** 数据库--MySQL内置方法 目录 数据库--MySQL内置方法 视图 增加 修改 删除 触发器 创建 使用 删除 存储过程 无参 有参 事务 代码实现 视图 视图是一 ...

  7. PHP入门之类型与运算符(一)

    前言 PHP对于大部分人来说,是比较容易入门的.笔者也是刚学习不久,所以就把自己学习的基础知识进行总结和整理.第一部分是类型与运算符.如果你想学习PHP,可以参考PHP学习手册学习,任何一本教学资料也 ...

  8. parted分区

    ((parted)mklabel ----创建磁盘标签New disk labeltype? gpt ---输入磁盘表情名(parted) p ----再次列出磁盘分区 (parted) mkpart ...

  9. animation动画汇总(一阶段项目)

    animation 属性 动画属性: 1.animation-name:规定需要绑定到选择器的 keyframe 名称. 2.animation-duration:规定完成动画所花费的时间,以秒或毫秒 ...

  10. 两数相加(B站看视频总结)

    ''' 两数相加: 给出两个 非空 的链表用来表示两个非负的整数 各自的位数是按照逆序的方式存储的 每一个节点只能保存 一位数 示例: 输入:(2->4->3) + (5->6-&g ...