Vue组件通信——父子组件通信的四种方法

news2025/7/9 1:22:19

引入组件

  1. 全局引入

    在main.js文件中引入并注册

    import ChildrenDemo from '@/views/components/ChildrenDemo'
    Vue.component('ChildrenDemo',ChildrenDemo)// 第一个参数 全局组件的名字(字符串类型),第二个参数:引入的组件名(一般都与组件名保持一致)
    

    之后就可以全局使用组件了

  2. 局部引入

    在父组件中引入

    import ChildrenDemo from '@/views/components/ChildrenDemo'
    export default {
      components: {
        ChildrenDemo
      },
    }
    

    之后就可以在父组件中使用组件了

    <ChildrenDemo></ChildrenDemo>
    <!-- 或 -->
    <children-demo></children-demo>
    

一、props属性绑定(父组件向子组件传递数据)

在子组件 prop 中可以注册一些自定义组件属性,父组件调用子组件时可以向 prop 中的自定义属性传值。

子组件代码:

<template>
  <div class="ChildrenDemo">
    <h1>{{title}}</h1>
  </div>
</template>

<script>
export default {
  name: 'ChildrenDemo',
  props:['title'],
  components: {
  },
  data () {
    return {
    }
  }
}
</script>

父组件代码

<template>
  <div class="parent">
    <ChildrenDemo title="向子组件传递的title值"></ChildrenDemo>
  </div>
</template>

prop 也可以通过 v-bind 动态赋值

<ChildrenDemo :title="xxx"></ChildrenDemo>

如果要将一个对象的所有 property 都作为 prop 传入,你可以使用不带参数的 v-bind

例如,对于一个给定的对象 post

post: {
  id: 1,
  title: 'My Journey with Vue'
}

传给子组件

<blog-post v-bind="post"></blog-post>

等价于:

<blog-post
  v-bind:id="post.id"
  v-bind:title="post.title"
></blog-post>

props的更多写法

  1. 字符串数组形式

    props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
    
  2. 指定prop值类型

    props: {
      title: String,
      likes: Number,
      isPublished: Boolean,
      commentIds: Array,
      author: Object,
      callback: Function,
      contactsPromise: Promise // or any other constructor
    }
    
  3. 指定 prop 的验证要求

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

      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'].indexOf(value) !== -1
          }
        }
      },
    

    注意: prop 会在一个组件实例创建之前进行验证,所以实例的 property (如 datacomputed 等) 在 defaultvalidator 函数中是不可用的。

prop双向绑定

一般情况下,子组件不能直接修改从父组件接收的属性值,否则会报错,如果子组件需要接收值后处理再使用,可以将接收的值赋值给子组件本身的属性,如data中的属性或计算属性。

如果希望子组件prop父组件中的值改变时,将变化同步到父组件中,可使用事件监听或**.sync修饰符**

.sync修饰符

.sync修饰符是一个语法糖,本质上等同于事件监听的方法

参考:vue的.sync修饰符用法及原理详解_weixin_58206976的博客-CSDN博客_vuesync修饰符

父组件

<h1>父组件title值:{{ title }}</h1>
<ChildrenDemo :title.sync="title"></ChildrenDemo>

子组件

<template>
  <div class="ChildrenDemo">
    <h1>子组件</h1>
    <input type="text" v-model="childTitle" />
  </div>
</template>

<script>
export default {
  props: ["title"],
  data() {
    return {};
  },
  computed: {
    childTitle: {
      get() {
        return this.title;
      },
      set(val) {
        this.$emit("update:title", val);//更新父组件中的title
      },
    },
  }
};
</script>

效果:当子组件中input内容改变时,父组件中的title会同步改变

在这里插入图片描述

二、监听子组件事件(子组件向父组件传递数据,子组件触发父组件方法)

通过 vue 实例方法 vm.$emit子组件可以自定义一个事件提交给父组件,触发父组件的方法,父组件通过监听子组件的自定义事件可以接收子组件传递的数据。

子组件

<template>
  <div class="ChildrenDemo">
    <h1>子组件</h1>
    <button @click="changeParentTitle">点击更改父组件title</button>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {};
  },
  methods: {
    changeParentTitle() {
      this.$emit("childEvent", "子组件传给父组件的title")//第一个参数是提交的事件名,后面的参数可以是多个需要传递给父组件的参数
    }
  }
};
</script>

父组件

<template>
  <div class="home">
    <h1>父组件title值:{{ title }}</h1>
    <ChildrenDemo :title="title" @childEvent="changeTitle"></ChildrenDemo>
  </div>
