1、props配置项
props的作用是让组件接收外部传过来的数据(接收参数)
2、组件传参
向组件Student传入参数:name,sex,age
<!-- 第一种方式:直接写参数名=xxx ,传入的是字符串形式-->
<Student name="李四" sex="女" age="18"/>
<!-- 第二种方式 动态绑定的方式传入v-bind:xxx,简写形式为:xxx。动态绑定的方式会将引号里的内容按表达式来解析后再传参-->
<Student :name="李四" :sex="女" :age="18"/>
3、组件接收参数
第一种方式(直接接收,常用)
<template>
<div>
<h1>{{msg}}</h1>
<h2>学生姓名:{{name}}</h2>
<h2>学生性别:{{sex}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
</template>
<script>
export default {
name:'Student',
data() {
console.log(this)
return {
msg:'我在上幼儿园大班',
}
},//简单声明接收,接收的是字符串,比如age传入的是数字,接收后的也是字符串,要计算需要进行转换
props:['name','age','sex']
}
</script>
第二种方式(限制参数类型)
<template>
<div>
<h1>{{msg}}</h1>
<h2>学生姓名:{{name}}</h2>
<h2>学生性别:{{sex}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
</template>
<script>
export default {
name:'Student',
data() {return {
msg:'我在上幼儿园大班'
}
},
//接收的同时对数据进行类型限制。注意,虽然有限制,但是传参后页面依然会显示,只是控制台会报错
props:{
name:String,
age:Number,
sex:String
}
}
</script>
第三种方式(限制类型、限制必要性、指定默认值)
<template>
<div>
<h1>{{msg}}</h1>
<h2>学生姓名:{{name}}</h2>
<h2>学生性别:{{sex}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
</template>
<script>
export default {
name:'Student',
data() {return {
msg:'我在上幼儿园大班'
}
},
//接收的同时对数据:进行类型限制+默认值的指定+必要性的限制
props:{
name:{
type:String, //name的类型是字符串
required:true, //name是必要的
},
age:{
type:Number,
default:99 //设置默认值
},
sex:{
type:String,
required:true
}
}
}
</script>
4、props注意点
- props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。
- props和data中声明的属性名不能重复
- props声明的属性名不能为一些关键字,如key,ref
<template>
<div>
<h1>{{msg}}</h1>
<h2>学生姓名:{{name}}</h2>
<h2>学生性别:{{sex}}</h2>
<h2>学生年龄:{{myAge+1}}</h2>
<button @click="updateAge">尝试修改收到的年龄</button>
</div>
</template>
<script>
export default {
name:'Student',
data() {return {
msg:'我在上幼儿园大班',
myAge:this.age //将props属性复制到data中进行修改操作。props上的属性会优先被放到vc上,所以这里是可以直接读的
}
},
methods: {
updateAge(){
this.myAge++
}
},
//简单声明接收
props:['name','age','sex']
}
</script>
5、props接收函数,
props可以接收使用者传递的函数,并调用,同时可以回传参数给使用者。即由子向父传递参数
<!-- 父组件App.vue -->
<template>
<div>
<!-- 给子组件传递了一个方法 -->
<School :parentAdd="parentAdd"></School>
</div>
</template>
<script>
import School from './components/School'
export default {
name:'App',
components:{School},
methods: {
parentAdd(options){
console.info(options)
}
},
}
</script>
<!-- 子组件School.vue -->
<template>
<div class="school">
<button @click="sumAdd">调用父组件方法</button>
</div>
</template>
<script>
export default {
name:'School',
//props接收传递的函数
props:["parentAdd"],
methods:{
sumAdd(){
//调用接收的函数,并传递参数。因为props接收后在vc上,所以可以直接通过this使用
this.parentAdd("invoked by sun111")
}
}
}
</script>