位置: IT常识 - 正文

Vue2-父子组件传值(vue父子组件如何传递数据)

编辑:rootadmin
Vue2-父子组件传值

推荐整理分享Vue2-父子组件传值(vue父子组件如何传递数据),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue父子组件间的参数传递是如何做到的,vue父子组件间的参数传递是如何做到的,vue父子组件传值props,vue2父子组件传参,vue父子组件传方法,vue2父子组件传参,vue2父子组件传参怎么双向绑定,vue2父子组件传值,内容如对您有帮助,希望把文章链接给更多的朋友!

在日常开发中,我们经常会在一个组件中嵌套另外一个组件,那么如果我们父组件要向子组件传值该怎么办?子组件向父组件通信又该怎么办?本文将详细举例说明这些问题。

父向子通信问题描述

现在我们有个需求,我们要分别显示父和子的信息,我们当然可以在一个组件中直接显示全部信息,但是万一以后又来一个需求:我们要在母和子的信息,那其实这里就存在冗余了,所以我们把子组件单独封装成一个新的组件。那么这里就会出现一个问题,子组件的信息该如何从父组件传过去呢?

解决方案

使用vue提供的prop属性,下面边看代码边分析: 父组件定义

<template> <div class="father"> 这里是父组件,我们会在这里展示父的信息 {{ fatherName }} {{ fatherAge }} <son/> </div></template><script> import son from "@/components/son"; export default { name: "father", components: { son }, data() { return { fatherName: "张三", fatherAge: 12 } } }</script><style lang="css"> .father{ border: 1px solid black; }</style>

子组件定义

<template> <div class="son"> 这里是子组件,我们会在这里展示子的信息 </div></template><script> export default { name: "son" }</script><style scoped> .son{ margin: 10px; border: 1px solid red; }</style>

使用:attribute属性向子组件传入值

<template> <div class="father"> 这里是父组件,我们会在这里展示父的信息 {{ fatherName }} {{ fatherAge }} <son :sonInfo="sonInfo"/> </div></template><script>import son from "@/components/son";export default { name: "father", components: { son }, data() { return { fatherName: "张三", fatherAge: 12, sonInfo: { sonName: "王小虎", sonAge: 6 } } }}</script><style lang="css">.father { border: 1px solid black;}</style>

子组件通过props属性接收父组件传过来的值,这里的名字要和父组件传的值对应

<template> <div class="son"> 这里是子组件,我们会在这里展示子的信息 {{ sonInfo.sonName }} {{ sonInfo.sonAge }} </div></template><script>export default { name: "son", props: ["sonInfo"]}</script><style scoped>.son { margin: 10px; border: 1px solid red;}</style>

测试

扩展

上述的例子解决了父子组件传值的基本问题,当然prop的用法还有很多,我们可以在vue2官网上看到

Prop的大小写

camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名

