Vue.js知识——父子组件的通信、父子组件的访问方式

79 篇文章 3 订阅
订阅专栏
26 篇文章 3 订阅
订阅专栏

父子组件的通信

在开发中,往往一些数据确实需要从上层传递到下层:

比如在一个页面中,我们从服务器请求到了很多的数据,其中一部分数据,并非是整个页面的大组件来展示,而是需要下面的子组件进行展示。这个个时候,并不会让子组件再次发送一个网络请求,而是直接让大组件将数据传递给小组件。

如何进行父子组件间的通信?

通过props向子组件传递数据(properties)

    const cpn2 = Vue.extend({
      template: `
        <div>
          <h1>{{cmovies}}</h1>
          <h3>哈哈哈<h3>
        </div>
      `,
      props:['cmovies'],
    });
    const app = new Vue({
      el: "#app",
      components: {
        cpn2,
      },
      data:{
        movies:["美国队长1","美国队长2","美国队长3"]
      }
    })

在这里插入图片描述
props不仅仅可以是传入数组,也可以传入对象

 props:{
        //1、类型限制
        cmoives:Array,
        //2、提供一些默认值
        cmoives:{
          type:Array,
          default(){
            return []
          },//默认值,如果默认值是个数组,就必须写成函数形式
          required:true,//如果为true,就是必须传入
        }
      }

props驼峰标识

在命名子组件的props属性时,往往会采取驼峰体,但是在html中是无法有效识别驼峰体代码。
例如:

<body>
  <div id="app">
    <cpn2 :cMovies="movies"></cpn2><!--这里无法识别驼峰体代码-->
  </div>

  <script>
    const cpn2 = Vue.extend({
      template: `
        <div>
          <h1>{{cMovies}}</h1>
          <h3>哈哈哈</h3>
        </div>
      `,
      props:{
        cMovies:{  //命名为驼峰体
          type:Array,
          default(){
            return []
          },
          required:true,
        }
      }
    });
    const app = new Vue({
      el: "#app",
      components: {
        cpn2,
      },
      data:{
        movies:["美国队长1","美国队长2","美国队长3"]
      }
    })
  </script>
 </body>

在这里插入图片描述

此时,数组中什么也没有传过来,所以显示了默认值。需要将html代码中的cMovies改成c-movies,才能显示。
<cpn2 :c-movies="movies"></cpn2>

子组件通过自定义事件向父组件发送消息

什么时候需要自定义事件呢?
当子组件需要向父组件传递数据时,就要用到自定义事件了,之前学习的v-on不仅仅用于监听DOM事件,也可以用于组件间的自定义事件。

<body>
  <div id="app">
    <cpn2 @itemclick="cpnclick"></cpn2>
  </div>

  <script>
    const cpn2 = Vue.extend({
      template: `
        <div>
          <button v-for="item in categories" @click="btnclick(item)">{{item.name}}</button>
        </div>
      `,
        data(){
          return{
            categories:[
              {id:"aaa",name:"热门推荐"},
              {id:"bbb",name:"手机数码"},
              {id:"ccc",name:"家用家电"},
              {id:"ddd",name:"生鲜水果"},
            ]
          }
        },
        methods:{
        btnclick(item){
          //发射事件:自定义事件 
          this.$emit("itemclick",item);
        }
      }
    });
    const app = new Vue({
      el: "#app",
      components: {
        cpn2,
      },
      methods:{
        cpnclick(item){
          console.log(item);
        }
      }
    })
  </script>
</body>

通信案例

<body>
 <div id="app">
  <cpn :number1="num1" :number2="num2"
  @num1change="num1change" @num2change="num2change"></cpn>
 </div>
 
 <template id="cpn">
  <div>
    <h2>props:{{number1}}</h2>
    <h2>data:{{dnumber1}}</h2>
    <input type="text" :value="dnumber1" @input="num1Input">
    <h2>props:{{number2}}</h2>
    <h2>data:{{dnumber2}}</h2>
    <input type="text" :value="dnumber2" @input="num2Input">
  </div>
 
