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

简介: 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

相关文章
|
JavaScript
Vue 的父组件和子组件生命周期钩子执行顺序
在 Vue 中,父组件和子组件的生命周期钩子执行顺序如下:
|
监控 JavaScript 开发者
在 Vue 中,子组件为何不可以修改父组件传递的 Prop,如果修改了,Vue 是如何监控到属性的修改并给出警告的
在 Vue 中,子组件不能直接修改父组件传递的 Prop,以确保数据流的单向性和可预测性。如果子组件尝试修改 Prop,Vue 会通过响应式系统检测到这一变化,并在控制台发出警告,提示开发者避免这种操作。
|
JavaScript
Vue 通过props实现父子组件通信
本文目录 1. 前言 2. 开发新闻列表父组件 3. 开发新闻内容子组件 4. 小结
227 0
|
7月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
637 2
|
6月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
544 137
|
10月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
1075 0
|
10月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
11月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
1476 78
|
12月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
9月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
653 1