</template>

<script>
import ChildrenDemo from "@/views/components/ChildrenDemo";
export default {
  components: {
    ChildrenDemo,
  },
  data() {
    return {
      title: "My Journey with Vue"
    };
  },
  methods: {
    changeTitle: function (str) {
      this.title = str
    },
  },
};
</script>

上例中的操作和传递的值都比较简单,也可以在事件处理函数中直接使用表达式,父组件通过 $event 访问被子组件抛出的值

子组件:

<button @click="$emit('childEvent', '子组件传给父组件的title')">点击更改父组件title</button>

父组件:

<ChildrenDemo :title="title" @childEvent="title = $event"></ChildrenDemo>

三、使用 $refs (父组件访问子组件的数据和方法)

父组件使用 $refs 可以访问子组件的数据和方法

使用时需在调用子组件时给子组件定义一个 ref 名

<ChildrenDemo ref="childrenDemo"></ChildrenDemo>
<button @click="getChildData">点击获取子组件数据</button>
getChildData: function () {
  let child = this.$refs.childrenDemo//获取子组件实例
  console.log(child.value);//访问子组件属性
  child.childFn() //调用子组件的childFn()方法
},

注意:

  1. $refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs
  2. 由于ref 需要在dom渲染完成后才会有,在使用的时候确保dom已经渲染完成。比如在生命周期 mounted(){} 钩子中调用,或者在 this.$nextTick(()=>{}) 中调用。

四、使用$parent(子组件访问父组件的数据和方法)

$parent property 可以用来从一个子组件访问父组件的实例

子组件:

