Vue组件之间的通信(js版)

知识点:Vue父子组件之间的通信,Vue父子组件之间通信的双向绑定

父子组件之间的通信

1.父传子

父传子图解

	  <div id="app">
    <my-cpn-f></my-cpn-f>
  </div>

  <template id="cpp1">
    <div>
      <p>这是一个父组件</p>
      <p>{{message}}</p>  // 这是父组件上的数据
      <my-cpn-s :f-music="music"></my-cpn-s>
    </div>
  </template>

  <template id="cpp2">
    <div>
      <p>这是一个子组件</p>
      <p>{{message}}</p> // 这是子组件上的数据
      <p>{{fMusic}}</p>  // 这是父传给子的数据
    </div>
  </template>
 const app = new Vue({
      el:'#app',
      data(){
        return{
          message:'hello vue'
        }
      },
      components:{
        myCpnF:{
          template:'#cpp1',
          data(){
            return {
              message:'father',
              music:'像我这样的人',  // 将父组件中的这个数据传给子组件
            }
          },
          methods:{ 
            getSonMovie(val){
              // console.log(val);
              this.sonMovie = val;
            }
          },
          // 子组件
          components:{
            myCpnS:{
              template:'#cpp2',
              // props:['fMusic'],
              // props:{
              //   fMusic:String
              // },
              props:{
                fMusic:{
                  type:String,
                  default:'' // 如果数据是一个数组或对象,default必须是一个函数,且返回一个数组或对象
                }
              },
              data(){
                return{
                  message:'son'
                }
              }
            }
          }
        }
      }
    })
2. 子传父

子传父

	  <div id="app">
    <my-cpn-f></my-cpn-f>
  </div>

  <template id="cpp1">
    <div>
      <p>这是一个父组件</p>
      <p>{{message}}</p>
      <p>{{sonMovie}}</p>  // 这里显示子组件传过来的数据
      <my-cpn-s  @btnclick="getSonMovie"></my-cpn-s>
    </div>
  </template>

  <template id="cpp2">
    <div>
      <p>这是一个子组件</p>
      <p>{{message}}</p>
      <p>{{getMovies()}}</p>
    </div>
  </template>
 const app = new Vue({
      el:'#app',
      data(){
        return{
          message:'hello vue'
        }
      },
      components:{
        myCpnF:{
          template:'#cpp1',
          data(){
            return {
              message:'father',
              sonMovie:''
            }
          },
          methods:{ 
            getSonMovie(val){
              // console.log(val);
              this.sonMovie = val;
            }
          },
          components:{
            myCpnS:{
              template:'#cpp2',
              data(){
                return{
                  message:'son',
                  movies:'我和我的家乡' // 把子组件上的这个数据传递给父组件并在父组件中使用
                }
              },
              methods:{
                getMovies(){
                  // this.$emit('自定义事件',参数/数据)
                   this.$emit('btnclick',this.movies)
                   // 自定义事件的事件名最好全部使用小写字母,不要出现全大写字母和大小写字母混用
                }
              }
            }
          }
        }
      }
    })

父子组件之间通信的双向绑定

1. 事件版

目的:
/*
1. 通过props实现父组件把数据给子组件显示
2. 通过$emit自定义事件把输入值通过子组件发给父组件
3. 父组件拿到数据给再给子组件
4. 从而实现父子组件之间数据的绑定
*/

html代码

   <div id="app">
    <son 
    :father-mes="message"
    @datachange="getSonData"
    >
  </son>
  </div>

  <template id="cpn">
    <div>
      <p>父传子的值:{{fatherMes}}</p>
      <input type="text" @input="dataChange">
    </div>
  </template>

js代码

	    // 子组件
    let son = {
      template:'#cpn',
      props:{
        fatherMes:{
          type:String,
          default:''
        }
      },
      methods:{
        dataChange(event){
          this.$emit('datachange',event.target.value)
        }
      }
    }

    // 父组件
    const app = new Vue({
      el:'#app',
      data:{
        message:'在下框输入值,实现父子组件数据之间的双向响应'
      },
      components:{
        son
      },
      methods:{
        getSonData(val){
          this.message = val;
        }
      }
    })
2. 监听版

html代码

   <div id="app">
    <son 
    :father-mes="message"
    @datachange="getSonData"
    >
  </son>
  </div>

  <template id="cpn">
    <div>
      <p>父传子的值:{{fatherMes}}</p>
      <input type="text" v-model="dum">
    </div>
  </template>

js代码

     // 子组件
    let son = {
      template:'#cpn',
      props:{
        fatherMes:{
          type:String,
          default:''
        }
      },
      data(){
        return{
          dum:this.fatherMes
        }
      },
      watch:{
        dum(val){
          this.$emit('datachange',val)
        }
      }
    }

    // 父组件
    const app = new Vue({
      el:'#app',
      data:{
        message:'在下框输入值,实现父子组件数据之间的双向响应'
      },
      components:{
        son
      },
      methods:{
        getSonData(val){
          this.message = val;
        }
      }
    })

2020—10—1 Vue基础知识 by code_he

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值