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

相关文章
|
10天前
|
存储 数据采集 供应链
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
5月前
|
JavaScript
Vue 的父组件和子组件生命周期钩子执行顺序
在 Vue 中,父组件和子组件的生命周期钩子执行顺序如下:
|
5月前
|
监控 JavaScript 开发者
在 Vue 中,子组件为何不可以修改父组件传递的 Prop,如果修改了,Vue 是如何监控到属性的修改并给出警告的
在 Vue 中,子组件不能直接修改父组件传递的 Prop,以确保数据流的单向性和可预测性。如果子组件尝试修改 Prop,Vue 会通过响应式系统检测到这一变化,并在控制台发出警告,提示开发者避免这种操作。
|
5月前
|
缓存 JavaScript Serverless
vue中computed计算属性、watch侦听器、methods方法的区别以及用法
vue中computed计算属性、watch侦听器、methods方法的区别以及用法
291 0
|
3月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
177 1
|
20天前
|
JavaScript 前端开发 算法
vue渲染页面的原理
vue渲染页面的原理
96 56
|
10天前
|
数据采集 资源调度 JavaScript
极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图
本文介绍了使用 Vue Flow 绘制流程图的方法与技巧。Vue Flow 是一个灵活强大的工具,适合自定义复杂的流程图。文章从环境要求(Node.js v20+ 和 Vue 3.3+)、基础入门案例、自定义功能(节点与连线的定制、事件处理)到实际案例全面解析其用法。重点强调了 Vue Flow 的高度灵活性,虽然预定义内容较少,但提供了丰富的 API 支持深度定制。同时,文中还分享了关于句柄(handles)的使用方法,以及如何解决官网复杂案例无法运行的问题。最后通过对比 mermaid,总结 Vue Flow 更适合需要高度自定义和复杂需求的场景,并附带多个相关技术博客链接供进一步学习。
|
1月前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
1月前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
120 12