Vue中props的详解

看一下官方文档:

组件实例的作用域是孤立的。这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据。父组件的数据需要通过 prop 才能下发到子组件中。

也就是props是子组件访问父组件数据的唯一接口。

详细一点解释就是:

一个组件可以直接在模板里面渲染data里面的数据(双大括号)。

子组件不能直接在模板里面渲染父元素的数据。

如果子组件想要引用父元素的数据,那么就在prop里面声明一个变量(比如a),这个变量就可以引用父元素的数据。然后在模板里渲染这个变量(前面的a),这时候渲染出来的就是父元素里面的数据。

1. 基本用法

图1-props

var com1 = Vue.component('child',{

// 声明在prop中的变量可以引用父元素的数据

props:['hello'],

// 这里渲染props中声明的那个hello

template:'

{{ hello }}

',

})

var app1 = new Vue ({

el: '#app1',

data: {

greet: {

hello:'hello,',

world: 'world',

},

message: 'message1',

}

})

2. camelCase vs. kebab-case:js中用驼峰式命名,在html中替换成短横线分隔式命名

Vue.component('child', {

// 在 JavaScript 中使用 camelCase

props: ['myMessage'],

template: '{{ myMessage }}'

})

3.单向数据流: props是单向绑定的

当父组件的属性变化时,将传导给子组件,但是反过来不会。

每次父组件更新时,子组件的所有 prop 都会更新为最新值。

不要在子组件内部改变 prop。如果你这么做了,Vue 会在控制台给出警告。

在两种情况下,我们很容易忍不住想去修改 prop 中数据:

Prop 作为初始值传入后,子组件想把它当作局部数据来用;

Prop 作为原始数据传入,由子组件处理成其它数据输出。

对这两种情况,正确的应对方式是:

定义一个局部变量,并用 prop 的值初始化它:

props: ['initialCounter'],

data: function () {

return { counter: this.initialCounter }

}

定义一个计算属性,处理 prop 的值并返回:

props: ['size'],

computed: {

normalizedSize: function () {

return this.size.trim().toLowerCase()

}

}

注意在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。

举个例子:

//

var mycom = Vue.component('my-component', {

//添加一个input改变子组件的childOject,那么父元素的object也会被改变,但是Vue没有报错!

template: '

{{ object.name }} is {{ object.age }} years old.

',

props: ['object','school'],

data: function () {

// 子组件的childObject 和 父组件的object 指向同一个对象

return {

childObject: this.object

}

}

});

var app3 = new Vue({

el: '#app3',

data: {

object:{

name: 'Xueying',

age: '21',

},

school:'SCUT',

},

})

图2-改变childObject.name,object.name也改变

图3-控制台输出app3.object.name

4. props验证

可以为prop指定验证规则,如果传入的数据不符合要求,Vue会发出警告。

具体验证规则见官方文档:Prop验证规则

5. $parent

$parent 也可以用来访问父组件的数据。

而且子组件可以通过$parent 来直接修改父组件的数据,不会报错!

可以使用props的时候,尽量使用props显式地传递数据(可以很清楚很快速地看出子组件引用了父组件的哪些数据)。

另外在一方面,直接在子组件中修改父组件的数据是很糟糕的做法,props单向数据流就没有这种顾虑了。

以上所述是小编给大家介绍的Vue中props的详解详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

Vue组件选项props实例详解

前面的话

组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项。在 Vue 中,父子组件的关系可以总结为 props down, events up。父组件通过 props 向下传递数据给子组件,子组件通过 events 给父组件发送消息。本文将详细介绍Vue组件选项props

静态props

组件实例的作用域是孤立的。这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据。要让子组件使用父组件的数据,需要通过子组件的 props 选项

使用Prop传递数据包括静态和动态两种形式,下面先介绍静态props

子组件要显式地用 props 选项声明它期待获得的数据

var childNode = {

template: '

{{message}}

',

props:['message']

}

静态Prop通过为子组件在父组件中的占位符添加特性的方式来达到传值的目的

var childNode = {

template: '

{{message}}

',

props:['message']

}

var parentNode = {

template: `

components: {

'child': childNode

}

};

// 创建根实例

new Vue({

el: '#example',

components: {

'parent': parentNode

}

})

命名约定

对于props声明的属性来说,在父级HTML模板中,属性名需要使用中划线写法

var parentNode = {

template: `

components: {

'child': childNode

}

};

