当前位置: 首页 > news >正文

vue中用ref实现父子组件、孙组件、兄弟组件、非亲子孙组件互相调用的方法

无论是什么层级的组件之间互相调用,掌握好ref后都是万变不离其宗。来练练手吧


1.父子传:

父组件:

<template>
    <div>
        <Button @click="handleClick">点击调用子组件方法</Button>
        <Child ref="child"/>
    </div>
</template>    

<script>
import Child from './child';

export default {
    methods: {
        handleClick() {
              this.$refs.child.childFun();
        },
    },
}
</script>

子组件:

<template>
  <div>我是子组件</div>
</template>
<script>
export default {
  methods: {
    childFun() {
      console.log('我是子组件的方法');
    },
  },
};
</script>

2.父孙传:

父组件:

<template>
    <div>
        <Button @click="handleClick">点击调用孙组件方法</Button>
        <Child ref="child"/>
    </div>
</template>    

<script>
import Child from './child';

export default {
	components: {
    	Child 
  	},
    methods: {
        handleClick() {
               this.$refs.child.$refs.grandson.test() 
        },
    },
}
</script>

子组件:

<template>
  <div>我是子组件</div>
  <grandson ref='grandson'></grandson>
</template>
<script>
import grandson from './grandson';
export default {
    name: "child",
	components: {
    	grandson 
  	},
    methods: {
      childFun() {
        console.log('我是子组件的方法');
      },
    },
};
</script>

孙组件:

<template>
  <div></div>
</template>

<script>
export default {
  name: "grandson",
  methods:{
    test(){
      console.log('我是孙组件的方法')
    }
  }

}
</script>

3.父孙传2(复用性更高):

父组件:

<template>
    <div>
        <Button @click="handleClick">点击调用子组件方法</Button>
        <Child ref="child"/>
    </div>
</template>    

<script>
import Child from './child';

export default {
	components: {
    	Child 
  	},
    methods: {
        handleClick() {
        	this.$refs.child.test();
        },
    },
}
</script>

子组件:

<template>
  <div>我是子组件</div>
  <grandson ref='grandson'></grandson>
</template>
<script>
import grandson from './grandson';
export default {
    name: "child",
	components: {
    	grandson 
  	},
    methods: {
      childFun() {
    	console.log('我是子组件的方法');
      },
      test() {
      	this.$refs.grandson.test(); // 一层层调用到孙组件方法
      },
  },
};
</script>

孙组件:

<template>
  <div>我是孙组件</div>
</template>

<script>
export default {
  name: "grandson",
  methods:{
    test(){
      console.log('我是孙组件的方法')
    }
  }

}
</script>

4.兄弟传:

父组件:

<template>
    <child1 ref="child1Container"></child1>
    <child2 @order="order"></child2>
</template>
 
<script>
    import child1 from './components/child1';
    import child2 from './components/child2';
 
    export default {
        name: 'father',
        components: {
            child1,
            child2
        },
        methods: {
            order(){
                this.$refs.child1Container.say();
            }
        }
    }
 
</script>

子兄弟组件1:

<template>
    <div>我是子组件11111</div>
    <div @click="say"></div>
</template>
 
<script>
    export default {
        name: 'child1',
        methods: {
            say(){
                console.log('我是子组件1里面的方法");
            }
        }
    }
 
</script>

子兄弟组件2:

<template>
    <div>我是子组件22222</div>
    <div @click="orderBro">点击调用兄弟1组件方法</div>
</template>
 
<script>
    export default {
        name: 'child2',
        methods: {
            orderBro(){
                this.$emit('order');
            }
        }
    }
 
</script>

5.非亲子孙传:

父组件:

<template>
    <child1 ref="child1Container"></child1>
    <child2 @order="order"></child2>
</template>
 
<script>
    import child1 from './components/child1';
    import child2 from './components/child2';
 
    export default {
        name: 'father',
        components: {
            child1,
            child2
        },
        methods: {
            order(){
                this.$refs.child1Container.say();
            }
        }
    }
 
</script>

子兄弟组件1:

<template>
    <div>我是子组件11111</div>
    <grandson ref='grandson'></grandson>
</template>
 
<script>
    export default {
        name: 'child1',
        methods: {
            say(){
                this.$refs.grandson.say();
            }
        }
    }
 
</script>

子兄弟组件2:

<template>
    <div>我是子组件22222</div>
    <div @click="orderBroGrandson">点击调用兄弟1组件的孙组件方法</div>
</template>
 
<script>
    export default {
        name: 'child2',
        methods: {
            orderBroGrandson(){
                this.$emit('order');
            }
        }
    }
 
</script>

子兄弟组件1的子组件(孙组件):

<template>
  <div>我是子兄弟1组件的子组件(孙组件)</div>
</template>

<script>
export default {
  name: "grandson",
  methods:{
    say(){
      console.log('调用子兄弟组件1的子组件(孙组件)的方法')
    }
  }

}
</script>


ref真滴牛弊
THX~

相关文章:

  • 【信号去噪】基于鲸鱼算法优化VMD实现信号去噪附matlab代码
  • git开发分支管理
  • 啊哈,一道有趣的Go并发题
  • [编程题]数据库连接池 - 牛客网题解
  • 线性回归模型(OLS)3
  • 如何利用腾讯云轻量应用服务器五分钟搭建一个WordPress博客?
  • 从外到内理解c++引用
  • [极客大挑战 2019]BabySQL
  • vue3+vite+windicss+element-plus+axios+router+cookies 搭建
  • ElasticSearch docker 方式安装
  • Spring——IOC 操作 Bean 管理(FactoryBean,作用域以及bean生命周期)
  • java毕业设计成品源码网站基于javaWeb停车场车辆管理系统的设计与实现|车位
  • 【Python零基础入门篇 · 5】:占位符和格式化输入输出、标识符和保留字
  • L77.linux命令每日一练 -- 第11章 Linux系统管理命令 -- vmstat和mpstat
  • 如何安装GCC?
  • CSS 专业技巧
  • flutter的key在widget list的作用以及必要性
  • Git的一些常用操作
  • Gradle 5.0 正式版发布
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • IP路由与转发
  • jquery cookie
  • leetcode讲解--894. All Possible Full Binary Trees
  • use Google search engine
  • V4L2视频输入框架概述
  • v-if和v-for连用出现的问题
  • windows下如何用phpstorm同步测试服务器
  • 实现菜单下拉伸展折叠效果demo
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一些关于Rust在2019年的思考
  • 用 Swift 编写面向协议的视图
  • 怎么把视频里的音乐提取出来
  • 正则学习笔记
  • ​ubuntu下安装kvm虚拟机
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (算法)Game
  • (一)RocketMQ初步认识
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转) Android中ViewStub组件使用
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 依赖注入和配置系统
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .py文件应该怎样打开?
  • .sh
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [APIO2012] 派遣 dispatching