web前端 -- vue --vue 组件通信(1)

根据千峰教育学习视频所练习的笔记 | 学习一段时间,我也有写一点东西的必要了···

1. 父组件向子组件通信

1.1. 我们还是引用vue先前的代码:如下

<head>
    ······
    <script src="../vue.js"></script>
</head>
<body>
<div id="app">
    <my-header></my-header>
</div>
<script>
    var vm = new Vue({
       el:'#app',
       components:{
           'my-header':{
               template:`<div>
                            <h2>{{message}}</h2>
                            <ul>
                                <li >张一山</li>
                            </ul>
                         </div>`,
               data:function () {
                   return{
                       message:'hello my idol',
                   };
               }
           }
       }
    });
</script>
</body>
  • 就是长这个样子:
![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024162510035-85654409.png)

1.2. 那我们来看看怎么在父子组件中进行通信:

  • 首先在<ul>里写一个list数据,写好之后对<li>进行遍历操作
components:{
    'my-header':{
        template:`<div>
                    <h2>{{message}}</h2>
                    <ul>
                        <li v-for="item in list">{{item}}</li>
                    </ul>
                  </div>`,
  <!-- v-for 遍历      -->
        data:function () {
            return{
                message:'hello my idol',
                list:['张一山','吴京','李现','肖战']
            };
        }
    }
}
  • 可以看到,数据被遍历到页面当中了
![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024162520894-1752679776.png)

1.3. 若数据不在当前组件,而是在它的父组件当中,现在把它传递过来怎么做呢

  • 首先要了解一下,当前组件是<my-header>,它的父组件可以看作是app。因为前面讲过,new 一个实例也是创建组件的方式,但是真实的组件是扩展了实例的方式,实例也是可以看作组件的。
<div id="app">
    <my-header></my-header>
</div>
  • 现在 app 充当父组件,我们就可以在里面写 data配置
<script>
    var vm = new Vue({
       el:'#app',
       data:{
            list:['张一山','吴京','李现','肖战'],
            //光写这里不会有作用,还需继续写props
        },
       components:{
           'my-header':{
               ······
                   return{
                       message:'hello my idol',
                   };
               }
           }
       }
    });
</script>
  • 但是现在list是没有被渲染出来:
![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024162533777-279179463.png)

1.4. 为了防止冲突与解耦性,当前的数据只能操作于当前组件。那有的时候我们需要父组件传递数据,可以通过固定的写法来完成。

  • 在子组件中引入 list 数据并设置key值,然后在 props 中引用相应key值
<div id="app">
    <my-header :list="list"></my-header>
<!--    等号左边是key值,右边是数据-->
</div>
<script>
    var vm = new Vue({
       el:'#app',
       data:{
            list:['张一山','吴京','李现','肖战'],
            //光写这里不会有作用,还需继续写props
        },
       components:{
           'my-header':{
               ······
                   return{
                       message:'hello my idol',
                   };
               },
               props:['list'],
               //引入key值
           }
       }
    });
</script>

现在就可以渲染,能进行父子组件的通信了

![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024162615320-949443802.png)

1.5. 我们现在来一个复杂的,父组件可以把数据传给子组件,子组件还可以传给自己的子组件

  • 定义一个子组件的子组件 <my-nav>,同样去设置components
 <script>
    var vm = new Vue({
        ······
        components:{
           'my-header':{
               template:`<div>
                            ······
                            </ul>
                            <my-nav :list="list"></my-nav>
                         </div>`,
               //v-for 遍历
               ···   
               props:['list'],
               components: {
                   'my-nav':{
                       template: `<ul>
                                    <li v-for="item in list">{{item}}</li>
                                 </ul>`,
                       props:['list']
    //    数据一层一层地传递,不能越层,ma-nav也要进行挂载处理
                   }
                }      
           }
       }
    });
</script>

这样就实现数据传递了:

![](https://img2018.cnblogs.com/blog/1817586/201910/1817586-20191024162626778-712281062.png)

1.6. props 除了传递数据,还能做验证处理,这里就不展示了

posted @ 2019-10-24 16:27  菲菲的超级粉丝  阅读(299)  评论(0编辑  收藏  举报