• 第二十五篇 组件通信 - 间接


          前面几篇内容讲到了组件与组件之间的通信时无法进行直接的通信,知道组件其实是一种孤岛,无法直接访问外部组件的状态或者方法,但是能够间接的使用组件通信来进行组件与组件之间的通信;

     通过代码和演示效果来进一步了解:

     ( 完成上面的效果,将对应拿到的数据显示出来!)

    1. <div id="app">
    2. <child1 @mychild1 = "handleClick1" :child-two="child2">child1>
    3. <child2 @mychild2 = "handleClick2" :child-one="child1">child2>
    4. div>
    5. <script>
    6. Vue.component("child1",{
    7. props:['childTwo'],
    8. template:`
    9. 组件1 -- child1

    10. 组件1数据: {{child1}}

    11. 拿到组件2数据: {{childTwo}}

  • `,
  • data(){
  • return{
  • child1:'child1_Data'
  • }
  • },
  • methods:{
  • handleClick(){ this.$emit("mychild1",this.child1) }
  • }
  • })
  • Vue.component("child2",{
  • props:['childOne'],
  • template:`
  • 组件2 -- child2

  • 组件2数据: {{child2}}

  • 组件1数据: {{childOne}}

  • `,
  • data(){
  • return{
  • child2:'child2_Data'
  • }
  • },
  • methods:{
  • handleClick(){ this.$emit("mychild2",this.child2) }
  • }
  • })
  • new Vue({
  • el:'#app',
  • data:{
  • child1:'', // 存放child1数据
  • child2:'' // 存放child2数据
  • },
  • methods:{
  • handleClick1(opt1){
  • this.child1 = opt1 // 赋值给child1
  • console.log(opt1,this.child1)
  • },
  • handleClick2(opt2){
  • this.child2 = opt2 // 赋值给child2
  • console.log(opt2,this.child2)
  • }
  • }
  • })
  • script>
  •         这样一来就实现了组件与组件之前的通信,在编写的时候就能知道并没有直接将数据送来另外一个组件当中去,而是通过中间的一个桥梁实现组件与组件之前的一个通信,上述代码很多看起来有些乱糟糟,没关系,再用一个图简单化,无非就是利用父传子和子传父一同实现这个操作;  

             通过以上这个图更加了解这是一个怎样的过程来实现组件与组件之间的通信;当然种方式存在着一定的缺陷,这个后续的篇目会讲到这个问题。

    综合案例

            前面讲过内容的渐进性,这次的小案例也不例外,结合之前的内容来进行一个综合小案例,将之前的内容进行回顾以及结合新内容;下面是将要完成的需求:

             这里请求数据使用axios的内容就不讲解关于数据如何来请求,使用的依然是上次在讲fetch请求和 axios使用讲过,这里附上对应的地址,忘了可以回去看一下,温故而知新嘛!


    附上链接:


            上面的图解内容已经比较清晰了,现在开始来编写相应的代码展示效果,为了简化让你看到更加清晰,将对应的css去掉了,思路看起来会比较清楚:

    1. <div id="app">
    2. <button @click="sendRequest"> axios请求 button>
    3. <film :myhot="hot" @mydetail="getFilmInfo">film>
    4. <detail :film-detail="filmInfo">detail>
    5. div>
    6. <script>
    7. Vue.component("film",{
    8. props:['myhot'],
    9. template:`
    10. <div>
    11. <p>热门电影p>
    12. <div v-if="myhot.length===0">
    13. <p>请先发送axios请求...p>
    14. div>
    15. <div v-else v-for="item in myhot" :key="item.id">
    16. <img :src="item.img" alt="img" >
    17. <div>
    18. <span>影片:《{{item.nm}}span>
    19. <span>{{item.desc}}span>
    20. <button @click="getDetail(item)">点击详情button>
    21. div>
    22. div>
    23. div>
    24. `,
    25. data(){
    26. return{
    27. info:''
    28. }
    29. },
    30. methods:{
    31. getDetail(item){
    32. this.info = item.videoName
    33. this.$emit("mydetail",this.info);
    34. }
    35. }
    36. })
    37. Vue.component("detail",{
    38. props:['filmDetail'],
    39. template:`
    40. <div>
    41. <p>简介:p>
    42. <p>   {{filmDetail}}p>
    43. div>
    44. `
    45. })
    46. new Vue({
    47. el:'#app',
    48. data:{
    49. hot:[],
    50. filmInfo:'热门电影预告通知!'
    51. },
    52. methods:{
    53. sendRequest(){
    54. axios.get('axios.json')
    55. .then(res=>{
    56. console.log(res.data)
    57. this.hot = res.data
    58. })
    59. },
    60. getFilmInfo(info){
    61. console.log(info)
    62. this.filmInfo = info
    63. // console.log(filmInfo)
    64. }
    65. }
    66. })
    67. script>

    未发送数据请求时页面显示:

     点击 "axios请求" 按钮发送请求:

     点击 "点击详情" 可以看到该电影的简介:

            以上就是使用了之前篇目讲的知识点内容以及本篇内容知识点内容做的一个综合小案例,也让我们了解了组件与组件之间的一种通信方式,但是会发现这种方式有一定的缺陷,如当有多个组件需要这样进行往返的通信,是不是会发现这样子的通信貌似像是一场灾难,那么在下篇的内容就让我们一同来解决这样的一个问题,拯救这次灾难吧!感谢大家的支持!

     

  • 相关阅读:
    论文阅读笔记(四)——实例分割与掩模R-CNN应用于多摄像机设置中松散的奶牛
    介绍一款特别好用的java反编译工具jd-gui
    kali下使用docker建立dvwa靶机
    Go包介绍与初始化:搞清Go程序的执行次序
    frp内网穿透并搭建多个域名同时映射
    Makefile中常见的gcc编译参数
    解决服务器重装无法通过ssh连接的问题
    网络-navigator.sendBeacon
    python中的模块与包
    川渝智慧高速第 4 部分:车路协同系统数据交换
  • 原文地址:https://blog.csdn.net/weixin_52203618/article/details/127594668