</template>
 <script>
   const app= new Vue({
     el:"#app",
     data:{
       num1:1,
       num2:0
     },
     methods:{
      num1change(value){
        this.num1 = parseFloat(value);
      },
      num2change(value){
        this.num2 = parseFloat(value);
      }
     },
     components:{
       cpn:{
        template:"#cpn",
        props:{
          number1:Number,
          number2:Number,
        },
        data(){
          return {
            dnumber1:this.number1,
            dnumber2:this.number2,
          }
        },
        methods:{
          num1Input(event){
            this.dnumber1 = event.target.value;
            this.$emit("num1change",this.dnumber1);
            this.dnumber2 = this.dnumber1*100;
            this.$emit("num2change",this.dnumber2);
          },
          num2Input(event){
            this.dnumber2 = event.target.value;
            this.$emit("num2change",this.dnumber2);
            this.dnumber1 = this.dnumber2 / 100;
            this.$emit("num1change",this.dnumber1);
          },
        }
       }
     
     }
   })
 </script>
</body>

父子组件的访问方式

有时候需要父组件直接访问子组件,子组件直接访问父组件,或者是子组件访问根组件。

父组件访问子组件:使用$children或 $refs 引用

子组件访问父组件:使用$parent

$children

通过对button进行绑定事件,然后直接获取子组件中的属性。
但是要注意使用$children获取的是一个数组。

在这里插入图片描述

<body>
  <div id="app">
    <cpn></cpn>
    <button @click="btnclick">按钮</button>
  </div>

  <template id="cpn">
    <div>
      <h2>我是内容</h2>
    </div>
  </template>

  <script>
    const app=new Vue({
      el:"#app",
      methods:{
        btnclick(){
          console.log(this.$children[0].name);
          this.$children[0].name = "李四";
          console.log(this.$children[0].name);
        }
      },
      components:{
        cpn:{
          template:"#cpn",
          data(){
            return {name:"张三"}
          }
        }
      }
    })
  </script>
</body>

在这里插入图片描述
如果有多个数组就需要通过索引值来确定获取的需要修改的子组件,这样就造成了一个问题,如果子组件的位置变化,例如中间插入了新的子组件,就要修改索引值,非常麻烦。

这就用到了第二个方法

$refs

通过对子组件进行refs赋值,就可以确定需要获取的子组件。

注意的是不是refs,而是ref
<cpn ref="cpn1"></cpn>

console.log(this.$refs.cpn1.name);

在这里插入图片描述

$parent

子组件可以访问父组件,但是不建议使用,因为复用性不高,如果该子组件运用在其他父组件中,如果该父组件没有该属性就会报错。

<body>
  <div id="app">
    <cpn></cpn>
  </div>

  <template id="cpn">
    <div>
      <h2>我是内容</h2>
      <button @click="btnclick">按钮</button>
    </div>
  </template>

  <script>
    const app = new Vue({
      el: "#app",
      data:{
        age:18,
      },
      components: {
        cpn: {
          template: "#cpn",
          data() {
            return { name: "张三" }
          },
          methods: {
            btnclick() {
              console.log(this.$parent);
            }
          },
        }
      }
    })
  </script>
</body>

在这里插入图片描述

$ root

可以直接访问到Vue实例中的属性。
用法与上述相似。