子级props属性声明时,使用小驼峰或者中划线写法都可以;而子级模板使用从父级传来的变量时,需要使用对应的小驼峰写法

var childNode = {

template: '

{{myMessage}}

',

props:['myMessage']

}

var childNode = {

template: '

{{myMessage}}

',

props:['my-message']

}

动态props

在模板中,要动态地绑定父组件的数据到子模板的 props,与绑定到任何普通的HTML特性相类似,就是用 v-bind。每当父组件的数据变化时,该变化也会传导给子组件

var childNode = {

template: '

{{myMessage}}

',

props:['myMessage']

}

var parentNode = {

template: `

components: {

'child': childNode

},

data(){

return {

'data1':'aaa',

'data2':'bbb'

}

}

};

传递数字

初学者常犯的一个错误是使用字面量语法传递数值

var childNode = {

template: '

{{myMessage}}的类型是{{type}}

',

props:['myMessage'],

computed:{

type(){

return typeof this.myMessage

}

}

}

var parentNode = {

template: `

components: {

'myChild': childNode

}

};

// 创建根实例

new Vue({

el: '#example',

components: {

'MyParent': parentNode

}

})

因为它是一个字面 prop,它的值是字符串 "1" 而不是 number。如果想传递一个实际的 number,需要使用 v-bind,从而让它的值被当作JS表达式计算

var parentNode = {

template: `

components: {

'myChild': childNode

}

};

或者可以使用动态props,在data属性中设置对应的数字1

var parentNode = {

template: `

components: {

'myChild': childNode

},

data(){

return {

'data': 1

}

}

};

props验证

可以为组件的 props 指定验证规格。如果传入的数据不符合规格,Vue会发出警告。当组件给其他人使用时,这很有用

要指定验证规格,需要用对象的形式,而不能用字符串数组

Vue.component('example', {

props: {

// 基础类型检测 (`null` 意思是任何类型都可以)

propA: Number,

// 多种类型

propB: [String, Number],

// 必传且是字符串

propC: {

type: String,

required: true

},

// 数字,有默认值

propD: {

type: Number,

default: 100

},

// 数组/对象的默认值应当由一个工厂函数返回

propE: {

type: Object,

default: function () {

return { message: 'hello' }

}

},

// 自定义验证函数

propF: {

validator: function (value) {

return value > 10

}

}

}

})

type 可以是下面原生构造器

String

Number

Boolean

Function

Object

Array

Symbol

type 也可以是一个自定义构造器函数,使用 instanceof 检测。

当 prop 验证失败,Vue 会在抛出警告 (如果使用的是开发版本)。props会在组件实例创建之前进行校验,所以在 default 或 validator 函数里,诸如 data、computed 或 methods 等实例属性还无法使用

下面是一个简单例子,如果传入子组件的message不是数字,则抛出警告

var childNode = {

template: '

{{message}}

',

props:{

'message':Number

}

}

var parentNode = {

template: `

components: {

'child': childNode

},

data(){

return{

msg: '123'

}

}

};

// 创建根实例

new Vue({

el: '#example',

components: {

'parent': parentNode

}

})

传入数字123时,则无警告提示。传入字符串'123'时,结果如下所示

将上面代码中,子组件的内容修改如下,可自定义验证函数,当函数返回为false时,则输出警告提示

var childNode = {

template: '

{{message}}

',

props:{

'message':{

validator: function (value) {

return value > 10

}

}

}

}

在父组件中传入msg值为1,由于小于10,则输出警告提示

var parentNode = {

template: `

components: {

'child': childNode

},

data(){

return{

msg:1

}

}

};

单向数据流

prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。这是为了防止子组件无意修改了父组件的状态——这会让应用的数据流难以理解

另外,每次父组件更新时,子组件的所有 prop 都会更新为最新值。这意味着不应该在子组件内部改变 prop。如果这么做了,Vue 会在控制台给出警告

下面是一个典型例子

var childNode = {

template: `

子组件数据

{{childMsg}}

`,

props:['childMsg']

}

var parentNode = {

template: `

父组件数据

{{msg}}

`,

components: {

'child': childNode

},

data(){

return {

'msg':'match'

}

}

};

// 创建根实例

new Vue({

el: '#example',

components: {

'parent': parentNode

}

})

父组件数据变化时,子组件数据会相应变化;而子组件数据变化时,父组件数据不变,并在控制台显示警告

修改prop中的数据,通常有以下两种原因

