## [单向数据流](https://cn.vuejs.org/v2/guide/components-props.html#单向数据流 "单向数据流")
所有的 prop 都使得其父子 prop 之间形成了一个**单向下行绑定**:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你**不**应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。
这里有两种常见的试图改变一个 prop 的情形:
1. **这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。**在这种情况下,最好定义一个本地的 data 属性并将这个 prop 用作其初始值:
~~~
props: ['initialCounter'],
data: function () {
return {
counter: this.initialCounter
}
}
~~~
2. **这个 prop 以一种原始的值传入且需要进行转换。**在这种情况下,最好使用这个 prop 的值来定义一个计算属性:
~~~
props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}
~~~
注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变这个对象或数组本身**将会**影响到父组件的状态。
## [Prop 验证](https://cn.vuejs.org/v2/guide/components-props.html#Prop-验证 "Prop 验证")
我们可以为组件的 prop 指定验证要求,例如你知道的这些类型。如果有一个需求没有被满足,则 Vue 会在浏览器控制台中警告你。这在开发一个会被别人用到的组件时尤其有帮助。
为了定制 prop 的验证方式,你可以为 `props` 中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:
~~~
Vue.component('my-component', {
props: {
// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
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 ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
})
~~~
当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。
注意那些 prop 会在一个组件实例创建**之前**进行验证,所以实例的属性 (如 `data`、`computed` 等) 在 `default` 或 `validator` 函数中是不可用的。
### [类型检查](https://cn.vuejs.org/v2/guide/components-props.html#类型检查 "类型检查")
`type` 可以是下列原生构造函数中的一个:
* `String`
* `Number`
* `Boolean`
* `Array`
* `Object`
* `Date`
* `Function`
* `Symbol`
额外的,`type` 还可以是一个自定义的构造函数,并且通过 `instanceof` 来进行检查确认。例如,给定下列现成的构造函数:
~~~
function Person (firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
~~~
你可以使用:
~~~
Vue.component('blog-post', {
props: {
author: Person
}
})
~~~
来验证 `author` prop 的值是否是通过 `new Person` 创建的。
- 我们在做什么?
- 为什么是内存?
- 我们实际上在做什么
- HTML基础
- Web原理和HTML简介
- Web原理
- HTML概念
- HTML标签
- 标签
- HTML固定基本结构
- 第一个HTML页面
- 工具的使用
- 标题
- <hr>和<p>标签
- 路径概念
- 超级链接
- 列表
- 表格
- 表单的设计与使用
- 表单域的原理
- 文本框和密码框
- 单选框和复选框
- 下拉列表框
- 多行文本和上传
- 提交按钮和重置按钮
- 为CODING COFFEE加入在线购买页
- HTML5
- 定位服务
- CSS
- CSS的基础使用
- CSS简介
- CSS样式规则和加载方式
- 选择器
- 伪类
- CSS优先级和层叠
- CSS颜色
- 背景图片
- 文本
- CSS列表
- DIV+CSS布局
- 内联元素和区块元素介绍
- Display属性
- 盒子模型的边距和边框
- 浮动和清除浮动
- 用Position属性进行定位
- 专题:居中和对齐
- flex布局
- CSS新特性
- CSS3边框
- 动画
- Javascript
- HelloWorld
- 语句与变量
- 一切皆对象
- 标识符、注释和区块
- 基本数据类型和引用数据类型
- 语句
- 条件语句
- 循环语句
- 标准库
- Array对象
- Number对象
- String对象
- JSON对象
- Math对象
- Date对象
- 数据类型
- typeof运算符
- number
- 字符串
- 布尔类型
- 函数
- 数组
- Dom模型
- Dom和Dom节点
- 特征相关属性
- 节点对象方法
- Element对象
- Attribute对象
- Text节点和CSS操作
- 事件模型
- WebStorage
- BOM模型
- window对象
- 计时事件
- jQuery基础
- 认识jQuery
- jQuery对象和DOM对象
- jQuery选择器
- jQuery Dom操作
- 查找节点和创建节点
- 插入节点和删除节点
- 复制节点和替换节点
- 包裹节点和属性操作
- 样式操作
- 设置和获取HTML、文本和值
- 遍历节点和CSS操作
- jQuery 事件和动画
- 事件绑定与冒泡处理
- jQuery动画
- jQuery 插件
- validate 插件
- jQuery与Ajax的应用
- Ajax简介
- jquery中的Ajax
- Vue.js基础与实战
- HelloWorld
- v-for、v-on、v-model
- 组件化编程
- 生命周期函数(钩子)
- 计算属性、侦听器、方法
- class与style绑定
- 关于组件的一些问题
- 单项数据流和Prop验证
- 项目环境搭建
- 关于git的一些情况
- JavaWeb教程
- 对象和类的概念
- 对象和类的介绍
- 对象和类的介绍2
- 类的继承与权限控制
- Object类
- 多态的内容
- 容器
- 流
- Servlet
- Servlet练习
- Session和Cookie
- JSP
- 内置对象
- JSTL和EL
- JDBC
- 文件上传和下载
- 过滤器
- 数据库
- 数据库介绍
- MySQL的安装
- SQL
- 表基本操作
- 修改数据语句
- 数据检索操作
- 多表数据操作
- 表结构设计
- 综合应用
- 作业与练习
- Maven教程
- Maven安装配置