Vue2:通过props给组件传数据

一、业务场景

我们在使用Vue组件时,常常会复用Vue组件,那么,问题来了,复用的时候,业务数据不相同,怎么办了?
这里我们就需要学习新的属性:props来实现这个功能。
这样,组件就类似于一个函数一样,可以接收参数值了。

二、props给组件传数据

1、给组件传入参数值

<!--        这里用v-bind简写,实现传递数值功能。因为vue指令,接收的是js表达式-->
        <Student  name="李四" sex="" :age="18"/>

2、组件接收参数值

方式一:

        //简单声明接收
        props:['name','age','sex']

方式二:

        //接收的同时对数据进行类型限制
         props:{
            name:String,
            age:Number,
            sex:String
        }

方式三:

        //接收的同时对数据:进行类型限制+默认值的指定+必要性的限制
        props:{
            name:{
                type:String, //name的类型是字符串
                required:true, //name是必传非空的
            },
            age:{
                type:Number,
                default:99 //默认值
            },
            sex:{
                type:String,
                required:true
            }
        }

三、修改props接收的数据

在这里插入图片描述
如上图所示,props接收到的数据,不在_data中,所以,无法直接修改。
简写代码:

<h2>学生年龄:{{myAge}}</h2>
<script>
        data() {
            console.log(this);
            return {
                msg:'我是Vue的学生',
                myAge:this.age
            }
        }
        
        methods: {
            updateAge(){
                this.myAge++
            }
        }
</script>

四、总结

  1. 功能:让组件接收外部传过来的数据
  2. 传递数据:<Demo name="xxx"/>
  3. 接收数据:
    1. 第一种方式(只接收):props:['name']
    2. 第二种方式(限制类型):props:{name:String}
    3. 第三种方式(限制类型、限制必要性、指定默认值):
        props:{
        	name:{
        	type:String, //类型
        	required:true, //必要性
        	default:'老王' //默认值
        	}
        }

备注:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。
此处,虽然说不允许修改props接收到的数据,这是,特指非对象型数据
如下为对象型数据:
在这里插入图片描述
此时,如果通过v-model修改obj.a,是没有问题的。因为,对于Vue来说,obj对象保存的内存地址没有发生变化,所以,Vue监测不到数据的变化,但是。对应第三行的修改是可以监测到的。虽然,这样节省了代码,但是不建议这么写,因为,如果有一天数据结构发生变化,那整体代码都报错了。所以,还是遵守Vue官方建议的开发规范较好。

props不仅可以接收数据,还可以接收函数

如果data块中的属性名和props中的属性名重名,则以props中收到的值为准,因为props的加载优先级高于data块

五、完整代码

<template>
    <div>
        <h1>{{msg}}</h1>
        <h2>学生姓名:{{name}}</h2>
        <h2>学生性别:{{sex}}</h2>
        <h2>学生年龄:{{myAge}}</h2>
        <button @click="updateAge">尝试修改收到的年龄</button>
    </div>
</template>

<script>
    export default {
        name: "Student",
        data() {
            console.log(this);
            return {
                msg:'我是Vue的学生',
                myAge:this.age
            }
        },
        //简单声明接收
        // props:['name','age','sex']

        //接收的同时对数据进行类型限制
/*         props:{
            name:String,
            age:Number,
            sex:String
        }*/

        //接收的同时对数据:进行类型限制+默认值的指定+必要性的限制
        props:{
            name:{
                type:String, //name的类型是字符串
                required:true, //name是必传非空的
            },
            age:{
                type:Number,
                default:99 //默认值
            },
            sex:{
                type:String,
                required:true
            }
        },
        methods: {
            updateAge(){
                this.myAge++
            }
        }
    }
</script>

<style scoped>
    .school{
        background-color: gray;
    }
</style>
  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值