1、prop 作为初始值传入后,子组件想把它当作局部数据来用

2、prop 作为初始值传入,由子组件处理成其它数据输出

对于这两种情况,正确的应对方式是

1、定义一个局部变量,并用 prop 的值初始化它

props: ['initialCounter'],

data: function () {

return { counter: this.initialCounter }

}

2、定义一个计算属性,处理 prop 的值并返回

props: ['size'],

computed: {

normalizedSize: function () {

return this.size.trim().toLowerCase()

}

}

[注意]JS中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态

总结

以上所述是小编给大家介绍的Vue组件选项props实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

props写法_Vue中props的用法知识点相关推荐

  1. props写法_Vue中props的详解

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

  2. vue打印props的值_vue中props传值方法

    vue中props传值方法 1.开发环境 vue 2.电脑系统 windows10专业版 3.在使用 vue开发的过程中,我们经常会使用 props进行组件的传值,下面是我的分享,希望对你有所帮助! ...

  3. vue单文件props写法_vue开发中怎么按需加载需要被填入props和自定义事件的组件?...

    这种场景你可能需要把模态框包装成插件.vue插件开发和组件的区别 - 水秋玄​im.mkinit.com vue插件和组件的区别 使用插件的方式包装组件和直接注册全局组件其实是一样的,都是注册组件.不 ...

  4. props写法_vue props default Array或是Object的正确写法说明

    1.错误写法 demo:{ type:Array, default:[] } eslint语法报错: Invalid default value for prop "demo": ...

  5. vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js

    模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...

  6. vue 微信录音倒计时_vue中倒计时的用法

    后台传递过来创建时间,前端进行倒计时十分钟,十分钟之后更改订单状态 把待支付改为过期或者其他 来验证订单状态 {{text}} {{Countdown(record.countDown)}} //订单 ...

  7. vue中进度条写法_vue中自制进度条

    订单已提交,正在出票... :cell-style="{textAlign:'center'}" :data="tableData" border style= ...

  8. props写法_简单理解vue中Props属性

    本文实例为大家解析了vue中Props的属性,供大家参考,具体内容如下 使用 Props 传递数据 组件实例的作用域是孤立的.这意味着不能并且不应该在子组件的模板内直接引用父组件的数据.可以使用 pr ...

  9. vue中this.init用法_Vue中的this.$options.data()和this.$data用法说明

    问题 项目里遇到一个问题,用this.$options.data()重置组件data时,data()里用this获取的props或method都为undefined,代码简化如下: export de ...

最新文章

  1. 计算机集中器的原理图,集中器,集中器原理是什么?
  2. 分享Kali Linux 2016.2第45周镜像
  3. 【Java Web前端开发】web概念概述和HTML基础部分
  4. MySQL Connector/ODBC 5.2.2 发布
  5. 如何提高QnA maker机器人训练中文语义理解的能力
  6. Node Version Manager--NodeJS的多版本管理工具--轻松实现多个版本的NodeJS的管理开发
  7. C#LeetCode刷题-回溯算法
  8. python爬取+BI分析5000条内衣数据,发现妹子最爱这款文胸
  9. smtp 邮件发送 附带ssl版本
  10. C89 和 C99的标准比较
  11. 像在K8S集群中一样运行本地程序
  12. TP5:框架下载与安装——1
  13. e-r模型教案高中计算机,E-R模型实例答案.ppt
  14. Unity中文API参考手册
  15. Android 打造RxBus2.x的全面详解
  16. Python爬虫lxml解析实战
  17. 彪悍晨读 | 每天价值投资常识
  18. 赵丽颖冯绍峰官宣 | 微博服务器瘫痪!运维:该拿什么拯救我?
  19. 迅雷网页嗅探下载链接的实现
  20. 微信朋友圈新增仅最近一个月可见;OpenAI 发布音乐生成网络 MuseNet

热门文章

  1. stata 蒙特卡罗模拟(一) 一元线性回归模拟
  2. 用Python写《我的世界》
  3. JS中的反斜杠 (\)是什么意思
  4. MyEclipse 2014 破解 亲测有效
  5. Vivado使用Tcl命令下载FPGA
  6. python在excel中插入二维码
  7. 一元线性预测模型(机器学习篇)
  8. 用命令行在局域网内斗地主_上课划水上班摸鱼_chenjie的博客
  9. C/C++ typedef用法详解(有排版)
  10. 【新手必读】Unreal Engine 4 UI入门教程(下)