首页 > 其他分享 >vue3传值

vue3传值

时间:2022-12-27 15:15:01浏览次数:37  
标签:FatherClick 调用 const handelClick vue3 组件 ref 传值

https://blog.csdn.net/H_114/article/details/122420402?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-122420402-blog-124122242.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-122420402-blog-124122242.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=1

tips:关于组件传值大同小异,如果需要可以访问我的另一篇博客

vue3+ts+vite项目三种形式父子组件传值的方法(setup(){}、script-setup语法糖、provide和inject)_H_114的博客-CSDN博客

一、常规方式(setup(){}写法)
1.父组件调用子组件内部的方法
父组件--编写环境携带Typescript没有使用的小伙伴可以忽略....

<template>
  <div>
    我是父组件
    <button @click="FatherClick">父组件按钮</button>
    <div>----------华丽的分割线-----------</div>
    <Childs ref="childsDom"></Childs>
  </div>
</template>
 
<script lang="ts">
import Childs from "./childs.vue";
import { ref } from "vue";
export default {
  name: "",
  components: { Childs },
  setup(props, context) {
    const childsDom: any = ref(null);
    const FatherClick = () => {
      childsDom.value.handelClick();
      console.log(childsDom.value);
    };
    return {
      FatherClick,
      childsDom,
    };
  },
};
</script>
 
<style scoped></style>
子组件

<template>
  <div>
    <button>我是子组件按钮</button>
  </div>
</template>
 
<script lang="ts">
export default {
  setup() {
    const handelClick = () => {
      console.log("@子组件----我被调用了");
    };
    return {
      handelClick,
    };
  },
};
</script>
 
<style scoped></style>
观看控制台我们可以获取到Childs的DOM节点并且展开能够看见我们在子组件内部定义的方法,那我们就可以调用他,关于获取DOM需要注意放在合适的生命周期当中避免获取不到该DOM节点

 总结:父组件调用子组件用到的是ref绑定获取DOM节点从而来调用,需要注意的两个点是1.注意ref获取要在合适的生命周期当中(等到DOM加载完成获取)2.事件方法必须要return出去否则无法在实例上找到方法

2.子组件调用父组件内部的方法
父组件

<template>
  <div>
    我是父组件
    <button>父组件按钮</button>
    <div>----------华丽的分割线-----------</div>
    <Childs @FatherClick="FatherClick"></Childs>
  </div>
</template>
 
<script lang="ts">
import Childs from "./childs.vue";
import { ref } from "vue";
export default {
  name: "",
  components: { Childs },
  setup(props, context) {
    const FatherClick = () => {
      console.log('@父组件----我被调用了');
    };
    return {
      FatherClick,
    };
  },
};
</script>
 
<style scoped></style>
子组件

<template>
  <div>
    <button @click="handelClick">我是子组件按钮</button>
  </div>
</template>
 
<script lang="ts">
export default {
  emits: ["FatherClick"],
  setup(props, context) {
    const handelClick = () => {
      context.emit("FatherClick");
    };
    return {
      handelClick,
    };
  },
};
</script>
 
<style scoped></style>
 观看控制台得到结果

 总结:子组件调用父组件用到的方法是context,需要注意的是:1.方法需要被emits接收否则无法调用2.方法需要return出去

二、语法糖写法<script setup></script>
1.父组件调用子组件内部的方法
父组件

<template>
  <div>
    我是父组件
    <button @click="FatherClick">父组件按钮</button>
    <div>----------华丽的分割线-----------</div>
    <Childs ref="ChildsDom"></Childs>
  </div>
</template>
 
<script setup lang="ts">
import Childs from "./childs.vue";
import { ref } from "vue";
const ChildsDom: any = ref(null);
const FatherClick = () => {
  ChildsDom.value.handelClick();
  console.log(ChildsDom.value);
};
</script>
 
<style scoped></style>
子组件

<template>
  <div>
    <button>我是子组件按钮</button>
  </div>
</template>
 