<button @click="getParentData">点击获取父组件数据</button>
getParentData(){
  let parent = this.$parent //获取父组件实例
  console.log(parent.parentValue) //访问父组件属性
  parent.parentFn() //调用父组件的方法parentFn()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/406017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端开发环境安装、配置、项目搭建全教程】

前端开发环境安装、配置、项目搭建全教程 1.Node环境安装 简单的说 Node.js 就是运行在服务端的 JavaScrip&#xff0c;基于 Chrome JavaScript 运行时建立的一个平台&#xff0c;Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引擎&…

uniapp页面跳转的几种方式

uniapp页面跳转的几种方式 一、uni.navigateTo 定义&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用uni.navigateBack可以返回到原页面。使用&#xff1a; // 1.不传参 uni.navigateTo({url:./home/index }); // 2.传参字符串 uni.navigateTo(…

Vue后台管理系统模板

推荐一些 Vue 常用后台管理系统模板 前言 Vue.js 是一个目前比较流行的前端框架&#xff0c;已经到了前端人人都会的地步&#xff0c;今天这里为大家罗列一下基于 Vue 的后端管理的框架。目前比较流行和 Vue 搭配的 UI组件 有Element-UI、iview、Bootstrap-Vue、Ant-Design-V…

项目中报错 Uncaught (in promise)

项目中报错 Uncaught (in promise) 一、问题&#xff1a;当你调用 Promise.reject() 回调的时候&#xff0c;Chrome 控制台中出现一条警告消息“Uncaught (in promise)”。 例如你简单封装axios的响应拦截器的时候&#xff1a; // 响应拦截 service.interceptors.response.u…

VUE 富文本编辑器 tinymce - - - - 对懒人 非常友好 一看就懂

首先个人觉得 tinymce这个富文本编辑器是最好用 最编辑的 &#xff0c;对懒人非常友好 的一款编辑器&#xff0c;刚 有哟个项目 &#xff0c;就遇到了 使用富文本编辑的坑 &#xff0c;因为赶项目进度自己在网上随便找了一个富文本编器&#xff0c;就是 quill 这个 坑 实在太多…

【个人网站】零基础个人网站搭建完整教程(附免费源码)

零基础个人网站搭建完整教程&#xff08;一&#xff09; 内容包括&#xff1a;前端搭建后端搭建源码网盘链接搭建服务器网站上线&#xff08;完整教程&#xff09; 从0到1搭建网站零基础个人网站搭建完整教程&#xff08;一&#xff09;前言一、前端搭建一、副页设计1.显示文字…

最新Eclipse安装教程(2022-09)

前言 现在是在校大学生&#xff0c;未来想从事大数据相关的工作&#xff0c;目前在b站学习大数据&#xff0c;写这些的目的是为了整理、巩固学过的知识&#xff0c;以后自己工作了也可以回头看看&#xff0c;如果还能够帮助到大家&#xff0c;就再好不过了&#xff01; 一、Ec…

Python Flask框架-开发简单博客-项目布局、应用设置

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;只在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防…

Vue3父子组件通讯一目了然

文章目录&#x1f31f; 写在前面&#x1f31f; 父 &#x1f449; 子&#x1f31f; 子 &#x1f449; 父&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文…

前端直接生成GIF动态图实践

前言去年在博客中发了两篇关于GIF动态生成的博客&#xff0c;GIF图像动态生成-JAVA后台生成和基于FFmpeg的Java视频Mp4转GIF初探&#xff0c;在这两篇博客中都是采用JAVA语言在后台进行转换。使用JAVA的同学经过自己的改造和开发也可以应用在项目上。前段时间有朋友私下问&…

chatgpt这么火?前端如何实现类似chatgpt的对话页面

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;…

【毕业季|进击的技术er】作为一名职场人,精心总结的嵌入式学习路线图

活动地址&#xff1a;毕业季进击的技术er 文章目录0、作者介绍1、前言2、嵌入式基础必备知识2.1、学习内容2.2、学习建议2.3、学习资料3、嵌入式入门篇——51单片机3.1、学习内容3.2、学习建议3.3、学习资料4、STM32进阶篇4.1、学习内容4.2、学习建议4.3、学习资料5、小而美的R…

目标跟踪算法综述

前言: 目标跟踪是计算机视觉领域研究的一个热点问题&#xff0c;其利用视频或图像序列的上下文信息&#xff0c;对目标的外观和运动信息进行建模&#xff0c;从而对目标运动状态进行预测并标定目标的位置。目标跟踪算法从构建模型的角度可以分为生成式(generative)模型和判别…

Vue--》搭配Bootstrap实现Vue的列表增删功能

在日常开发中&#xff0c;我们可以用 “拿来主义” 借助Bootstarp现成的一些样式&#xff0c;快速生成我们想要的页面布局&#xff0c;避免书写大量的HTML和CSS代码&#xff0c;省下了许多不必要的时间。 当我们想要生成表单表格时我们可以查看Bootstrap的官方文档&#xff0c;…

vue2响应式原理

首先要知道vue2 是2013年 基于 ES5开发出来的 我们常说的重渲染就是重新运行render函数 vue2响应式原理简单来说就是vue官网上的这图片 通过 Object.defineProperty 遍历对象的每一个属性&#xff0c;把每一个属性变成一个 getter 和 setter 函数&#xff0c;读取属性的时候…

前端学习之CSS

目录 引言 1. 什么是CSS? 2. 在HTML中使用CSS的三方式(基于CSS2. 0) 2.1 内联定义 2.2 样式块 2.3 引入文件 引言 大家不要觉得CSS也是一种语言&#xff0c;需要花费很多的时间去学习&#xff0c;不要恐惧它&#xff0c;其实CSS只是一个很小的知识点&#xff0c;我们在…

【web渗透】SSRF漏洞超详细讲解

&#x1f495;&#x1f495;&#x1f495; 博主昵称&#xff1a;摆烂阳&#x1f495;&#x1f495;&#x1f495; &#x1f970;博主主页跳转链接 &#x1f469;‍&#x1f4bb;博主研究方向&#xff1a;web渗透测试 、python编程 &#x1f4c3; 博主寄语&#xff1a;希望本篇文…

Vue3的优点,为什么要使用Vue3

1.为什么要使用Vue3&#xff1a; 这里主要通过介绍Vue3的优点以及与Vue2的对比来解答这个问题。 Vue3的六大亮点 1.性能比Vue2快1.2~2倍&#xff1b; 性能的提升主要是通过响应式系统的提升&#xff08;vue3使用proxy对象重写响应式&#xff09;以及编译优化&#xff08;优…

Web项目【用户管理系统】完整版

目录 &#x1f482; 个人主页: 爱吃豆的土豆&#x1f91f; 版权: 本文由【爱吃豆的土豆】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 &#x1f3c6;人必有所执&#xff0c;方能有所成&#xff01; &…

vite3+vue3 项目打包优化实战之-视图分析(rollup-plugin-visualizer)、CDN引入、依赖分包、gzip压缩、history404问题

文章目录写在前面build 视图分析依赖文件第三方库CDN引入依赖文件分包gzip压缩文件部署前配置history路由模式的404问题最后写在前面 vue项目在线下环境开发完成后&#xff0c;我们就需要项目的打包上线了&#xff0c;除了要知道打包命令npm run build 之外&#xff0c;我们还…