通信:父传子
props基本用法
在组件中,使用选项props
来声明需要从父级接收到的数据
props的值有两种方式:一:字符串数组,数组中的字符串就是传递时的名称;二:对象,对象可以设置传递时的类型,也可以设置默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <div id="app"> <cpnn :cpnmovies="movies" :cpnmessage="message"></cpnn> </div> <template id="cpn"> <div id=""> <h2>{{cpnmovies}}</h2> <p>{{cpnmessage}}</p> </div> </template> <script src="js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> const cpnn = { template:'#cpn', props:['cpnmovies','cpnmessage'], } const app = new Vue({ el:'#app', data:{ message:'你好啊', movies:['海贼王','西游记','爱情公寓'] }, components:{ cpnn } }) </script>
|
PS:一开始使用模板的无法获取到message数据,不能展现在hmtl中,然后template
标签内添加一个容器div,现在可以完全获取数据展现hmtl
中
在组件需要被一个容器包裹,template解析的时候,发现有多个根元素,就无法判断。因此需要一个容器
props数据验证
对父组件传递的数据类型,进行锁定。有如下类型:String
、Number
、Boolean
、Array
、Object
、Data
、Function
、Sysmbol
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| const cpnn = { template:'#cpn', props:['cpnmovies','cpnmessage'], }
const cpnn1 = { template:'#cpn', props:{ cpnmovies:Array, cpnmessage:String } }
const cpnn2 = { template:'#cpn', props:{ cpnmessage:{ type:String, default:'hello world', required:true } } }
props:{ propE:{ type:Object, default: function () { return { message: 'hello' } } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| Vue.component('my-component', { props: { 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 } } } })
|
总结
props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。(props比data数据优先级更高,且不能在data重名)
一般完整属性的 required
和 default
不会同时使用
通信:子传父
父组件访问子组件的数据,通过$children
和 $ref
$children
了解$children
属性的根源,可以通过methods
,去console.log(this)
输出一下 this,可以得到如下
组件实例对象都有 $children
属性。如果你在该组件上注册了子组件,那么$children
属性就有子组件的 this
属性,可以获取到 data
数据。
$refs
$refs
跟$children
一样是Vue实例对象上的属性,默认是空对象。需要子组件去绑定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <div id="app"> <cpn ref="app1"></cpn> <button type="button" @click="printlog">输出打印结果</button> </div>
<script> new Vue({ components:{ cpn }, methods:{ printlog(){ console.log(this.$refs.app1) console.log(this.$refs.app1 === this.$children[0]) } } }).$mount('#app') </script>
|
ref绑定元素
ref
同样可以用来绑定容器下的元素,效果就是真实DOM
等同于 getElementById
获取
总结
通过 $children
、$refs
都能获取到子组件的this属性,前者是通过数组的形式,将注册的组件存放起来;后者是通过对象的形式,将绑定了ref="name"
值,存储。
如果你只需要个别组件的属性,可以通过绑定 ref
值去指定获取;如果需要对每一个子组件属性进行使用,可以通过遍历数据的方式遍历 $children
数组