Vue.js 父子组件通信的十种方式
10-17
最近一直在做 Vue项目代码层面上的优化,写文章是很easy的事情,今天小编给大家分享Vue.js 父子组件通信的十种方式,感兴趣的的朋友跟随小编一起看看吧
VueJs(9)---组件父子通讯)
a8892117的博客
05-06 243
组件父子通讯) 一、概括 在一个组件内定义另一个组件,称之为父子组件。 但是要注意的是:1.组件只能在父组件内部使用(写在父组件tempalte中); 2.默认情况下,组件无法访问组件上的数据,每个组件实例的作用域是独立的; 那如何完成父子如何完成通讯,简单一句话:props down, eve...
vue.js父子组件通信动态绑定
兰亭古墨
07-08 1194
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <div id='app'> <!--这里的作用是将父组件渲染到页面上--> <father></father> </div> </body> <script src="https:
vue.js父子组件
虬川候的博客
10-31 162
父子组件: 1. 父子组件间的作用域相互独立。 2. 组件只能在父组件的配置项里创建。 3. 组件只能在父组件的模板中进行调用。 &lt;!DOCTYPE html&gt; &lt;html lang="zh"&gt; &lt;head&gt; &lt;meta charset="UTF-8" /&gt; &lt;title&gt;Document&lt;/tit
vue.js组件父子组件
qq_43189389的博客
04-28 180
父子组件的区别 <div id="app"> <cpn2></cpn2> </div> <script> //构造组件 const cons1 = Vue.extend({ template: '<div><h2>我是组件</h2></div>...
vue.js父子组件通信动态绑定的实例
10-17
今天小编就为大家分享一篇vue.js父子组件通信动态绑定的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
vue.js使用v-model实现父子组件间的双向通信示例
10-15
主要介绍了vue.js使用v-model实现父子组件间的双向通信,结合实例形式分析了vue.js基于v-model父子组件间的双向通信的具体实现技巧,需要的朋友可以参考下
vue.js单文件组件中非父子组件的传值实例
10-18
今天小编就为大家分享一篇vue.js单文件组件中非父子组件的传值实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
【19】vue.js父子组件
有心博客
09-08 324
父子组件<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="js/vue.js" ></script> </head> <body> <div id="bo
35、组件向父组件传值
code_dream_wq的博客
12-02 110
组件向父组件传值 - 组件用`$emit()`触发事件 - `$emit()` 第一个参数为 自定义的事件名称 第二个参数为需要传递的数据 - 父组件用v-on 监听组件的事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> ...
Vue3.0中父子组件通信访问方式
QNANWang的博客
03-21 689
一、组件 组件的使用:创建-引入-声明-使用 二、父子组件之间的通信 (1)父传props 父亲向父组件中传参,组件通过props接收 可以声明类型,默认值,如果有数据那么默认值不生效,如果没有数据则默认值生效。 (2)传父$emit 组件向父组件中传参,需要通过$emit $emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数。 三、父子组件之间访问方式 (1)父组件调用组件的方法children(Vue
vue 前端父子组件通信
凡凡的博客
01-10 291
假设index.vue为父组件,calender.vue为组件,实现二者的数据通信
案例-VUE组件访问---父组件访问组件---组件访问组件
cj521zhihui的博客
10-24 136
组件访问组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <cpn></cpn> <cpn></cpn> <my-cpn></
父子组件通信,父组件访问组件详解
jxjianghailan的博客
11-05 505
父子组件通信 通过props向组件传递数据 通过事件向父组件发送消息 props基本用法:在组件中,使用选项props来声明需要从父级接收到的数据 props的值有两种方式: 字符串数组,数组中的字符串就是传递时的名称 对象,对象可以设置传递时的类型,也可以设置默认值等 用一种方式接受数据: 建两个页面,app.vue作为父页面,child.vue作为页面, v-on绑定的属性名称childmovies与data中定义的movies名称可以不一样,也可以定义成一样的,属性chi
Vue.js 父子组件之间通信的十种方式
熊宗的博客
07-02 170
组件通信方式无外乎以下几种: Prop(常用) $emit(组件封装用的较多) .sync语法糖 (较少) $attrs和$listeners(组件封装用的较多) provide和inject(高阶组件/组件库用的较多) 其他方式通信(兄弟组件及全局变量等) ...
vue.js原生组件化开发(二)——父子组件
淡忘烟雨的博客
09-26 499
前言 在了解父子组件之前应先掌握组件开发基础。在实际开发过程中,组件之间可以嵌套,也因此生成父子组件父子组件创建流程 1.构建父子组件 1.1 全局注册 (1)构建注册组件 //构建组件child var child = Vue.extend({ template: '&lt;div&gt;这是组件&lt;/div&gt;' }); //注册名为'child'的组件...
Vue组件通信——父子组件通信的四种方法
热门推荐
weixin_44001906的博客
07-13 1万+
引入组件 全局引入 在main.js文件中引入并注册 import ChildrenDemo from '@/views/components/ChildrenDemo' Vue.component('ChildrenDemo',ChildrenDemo)// 第一个参数 全局组件的名字(字符串类型),第二个参数:引入的组件名(一般都与组件名保持一致) 之后就可以全局使用组件了 局部引入 在父组件中引入 import ChildrenDemo from '@/views/components/Ch
vuejs父子组件访问【$refs】【$children】
CamphorBlossom的博客
08-11 2850
​$refs(reference 缩略)是一个对象,持有当前组件中注册过refattribute的所有 DOM 元素和组件实例。 ​
vue父子组件通信方式
最新发布
07-14
Vue中父子组件通信有多种方式,以下是一些常用的方法: 1. Props/Attributes:父组件通过props向组件传递数据组件通过props接收并使用这些数据。父组件可以在模板中直接绑定属性值,也可以通过v-bind动态绑定属性。 2. 自定义事件:组件可以通过$emit触发自定义事件,并传递数据给父组件。父组件通过v-on监听组件的自定义事件,并在对应的方法中处理数据。 3. $refs:父组件可以通过ref属性给组件添加一个引用,然后可以通过$refs来访问组件的属性和方法。 4. Vuex:Vuex是Vue的状态管理库,可以在多个组件之间共享和管理状态。父组件可以将数据存储在Vuex的state中,组件通过this.$store访问和修改这些数据。 5. Provide/Inject:父组件可以通过provide提供数据,然后组件通过inject来注入这些数据。这种方式可以实现跨层级的组件通信。 以上是一些常见的父子组件通信方式,根据具体场景选择合适的方式来进行通信

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 【uniapp小程序】分享功能onShareAppMessage函数传参数 13914
  • 【uniapp小程序】实现二维码图片弹窗、保存图片功能 6740
  • 【uniapp小程序】安卓手机与苹果手机的getPhoneNumber拒绝授权返回错误信息不同 6417
  • Python知识——异常处理 6285
  • Python知识——形参与实参 4517

分类专栏

  • 菜鸟入门 79篇
  • typescript 2篇
  • 前端知识 26篇
  • 项目中的学习 9篇
  • JavaScript 10篇
  • 软考笔记 3篇
  • python知识 34篇
  • 网络编程 3篇
  • 入门到入坟 6篇

最新评论

  • 【Git】如何在.gitignore忽略已经被上传到git上的文件,并且同步到线上

    CSDN-Ada助手: CS入门 技能树或许可以帮到你:https://edu.csdn.net/skill/gml?utm_source=AI_act_gml

  • 【Git】Conventional Commit提交规范

    CSDN-Ada助手: 不知道 CS入门 技能树是否可以帮到你:https://edu.csdn.net/skill/gml?utm_source=AI_act_gml

  • 【uniapp小程序】保存网络图片功能

    薇薇....: 你自己有运行过吗

  • 【uniapp小程序】保存网络图片功能

    是个小菜鸡呢: 你这代码 写挺好表情包

  • 【uniapp小程序】button组件去掉默认样式,转变为灵活的view

    与远i: 我想问一下大佬这个原因是为什么啊?我做了内联还是不能修改,但是之前用过一次就是内联就解决了

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • SOLID 原则是什么
  • 【声网】实现web端与uniapp微信小程序端音视频互动
  • 【Git】如何在.gitignore忽略已经被上传到git上的文件,并且同步到线上
2024年4篇
2023年1篇
2022年13篇
2021年87篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳SEO优化公司淮北网站建设坂田关键词按天扣费龙华网站搜索优化推荐长沙关键词按天收费多少钱朝阳网站建设推荐上饶网站优化按天收费价格福州网站关键词优化报价宝鸡网站推广工具公司湛江英文网站建设南联网站排名优化价格永州百度竞价推荐毕节百搜标王哪家好通辽推广网站渭南网站建设报价银川至尊标王公司朝阳百度网站优化排名随州SEO按天计费多少钱扬州关键词按天扣费推荐龙岗关键词按天扣费哪家好安阳品牌网站设计安阳网站seo优化商丘品牌网站设计湖州网站优化按天收费价格武汉百度seo报价漯河seo排名价格廊坊关键词排名报价驻马店seo网站推广太原百姓网标王推荐黑河关键词按天扣费报价汕头百搜标王推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化