vue组件之间通信,父传子,子传父,父调子,子调父

vue

  • 组件之间通信

    • 父传子

      • 在引入的子组件用 “:” 绑定属性名=值

      • 在子组件props以对象的形式接收,并且定义类型

        <!-- 父组件 -->
        <template>
          <div>
            <input type="text" v-model="name" @click="click">
            //引入子组件
            <child :inputName="name" ref="clickChild" ></child>
          </div>
        </template>
        <script>
          //引入子组件
          import child from './child'
          export default {
            //注册组件
            components: {
              child
            },
            data () {
              return {
                name: ''
              }
            },
             methods:{
                 
             }
          }
        </script>
        
        <!-- 子组件 -- >
        <template>
          <div>
            <span>{{inputName}}</span>
          </div>
        </template>
        <script>
          export default {
            // 接收父组件的值
            props: {
              inputName: String,
              required: true
            }
          }
        </script>
        
    • 父调用子的方法

      • 先在子组件写一个方法,用于父组件调用

      • 在父组件引入的子组件用 fef=“方法名”

      • 在父组件调用子组件的地方 this.$refs.方法名.子组件要调用的方法()

        //父组件
        <template>
          <div>
            父组件:
            <input type="text" v-model="name" @click="clickChild">
            <!-- 引入子组件 -->
            <child :inputName="name" ref="child"></child>
          </div>
        </template>
        <script>
          import child from './child'
          export default {
            components: {
              child
            },
            data () {
              return {
                name: ''
              }
            },
              methods:{
              	clickChild(){
                    this.$refs.child.child()
                    //我是父组件调用子组件
                }
          }
          }
        </script>
        
        //子组件
        <template>
          <div>
            子组件:
            <span>{{inputName}}</span>
          </div>
        </template>
        <script>
          export default {
            // 接收父组件的值
            props: {
              inputName: String,
              required: true
            },
              data(){
                  return{
                      
                  }
              },
              methods:{
                  //子方法用于父组件调用
                  child(){
                      console.log("我是父调子的方法")
                  }
              }
          }·
        </script>
        
    • 子传父

      • 先在子组件写一个点击事件,用于向父组件传值

      • 在要向父组件传值的地方用this.$emit(“自定义属性”,值)

      • 在父组件用v-on ":"接收,绑定自定义属性

      • 在父组件用wacth监听子组件传来的值,也可在methods方法里面接收

        //子组件
        <template>
          <div>
            子组件:
        	<button @click="Child"></button>
          </div>
        </template>
        <script>
          export default {
              data(){
                  return{
                      msg:"我是子组件传过来的数据"
                  }
              },
              methods:{
                  //子组件自定义的方法
                  child(){
                      //this.$emit("方法名",值)
                      this.$emit("Child",this.msg)
                      console.log("我是父调子的方法")
                  }
              }
          }·
        </script>
        
        //父组件
        <template>
          <div>
            父组件:
            <input type="text" v-model="name" @click="clickChild">
            <!-- 引入子组件 -->
            <child :Child="Child"  ></child>
          </div>
        </template>
        <script>
          import child from './child'
          export default {
            components: {
              child
            },
            data () {
              return {
                name: ''
              }
            },
              methods:{
              	Child(e){
                    console.log(e)
                    //e是子组件传过来的值
                }
          }
          }
        </script>
        
    • 子调用父的方法

      • this.$parent.父组件方法名:不同环境这个东西也不一样的。uniapp开发的h5页面需要两个,app端需要一个,具体还是自己根据实际情况

      • $emit向父组件触发一个事件,父组件监听这个事件

      • 把父组件把方法传入子组件中,在子组件里直接调用这个方法

        第一种使用this…$parent…父组件方法名

        //子组件
        <template>
          <div>
            子组件:
        	<button @click="Child"></button>
          </div>
        </template>
        <script>
          export default {
            data(){
                return{
                    msg:"我是子组件传过来的数据"
                }
            },
            methods:{
                child(){
                  this.$parent.clickChild()
                  //直接调用父组件的方法
                }
            }
          }
        </script>
        
        //父组件
        <template>
          <div>
            父组件:
            <input type="text" v-model="name" @click="clickChild">
          </div>
        </template>
        <script>
          import child from './child'
          export default {
            components: {
              child
            },
            data () {
              return {
                name: ''
              }
            },
              methods:{
                //父组件的方法
              	clickChild(e){
                    console.log(e)
                }
          }
          }
        </script>
        

        第二种$emit向父组件触发一个事件,父组件用于触发这个方法

        //子组件
        <template>
          <div>
            子组件:
        	<button @click="Child"></button>
          </div>
        </template>
        <script>
          export default {
            data(){
                return{
                    msg:"我是子组件传过来的数据"
                }
            },
            methods:{
                child(){
                  this.$emit("clickChild")
                }
            }
          }
        </script>
        
        //父组件
        <template>
          <div>
            父组件:
            <input type="text" v-model="name" @clickChild="clickChild">
          </div>
        </template>
        <script>
          import child from './child'
          export default {
            components: {
              child
            },
            data () {
              return {
                name: ''
              }
            },
            methods:{
              clickChild(e){
                //子组件调用的方法
                console.log(e)
              }
          }
          }
        </script>
        

        第三种 把父组件把方法传入子组件中,在子组件里直接调用这个方法

        //父组件
        <template>
          <div>
            父组件:
            <input type="text" v-model="name" :clickChild="clickChild">
          </div>
        </template>
        <script>
          import child from './child'
          export default {
            components: {
              child
            },
            data () {
              return {
                name: ''
              }
            },
            methods:{
              clickChild(e){
                console.log("我是父组件的方法")
              }
          }
          }
        </script>
        
        //子组件
        <template>
          <div>
            子组件:
        	<button @click="Child"></button>
          </div>
        </template>
        <script>
          export default {
            props:{
              clickChild:Function
            },
            data(){
              return{
              }
            },
            methods:{
                child(){
                  if(this.clickChild){
                    this.clickChild()
                  }
                }
            }
          }
        </script>
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值