vue组件之间通信方式汇总(1),2024年最新掌握这些前端开发热门前沿知识

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age.sync="age"  :person.sync="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>


<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <div><button @click="sendMessage">用于修改props里面值的按钮</button></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.$emit("update:age", 19);
      this.$emit("update:person", {name: "李四", address: "bbb"});
    }
  }
  
}
</script>


3.1.2 过程分解

在这里插入图片描述
在这里插入图片描述

3.2.1借助v-model实现,该方式在表单提交中较为常用
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age"  :person="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>


<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <input v-model="age" placeholder="请输入年龄"/>
    <input v-model="person.name" placeholder="请输入名称"/>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.$emit("update:age", 19);
      this.$emit("update:person", {name: "李四", address: "bbb"});
    }
  }
  
}
</script>


3.2.2 过程分解

在这里插入图片描述
在这里插入图片描述

3.3.1对于非基本数据类型,只改变其中某个属性的值,可以直接实现
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld :age="age"  :person="person"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>


<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <div><button @click="sendMessage">用于修改props里面值的按钮</button></div>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  props:["age", "person"],
  methods: {
    sendMessage() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
  
}
</script>


3.3.2 过程分解

在这里插入图片描述
在这里插入图片描述

方式2:provide和inject

provide和inject在传递上比方式一更加的宽泛,当provide的组件上添加了,那么其后代都可以通过inject进行数据接收,不限制在父子组件之间

2.1代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : this.age,
      person: this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    reciveInfo(info) {
      this.fatherInfo = info;
    }
  }
}
</script>


<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  inject:["age", "person"],
  components: {
    Hello1
  }
}
</script>



<template>
  <!-- 这是父组件 -->
<div >
  <div>这是孙组件,接收组件的数据传递,age的值是:{{this.age}}</div>
  <div>这是孙组件,接收组件的数据传递,person的值是:{{person.name}} --- {{person.address}}</div>
</div>
</template>

<script>

export default {
name: 'Hello1',
inject: ["age", "person"]

}
</script>
<style>

</style>

2.2过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3provide和inject响应式写法

上面的写法有个问题,如果你只是针对非基本数据类型的某个属性进行修改,修改后所有的地方都会进行改变,但是改变基本数据类型后改变整个对象后,组件本身会改变,但是其他不会随之改变,会造成数据不一致问题。

2.3.1 问题展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    <div>
      <button @click="change1">父组件中修改provide传递的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : this.age,
      person: this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
}
</script>


在这里插入图片描述
在这里插入图片描述

2.3.2 解决方式
2.3.2.1 代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>父组件中接收子组件的数据fatherInfo的值是:{{this.fatherInfo}}</div>
    <div>
      <button @click="change1">父组件中修改provide传递的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },
  provide() {
    return {
      age : () => this.age,
      person: () => this.person
    }
  },
  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.age = 19;
      this.person.name = "李四";
    }
  }
}
</script>


<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,接收父组件的数据传递,age的值是:{{this.age()}}</div>
    <div>这是子组件,接收父组件的数据传递,person的值是:{{person().name}} --- {{person().address}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  inject:["age", "person"],
  components: {
    Hello1
  }
}
</script>



<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,接收组件的数据传递,age的值是:{{this.age()}}</div>
  <div>这是孙组件,接收组件的数据传递,person的值是:{{person().name}} --- {{person().address}}</div>
</div>
</template>

<script>

export default {
name: 'Hello1',
inject: ["age", "person"]

}
</script>
<style>

</style>

2.3.2.2 过程分解

在这里插入图片描述
在这里插入图片描述

2.3.2.3 使用备注

当我们后代组件想修改inject接收的数据时,如果是响应式的书写方式,那么无法提供修改方式(可以通过下面的$listeners去源头进行修改);如果是非响应式的书写,对于非基本数据类型来说,只是改变对象里面的某个属性是可以的,但是这种修改会很难知道是哪个组件对属性进行了修改,比较难以追踪,需要谨慎。其他的不建议修改,会造成数据不一致。

方式3: p a r e n t 和 parent和 parentchildren