Vue.component('blog-post', { // 在 JavaScript 中是 camelCase 的 props: ['postTitle'], template: '<h3>{{ postTitle }}</h3>'})<!-- 在 HTML 中是 kebab-case 的 --><blog-post post-title="hello!"></blog-post>Prop 类型

我们之前使用以字符串数组形式列出的 prop

props: ["sonInfo"]

我们也可以给每一个prop指定对应的值

props: { title: String,//字符串 likes: Number,//数字 isPublished: Boolean,//布尔 commentIds: Array,//数组 author: Object,//对象 callback: Function,//函数 contactsPromise: Promise //异步延迟对象}传递静态或动态 Prop

之前我们传递的是动态的Prop,可以动态赋值

<son :sonInfo="sonInfo"/>

我们也可以传递静态的

<son :sonInfo="sonInfo" sex="1"/> props: ["sonInfo", "sex"]单向数据流Vue2-父子组件传值(vue父子组件如何传递数据)

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。 额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

官方这段话表明了,我们对于父组件传过来的值最不要直接修改,官方例举了两个常用的变更案例 1.这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用

props: ['initialCounter'],data: function () { return { counter: this.initialCounter }}

2.这个 prop 以一种原始的值传入且需要进行转换

props: ['size'],computed: { normalizedSize: function () { return this.size.trim().toLowerCase() }}类型校验

之前我们使用字符串数组形式列出的 prop,父组件不知道子组件prop值的类型,可能传值的时候传错,所以我们可以给值指定类型。如果有一个需求没有被满足,则 Vue 会在浏览器控制台中警告你

Vue.component('my-component', { props: { // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证) propA: Number, // 多个可能的类型 propB: [String, Number], // 必填的字符串 propC: { type: String, required: true }, // 带有默认值的数字 propD: { type: Number, default: 100 }, // 带有默认值的对象 propE: { type: Object, // 对象或数组默认值必须从一个工厂函数获取 default: function () { return { message: 'hello' } } }, // 自定义验证函数 propF: { validator: function (value) { // 这个值必须匹配下列字符串中的一个 return ['success', 'warning', 'danger'].includes(value) } } }})

当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告

子向父通信问题描述

既然父可以向子传值,那么子是否可以通信父呢?当然可以,这时候我们要借助vue的emit和emit和emit和on,下面我们看代码:

解决方案

子组件

<template> <div class="son"> 这里是子组件 <button @click="emit">使用emit向父组件通信</button> </div></template><script>export default { name: "son", methods:{ emit(){ this.$emit('sayHi',"tom") } }}</script><style scoped>.son { margin: 10px; border: 1px solid red;}</style>

父组件

<template> <div class="father"> 这里是父组件 <son sex="1" @sayHi="sayHi"/> </div></template><script>import son from "@/components/son";export default { name: "father", components: { son }, data() { return {} }, methods: { sayHi(name) { console.log("sayHi:"+name) } }}</script><style lang="css">.father { border: 1px solid black;}</style>

测试 点击按钮,控制台输出sayHi tom

分析

这里首先介绍一下vue提供的两个重要函数emit和on

on

监听当前实例上的自定义事件。事件可以由 $emit 触发。回调函数会接收所有传入事件触发函数的额外参数。 上述例子的 @sayHi="sayHi"就是在监听sayHi事件,这里采用了简写形式,完整形式是v-on:sayHi=“sayHi”,我们平时用的比较多的就是监听点击事件,而这里我们就是监听了我们自定义的事件

emit

触发当前实例上的事件。附加参数都会传给监听器回调。 当我们监听了自定义事件,我们就可以在子组件中触发事件,this.$emit(‘sayHi’,“tom”),这样就会调用监听的回调函数,并且将附加参数tom传入回调函数

非父子通信

除了上述的父子组件通信,我们最后还可以在非父子组件之间传值,某些场景下会用到。下面看代码: 事件总线

import Vue from "vue";export default new Vue;

组件B

<template> <div> 组件B {{ value }} </div></template><script>import bus from "@/components/bus";export default { name: "ComponentB", data() { return { value: "oldVal" } }, created() { bus.$on("changeVal", newVal => { this.value = "newVal" }) }}</script><style scoped></style>

组件A

<template> <div> 组件A <button @click="communicate">组件A->组件B</button> </div></template><script>import bus from "@/components/bus";export default { name: "ComponentA", methods:{ communicate(){ bus.$emit("changeVal","newVal") } }}</script><style scoped></style>

测试 组件B的值由oldVal->newVal

分析

这里引入了事件总线(event bus)的概念,事件总线:事件发送者将事件消息发送到一个事件总线上,事件订阅者向事件总线订阅和接收事件,然后再处理接收到的事件 而我们这里的事件总线的载体就是一个Vue的实例对象,因为在emit和on都是Vue的一个实例方法。 当然我们还可以使用$attrs / listeners来实现类似效果,这里就不多做介绍了,有兴趣的读者可以自行了解 但是如果学过Vuex的话,利用Vuex来传值会很方便,Vuex之后会慢慢讲,不急。学习是个漫长的过程,慢慢来

由于作者能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!

本文链接地址:https://www.jiuchutong.com/zhishi/300798.html 转载请保留说明!

上一篇:JavaScript基础知识总结 14:学习JavaScript中的File API、Streams API、Web Cryptography API(javascript基础书)

下一篇:微前端(无界)(什么是微前端)

  • ipadmini打电话可以吗(ipadmini打电话)(ipad mini2打电话)

    ipadmini打电话可以吗(ipadmini打电话)(ipad mini2打电话)

  • 手机上怎么查九价疫苗接种记录(手机怎么查九价疫苗记录)

    手机上怎么查九价疫苗接种记录(手机怎么查九价疫苗记录)

  • 苹果手机快手极速版签到入口在哪里(苹果手机快手极速版红包挂件隐藏了在哪开)

    苹果手机快手极速版签到入口在哪里(苹果手机快手极速版红包挂件隐藏了在哪开)

  • 怎么用卡2发短信(用卡二发信息怎么发)

    怎么用卡2发短信(用卡二发信息怎么发)

  • 微信怎么查看历史头像(微信怎么查看历史状态)

    微信怎么查看历史头像(微信怎么查看历史状态)

  • 斐讯健康app为什么总是连接不上网络(斐讯健康app为什么下载不了)

    斐讯健康app为什么总是连接不上网络(斐讯健康app为什么下载不了)

  • 微信公众号不认证有什么影响(微信公众号不认证可以发文章吗)

    微信公众号不认证有什么影响(微信公众号不认证可以发文章吗)

  • 荣耀x10支持内存卡吗(荣耀x10支持内存扩展吗)

    荣耀x10支持内存卡吗(荣耀x10支持内存扩展吗)

  • 小米10跟小米10青春版有什么区别(小米10跟小米10青春版手机壳通用吗)

    小米10跟小米10青春版有什么区别(小米10跟小米10青春版手机壳通用吗)

  • 物联网卡怎么用(物联网卡怎么用在诈骗)

    物联网卡怎么用(物联网卡怎么用在诈骗)

  • 电脑三原色英文叫什么(电脑三原色英文怎么表示)

    电脑三原色英文叫什么(电脑三原色英文怎么表示)

  • 手机打过去说号码有误(为什么打对方手机号响一下说是空号)

    手机打过去说号码有误(为什么打对方手机号响一下说是空号)

  • 由于视频格式版权限制无法播放(由于视频格式版权限制,该视频无法播放)

    由于视频格式版权限制无法播放(由于视频格式版权限制,该视频无法播放)

  • vivo的语音助手叫什么(怎么打开vivo的语音助手)

    vivo的语音助手叫什么(怎么打开vivo的语音助手)

  • 抖音限流是什么意思(抖音限流是什么原因造成的)

    抖音限流是什么意思(抖音限流是什么原因造成的)

  • 华为云空间怎么清理(华为云空间怎么导出到新手机)

    华为云空间怎么清理(华为云空间怎么导出到新手机)

  • 抖音怎么关闭自动保存视频(抖音怎么关闭自动点亮灯牌)

    抖音怎么关闭自动保存视频(抖音怎么关闭自动点亮灯牌)

  • 手机为什么不能上网(手机为什么不能投屏到电视机上)

    手机为什么不能上网(手机为什么不能投屏到电视机上)

  • 华为手机锁定后怎么解锁(华为手机锁定后会如何)

    华为手机锁定后怎么解锁(华为手机锁定后会如何)

  • vivox9nfc功能在哪(vivo x9nfc)

    vivox9nfc功能在哪(vivo x9nfc)

  • 快手复制链接去哪里找(快手复制链接去哪里找到)

    快手复制链接去哪里找(快手复制链接去哪里找到)

  • 地图位置定位怎么设置自己的店名(地图位置定位怎么把原来的改掉)

    地图位置定位怎么设置自己的店名(地图位置定位怎么把原来的改掉)

  • 栈和队列在现实生活的应用(栈和队列使用场景)

    栈和队列在现实生活的应用(栈和队列使用场景)

  • 苹果8plus3d touch怎么用(苹果8plus3d touch没有震动感 怎么解决)

    苹果8plus3d touch怎么用(苹果8plus3d touch没有震动感 怎么解决)

  • qq视频镜像怎么设置(qq视频镜像怎么办)

    qq视频镜像怎么设置(qq视频镜像怎么办)

  • 荣耀手环4怎么接电话(荣耀手环4怎么换壁纸)

    荣耀手环4怎么接电话(荣耀手环4怎么换壁纸)

  • iqoo中文怎么读(iqooz1中文怎么读)

    iqoo中文怎么读(iqooz1中文怎么读)

  • 外省人员收入怎么查
  • 房地产销售土地属于什么收入
  • 计提税金是什么会计科目
  • 各行业的税负率表2022
  • 专项扣除子女教育大学生可以吗
  • 自然人独资公司和个人独资企业区别
  • 不能收回的应收票据
  • 购买生产原料分录
  • 小企业会计准则调整以前年度费用分录
  • 废旧物资回收经营范围
  • 劳动保护费通过什么确认
  • 药店商品进销差价
  • 算材料成本的时候要算增值税吗?
  • 公司给客户退款会计分录
  • 母公司收购少数股东股权,之前的利润母公司不享有
  • 减少注册资本弥补亏损的依据
  • 医院其他应付款过高的原因
  • 打印机需要计提折旧吗
  • 公司在外地
  • 应征增值税不含税销售额是什么意思
  • 发票上电话可以写手机号吗
  • 公司买的固定资产还没使用
  • 坏账准备金最新计算公式
  • 生产活动产生的正的消费外部效应
  • 政策性减免单位社保
  • 广告业年终总结
  • 酒店没有营业执照开业犯法吗
  • 怎么更改定位位置信息
  • 耕地开垦费计入土地成本吗
  • 发生错误的原始凭证包括
  • 以银行存款交纳欠缴税金会计分录
  • 福利企业增值税即征即退会计处理
  • zendframework3中文手册
  • 企业一次性取得所得税
  • 会计怎么区别法定维修义务和合同义务
  • 小规模纳税人免税会计分录
  • 制造费用期末怎么结转
  • GPT-4 手画设计稿 直接生成前端页面
  • 申报完成后怎么处理
  • 培训费属于什么税收分类编码
  • python元组操作方法
  • 织梦dedecms如何升级ckeditor
  • day15-Servlet04
  • sql server ssrs
  • 建筑业 成本
  • 外部审计查什么
  • 银行日记账跨月登记方法
  • 零申报不报税有什么后果
  • 利息收入的会计分录
  • 同时知识产权专利,其做账是?
  • 出口未申报退税罚款多少
  • 固定资产清理账务处理流程
  • 定额发票收入怎么样确定
  • 企业存货借款利息怎么算
  • 合作社盈余返还总额是指哪些数据
  • 小规模纳税人怎么申报增值税报表
  • 加工企业三种商业模式
  • win8连接网络
  • Linux下查看某一个程序所使用的内存方法
  • linux文件目录的含义
  • win10系统中怎么打开IE浏览器
  • excel中利用条件格式展示数据
  • jquery邮箱正则表达式
  • 使用nodejs中httpProxy代理时候出现404异常的解决方法
  • OpenGL ES Emulator比较
  • opengl光线跟踪代码
  • 添加ie
  • python 处理mp3
  • js获取tbody下的tr
  • win7 python
  • javascript函数中的参数,也可以称之为下面哪项内容?
  • 安卓手机照片压缩
  • Unity3D游戏开发标准教程
  • android xmlns
  • 税务稽查时间最长多久?
  • 宁夏电子税务局登录入口
  • 小规模和一般纳税人的划分标准
  • 鉴证服务是指什么
  • 公司可以报停吗
  • 中国税务客服工作时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设