Vue 父组件向子组件传参 props 属性

props 用于接收父组件传过来的数据,父传子。

props 是只读的,如果修改 props 中的数据,Vue 会发出警告。如果需要修改,可以将 props 中的数据复制到 data 中,然后修改 data 中的数据。

 引出 props 的作用:

首先需要在 components 文件夹内创建一个子组件。例:Shop.vue 组件。

<template>
    <div>
        <h2>商品名称:{{ name }}</h2>
        <strong>商品价格:¥{{ price }}</strong>
        <p>商品数量:{{ num }}</p>
        <hr />
    </div>
</template>

<script>
export default {
    name: "Shop",
    data() {
        return {
            name: "草莓",
            price: 999,
            num: 100
        }
    }
}
</script>

然后在 Home.vue 页面引入 Shop.vue 组件 并多次使用创建商品。

<template>
    <div>
        <h2>商品列表</h2>
        <hr />
        <Shop></Shop>
        <Shop></Shop>
        <Shop></Shop>
    </div>
</template>

<script>
import Shop from "../components/Shop";
export default {
    name: 'Home',
    components: { Shop }
}
</script>

:所有商品的内容都是一样的 很明显不符合实际场景 如果想要动态指定每个组件的内容 需要使用 props 配置项了。

 

 props 数组写法【无限制】:

Shop.vue 组件内定义 props 并以数组的形式接收参数  然后在页面使用即可。

<template>
    <div>
        <h2>商品名称:{{ name }}</h2>
        <strong>商品价格:¥{{ price }}</strong>
        <p>商品数量:{{ num }}</p>
        <hr />
    </div>
</template>

<script>
export default {
    name: "Shop",
    props: ['name', 'price', 'num'],
}
</script>

Home.vue 页面使用组件时 直接在标签中传递参数即可。

<template>
    <div>
        <h2>商品列表</h2>
        <hr />
        <Shop name="草莓" price="99" num="50"></Shop>
        <Shop name="苹果" price="30" num="30"></Shop>
        <Shop name="葡萄" price="56" num="20"></Shop>
    </div>
</template>

<script>
import Shop from "../components/Shop";
export default {
    name: 'Home',
    components: { Shop }
}
</script>

:在组件标签中 不允许使用 key、ref 等 Vue 已经使用的关键字作为参数名。

 也可以配合 v-for 指令动态传递参数 效果一致。

<template>
    <div>
        <h2>商品列表</h2>
        <hr />
        <Shop v-for="item in lists" :key="item.id" :name="item.name" :price="item.price" :num="item.num"></Shop>
    </div>
</template>

<script>
import Shop from "../components/Shop";
export default {
    name: 'Home',
    components: { Shop },
    data() {
        return {
            lists: [
                {
                    id: 1,
                    name: "草莓",
                    price: 99,
                    num: 50
                }, {
                    id: 2,
                    name: "苹果",
                    price: 30,
                    num: 30
                }, {
                    id: 3,
                    name: "葡萄",
                    price: 56,
                    num: 20
                }
            ]
        }
    }
}
</script>

:如果不需要对数据进行任何限制 推荐使用数组写法。

对象写法【限制数据类型】:

将 Shop.vue 组件中的 props 配置项换成对象的写法 并设置数据类型。

<template>
    <div>
        <h2>商品名称:{{ name }}</h2>
        <strong>商品价格:¥{{ price }}</strong>
        <p>商品数量:{{ num }}</p>
        <hr />
    </div>
</template>

<script>
export default {
    name: "Shop",
    props: {
        name: String,
        price: Number,
        num: Number
    }
}
</script>

然后在 Home.vue 页面正常引入 在组件标签上定义内容即可。

<template>
    <div>
        <h2>商品列表</h2>
        <hr />
        <Shop name="草莓" price="99" num="50"></Shop>
        <Shop name="苹果" price="30" num="30"></Shop>
        <Shop name="葡萄" price="56" num="20"></Shop>
    </div>
</template>

<script>
import Shop from "../components/Shop";
export default {
    name: 'Home',
    components: { Shop }
}
</script>

:数据虽然可以正常显示 但是控制台出现了报错 这是因为 props 定义的 price 和 num 的类型为数字,而接收到的却是字符串。

 在组件标签上 直接写的数据都是字符串类型 可以用 v-bind 动态指定数据解决这个问题。

<template>
    <div>
        <h2>商品列表</h2>
        <hr />
        <Shop name="草莓" :price="99" :num="50"></Shop>
        <Shop name="苹果" :price="30" :num="30"></Shop>
        <Shop name="葡萄" :price="56" :num="20"></Shop>
    </div>
</template>

<script>
import Shop from "../components/Shop";
export default {
    name: 'Home',
    components: { Shop }
}
</script>

:这是因为 Vue 会将 v-bind 绑定的内容当做 JS 表达式去解析 而不是普通的字符串。

完整写法【限制数据类型、默认值、是否必填】:

将 Shop.vue 组件中的 props 配置项换成完整写法,并限制数据类型、将 name、price 设置为必填、给 num 设置默认值。

<template>
    <div>
        <h2>商品名称:{{ name }}</h2>
        <strong>商品价格:¥{{ price }}</strong>
        <p>商品数量:{{ num }}</p>
        <hr />
    </div>
</template>

<script>
export default {
    name: "Shop",
    props: {
        name: {
            type: String,
            required: true
        },
        price: {
            type: Number,
            required: true
        },
        num: {
            type: Number,
            default: 0
        }
    }
}
</script>

然后在 Home.vue 页面正常引入 不过在传参时 我们少传几个参数演示一下。

<template>
    <div>
        <h2>商品列表</h2>
        <hr />
        <Shop name="草莓" :price="99" :num="50"></Shop>
        <Shop name="苹果" :price="30"></Shop>
        <Shop name="葡萄"></Shop>
    </div>
</template>

<script>
import Shop from "../components/Shop";
export default {
    name: 'Home',
    components: { Shop }
}
</script>

:如果在 props 中定义了默认值 不传参会显示这个默认值 如果在 props 中定义了必填 不传参就会报错并且页面无内容。

 

备注:默认值和必填选项不能一起使用 完整写法一般很少使用 用的最多的还是第一种哟。

原创作者:吴小糖

创作时间:2023.3.28

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue中,组件向子组件传递参数有多种方式,以下是其中两种常用的方式: 1. Props 属性传递:组件通过在子组件的标签上绑定属性的方式传递数据。在子组件中,通过 props 选项接收组件传递的属性值。 组件示例: ```vue <template> <div> <child-component :message="message"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { data() { return { message: 'Hello from parent component' }; }, components: { ChildComponent } }; </script> ``` 子组件示例(ChildComponent.vue): ```vue <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] }; </script> ``` 2. 使用 $emit 事件进行通信:组件可以通过触发子组件的自定义事件,传递需要的参数。子组件可以通过 $emit 方法触发该事件,并将参数传递给组件组件示例: ```vue <template> <div> <child-component @custom-event="handleEvent"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { methods: { handleEvent(data) { console.log('Received data:', data); } }, components: { ChildComponent } }; </script> ``` 子组件示例(ChildComponent.vue): ```vue <template> <div> <button @click="triggerEvent">Send Event</button> </div> </template> <script> export default { methods: { triggerEvent() { this.$emit('custom-event', 'Data from child component'); } } }; </script> ``` 这两种方式都可以实现组件向子组件传递参数,具体选择哪种方式取决于你的需求和场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴吴吴呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值