这种方式很直接,将整个实例都获取去直接操作, c h i l d r e n 是当前组件的直接子组件实例 ; children是当前组件的直接子组件实例; children是当前组件的直接子组件实例;parent是当前组件的父组件实例,可以实现父组件及其后代组件上数据之间的传递。这种方式是获取组件本身的对象,与组件之间引用放置的顺序由很大关联,当改变组件引用的顺序时,需要同时修改获取原组件的下标,使用时需要谨慎考虑。

3.1代码展示
3.1.1 $children修改后代组件数据
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.$children[0].info = "修改子组件的数据";
      this.$children[0].$children[0].count = "修改孙组件的数据";
    }
  }
}
</script>


<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,nfo的值是:{{this.info}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
    }
  }
}
</script>



<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,count的值是:{{this.count}}</div>
 
</div>
</template>

<script>

export default {
name: 'Hello1',
data() {
  return {
    count : "孙组件数据"
  }
}
}
</script>
<style>

</style>

3.1.2 过程分解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.1 $parent修改先辈属性值
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      this.$children[0].info = "修改子组件的数据";
      this.$children[0].$children[0].count = "修改孙组件的数据";
    }
  }
}
</script>


<template>
  <div>
    <!-- 这是子组件 -->
    <div>这是子组件,nfo的值是:{{this.info}}</div>
    ----------------------------------------------------------------------------------------------------
    <Hello1 />
  </div>
</template>

<script>
import Hello1 from '@/components/Hello1.vue'
export default {
  name: 'HelloWorld',
  data() {
    return {
      info: "这是子组件的数据"
    }
  },
  components: {
    Hello1
  },
  methods: {
    change2() {
    }
  }
}
</script>



<template>
  <!-- 这是孙组件 -->
<div >
  <div>这是孙组件,count的值是:{{this.count}}</div>
  <div>
    <button @click="change3">修改后先辈组件的值</button>
  </div>
</div>
</template>

<script>

export default {
  name: 'Hello1',
  data() {
    return {
      count : "孙组件数据"
    }
  },
  methods: {
    change3() {
      debugger;
      this.$parent.info ="修改直接父辈组件的值";
      this.$parent.$parent.age = 20;
    }
  },
}
</script>
<style>

</style>

3.2.2 过程分解

在这里插入图片描述

方式4: r e f 和 ref和 refrefs

这种方式和方式三一样是获取组件实例本身去操作。在组件上添加一个ref属性,给与这个组件一个标志,通过该标志去获取组件本身的实例,相比较与方式三需要确定组件的引用顺序,该方式没有该苦恼,但是在给ref值的时候注意值不要重复。同时没有办法通过$ref去获取父类对象,这点是相比较于方式三的缺陷。

4.1代码展示
<template>
  <div>
    <!-- 这是父组件 -->
    <div>父组件中的基本数据类型age的值是:{{this.age}}</div>
    <div>父组件中引用数据类型person的值是:{{this.person.name}} --- {{this.person.address}}</div>
    <div>
      <button @click="change1">修改后代组件的值</button>
    </div>
    ----------------------------------------------------------------------------------------------------
    <HelloWorld ref="helloWorld"/>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'Home',
  data(){
    return {
      age : 18,
      person: {
        name: "张三",
        address: "aaa"
      },
      fatherInfo: ""
    };
  },

  components: {
    HelloWorld
  },
  methods: {
    change1() {
      debugger;
      this.$refs.helloWorld.info = "修改子组件的值";
      this.$refs.helloWorld.$refs.hello1.count = "修改孙组件的值";
    }
  }
}
</script>

总结一下

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

前端面试题汇总

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
hange1() {
debugger;
this. r e f s . h e l l o W o r l d . i n f o = " 修改子组件的值 " ; t h i s . refs.helloWorld.info = "修改子组件的值"; this. refs.helloWorld.info="修改子组件的值";this.refs.helloWorld.$refs.hello1.count = “修改孙组件的值”;
}
}
}



#### 总结一下

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。



万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。



为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

![](https://img-blog.csdnimg.cn/img_convert/621960a57eb42479e02d6d64c0c81891.png)



![](https://img-blog.csdnimg.cn/img_convert/5230c48fd0fcb265f3401a21603bda2b.png)



**前端面试题汇总**

![](https://img-blog.csdnimg.cn/img_convert/42728594459506983a38ca2b86545fc6.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)**
[外链图片转存中...(img-YwLzQXTP-1713200499682)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值