<script setup lang="ts">
const handelClick = () => {
  console.log("@子组件----我被调用了");
};
defineExpose({
  handelClick,
});
</script>
 
<style scoped></style>
通过控制台我们可以看见调用成功了并且在ChildsDom这个节点身上有handelClick方法的存在 



总结:语法糖模式唯一一点需要注意的是要用defineExpose将我们的函数暴露出去否则我们在实例上无法获得该方法

2.子组件调用父组件内部的方法
父组件

<template>
  <div>
    我是父组件
    <button>父组件按钮</button>
    <div>----------华丽的分割线-----------</div>
    <Childs @FatherClick="FatherClick"></Childs>
  </div>
</template>
 
<script setup lang="ts">
import Childs from "./childs.vue";
import { ref } from "vue";
const ChildsDom: any = ref(null);
const FatherClick = () => {
  console.log("@父组件----我被调用了");
};
</script>
 
<style scoped></style>

子组件

<template>
  <div>
    <button @click="handelClick">我是子组件按钮</button>
  </div>
</template>
 
<script setup lang="ts">
const emits = defineEmits(["FatherClick"]);
const handelClick = () => {
  emits("FatherClick");
};
</script>
 
<style scoped></style>
 总结:语法糖模式需要注意在子组件内也需要emits去接收否则无法调用,个人比较喜欢语法糖,写起来真是快捷又方便....如有错误欢迎指正互相学习,如果觉得有用就留个赞再走吧~
————————————————
版权声明:本文为CSDN博主「Beast_H」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/H_114/article/details/122420402

 

标签:FatherClick,调用,const,handelClick,vue3,组件,ref,传值
From: https://www.cnblogs.com/ylblogs/p/17008089.html

相关文章

  • 【Vue2.0与Vue3.0区别总结】
    vue2.0和vue3.0区别结构部分程序主入口文件main.jsvue2.0vue3.0-暴露出createApp方法组件语法部分(vue3.0主要针对api的优化,vue3.0兼容vue2.0写法)vue3.0使用​​组......
  • Vue3之watch
     watch监视ref函数<template><h2>当前求和为:{{sum}}</h2><button@click="sum++">点我+1</button><hr><h2>当前的信息为:{{msg}}</h2><button......
  • Vue3之computed计算属性
    计算属性  computed函数与Vue2.x中computed配置功能一致写法<template><h1>一个人的信息</h1>姓:<inputtype="text"v-model="person.firstName">......
  • vue3_05使用reactive来处理复杂数据
    vue3中除了提供了ref函数以为还提供了reactive函数来操作数据,一般情况下我们使用ref函数来操作简单类型数据,reactive函数来操作复杂类型数据<template><div>{{objRet.na......
  • vue3_03ref操作复杂类型
    ref也可以将复杂类型的数据转换为响应式数据,使用方法和处理简单类型数据一样leta=ref(复杂类型数据)a.value.xxx<template><p>{{objref.num}}</p><button@c......
  • vue3_04ref获取标签
    ref也可以用来获取dom节点分为三步:1.给节点绑定ref='xxx'2.letxxx=ref()3.在挂载之后直接使用即可<template><divref="op">24</div><p>{{num}}</p>......
  • vue3中使用vuex
    一、使用习惯1(模块化):1、文件目录:2、userStore.tsimport{Module}from'vuex';//import{setStorage,getStorage}from"../../util/common";exportdefault{......
  • vue3_02ref操作简单类型
    vue3中提供了ref()函数可以把数据转换为响应式数据。<template><div>{{num}}</div><button@click="add">这是按钮</button></template><sc......
  • Vue3之setup的两个注意点
    setup的两个注意点setup执行的时机在beforeCreate之前执行一次,this是undefined。setup的参数props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。......
  • 关于Vue3 can not find module的报错
    最近在做Vue3项目的时候,会看到这样一个报错,找不到模块.vue文件,可能是ts文件无法识别vue后缀的文件导致的,上网搜索了一下发现尤大大给出了解决方案。在src目录下新建一个.......