vue3组件传值方法

这篇具有很好参考价值的文章主要介绍了vue3组件传值方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

提示:vue组件传值学习用vue3语法


提示:以下是本篇文章正文内容,下面案例可供参考

一、父组件传值子组件接收

1.在父组件中引入子组件并通过components注册
父组件内容示例:
html 内容

<template>
  <div class="home">
    父组件
    <child :msg="msg"></child>
  </div>
</template>

js 内容
import child from "../components/Child/Child";

<script>
import { defineComponent, ref, computed } from "vue";
import child from "../components/Child/Child";
import { useRouter } from "vue-router";
export default defineComponent({
  name: "About",
  components: {
    child,
  },
  setup(props, ctx) {
    let msg = ref("这是父组件的值");

    let send = (value) => {
      console.log(value);
    };
    return {
      msg,
      send,
    };
  },
});
</script>

子组件内容示例
html 内容

<template>
  <div class="">
    这是子组件 父组件传地的值 {{ msg }}
  </div>
</template>

js 内容
props: { msg: { type: String, default: "", }, },;

<script>
import { defineComponent, ref, computed, onMounted } from "vue";
import { useRouter } from "vue-router";
export default defineComponent({
  name: "child",
  props: {
    msg: {
      type: String,
      default: "",
    },
  },
});
</script>

二、子组件传值父组件接收

子组件内容示例
html 内容

<template>
  <div class="">
    <button @click="send">子组件传给父组件</button>
  </div>
</template>

js 内容
setup(props, ctx)
ctx.emit("send", [childMsg.value, childNum.value]);

<script>
import { defineComponent, ref, computed, onMounted } from "vue";
import { useRouter } from "vue-router";
export default defineComponent({
  name: "child",
  props: {
    msg: {
      type: String,
      default: "",
    },
  },
  setup(props, ctx) {
    console.log(props.msg);

    let childMsg = ref("这是子组件传递给父组件");
    let childNum = ref(10);

    //    子组件  传父组件
    let send = () => {
      // 通过 ctx.emit 分发事件
      // emit 第一个参数是事件名称 第二个参数是传递数据
      // 传参方式
      // 数组形式   对象像是
      ctx.emit("send", [childMsg.value, childNum.value]);
      //    ctx.emit("send",{
      //     msg:childMsg.value,
      //     num:childNum.value
      //  })
    };

    onMounted(() => {
      //  ctx.emit("send",[childMsg.value,childNum.value])
      ctx.emit("send", {
        msg: childMsg.value,
        num: childNum.value,
      });
    });

    return {
      childMsg,
      childNum,
      send,
    };
  },
});
</script>

父组件内容示例:
html 内容
@send="send"

<template>
  <div class="home">
    父组件
    <child  @send="send"></child>
  </div>
</template>

js 内容
import child from "../components/Child/Child";

<script>
import { defineComponent, ref, computed } from "vue";
import child from "../components/Child/Child";
import { useRouter } from "vue-router";
export default defineComponent({
  name: "About",
  components: {
    child,
  },
  setup(props, ctx) {
    let send = (value) => {
      console.log(value);  //子组件传的值
    };
    return {
      send,
    };
  },
});
</script>

三、expose / ref

子组件可以通过 expose 暴露自身的方法和数据。
父组件通过 ref 获取到子组件并调用其方法或访问数据。

<!-- Parent.vue -->
<template>
  <div>父组件:拿到子组件的message数据:{{ msg }}</div>
  <button @click="childFun">调用子组件的方法</button>
  <hr />
  <Child ref="childRef" />
</template>
<!-- Parent.vue -->
<script setup>
import { ref, onMounted } from "vue";
import Child from "@/components/Child.vue";
const childRef = ref(null); // 通过 模板ref 绑定子组件
const msg = ref("");
onMounted(() => {
  // 在加载完成后,将子组件的 message 赋值给 msg
  msg.value = childRef.value.message;
});
function childFun() {
  // 调用子组件的 changeMessage 方法
  childRef.value.changeMessage("前端诡刺");
  // 重新将 子组件的message 赋值给 msg
  msg.value = childRef.value.message;
}
</script>
<!-- Child.vue -->
<template>
  <div>子组件:{{ message }}</div>
</template>
<!-- Parent.vue -->
<script setup>
import { ref } from "vue";
const message = ref("前端菜鸟");
function changeMessage(data) {
  message.value = data;
}
//使用 defineExpose 向外暴露指定的数据和方法
defineExpose({
  message,
  changeMessage,
});
</script>

四、v-model

可以支持多个数据双向绑定
父组件

<!-- Parent.vue -->
<template>
  <Child v-model:msg1="message1" v-model:msg2="message2" />
</template>
<!-- Parent.vue -->
<script setup>
import { ref } from "vue";
import Child from "@/components/Child.vue";
const message1 = ref("前端菜鸟1");
const message2 = ref("前端菜鸟2");
</script>

子组件

<!-- Child.vue -->
<template>
  <div><button @click="changeMsg1">修改msg1</button> {{ msg1 }}</div>
  <div><button @click="changeMsg2">修改msg2</button> {{ msg2 }}</div>
</template>
<!-- Child.vue -->
<script setup>
import { ref } from "vue";
// 接收
const props = defineProps({
  msg1: String,
  msg2: String,
});
const emit = defineEmits(["update:msg1", "update:msg2"]);
function changeMsg1() {
  emit("update:msg1", "前端诡刺1");
}
function changeMsg2() {
  emit("update:msg2", "前端诡刺2");
}
</script>

五、provide / inject

遇到多层传值时,使用 props 和 emit 的方式会显得比较笨拙。
这时就可以用 provide 和 inject 了。
provide 是在父组件里使用的,可以往下传值。
inject 是在子(后代)组件里使用的,可以往上取值。
无论组件层次结构有多深,父组件都可以作为其所有子组件的依赖提供者。
父组件

<!-- Parent.vue -->
<template>
  <Child></Child>
</template>
<!-- Parent.vue -->
<script setup>
import { ref, provide, readonly } from "vue";
import Child from "@/components/Child.vue";
const msg1 = ref("");
const msg2 = ref("前端菜鸟2");
// 使用readonly后子组件直接修改会发出警告,需要调用provide往下传的方法来修改
provide("msg1", readonly(msg1));
provide("msg2", msg2);
provide("changeName", (value) => {
  msg1.value = value;
});
</script>

子组件

<!-- Child.vue -->
<template>
  <div>
    <div>msg1: {{ msg1 }}</div>
    <div>msg2: {{ msg2 }}</div>
    <button @click="handleClick">修改</button>
  </div>
</template>
<!-- Child.vue -->
<script setup>
import { inject } from "vue";
const msg1 = inject("msg1", "默认值"); // 看看有没有值,没值的话就适用默认值。
const msg2 = inject("msg2");
const changeName = inject("changeName");
function handleClick() {
  // 这样写不合适,因为vue里推荐使用单向数据流,当父级使用readonly后,子元素直接修改会发出警告。
  // msg1.value = '前端诡刺1'
  // 正确的方式
  changeName("前端诡刺1");
  // 因为 msg2 没被 readonly 过,所以可以直接修改值
  msg2.value = "前端诡刺2";
}
</script>

六、mitt

Vue3 中没有了 EventBus 跨组件通信,但是现在有了一个替代的方案 mitt.js,原理还是 EventBus。
先安装 npm i mitt -S
然后像以前封装 bus 一样,封装一下。

//mitt.js
import mitt from 'mitt'
const mitt = mitt()
export default mitt
// 组件 A
<script setup>
import mitt from './mitt'
const handleClick = () => {
    mitt.emit('handleChange')
}
</script>

// 组件 B
<script setup>
import mitt from './mitt'
import { onUnmounted } from 'vue'
const someMethed = () => { ... }
mitt.on('handleChange',someMethed)
onUnmounted(()=>{
    mitt.off('handleChange',someMethed)
})
</script>

七、Vuex / pinia

pinia使用方法简易版文章来源地址https://www.toymoban.com/news/detail-467617.html

到了这里,关于vue3组件传值方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3中的组件传值的方式

    1. props 父组件使用 props 传递数据给子组件: 子组件使用 props 接收: 2. emit 自定义事件 子组件触发事件,父组件监听该事件并更新数据: 3. refs 通过 ref 给子组件绑定引用,然后通过该引用直接更新子组件的数据或调用子组件的方法: 在 child 组件中: 4. provide / inject 父组件提供数据

    2024年02月07日
    浏览(26)
  • vue3父组件异步props传值,子组件接收不到值问题

    当我们使用vue3进行开发在创建组件的时候,子组件经常需要调用父组件的数据,那么这是就需要vue3的props进行对父组件与子组件通信来达到传值的效果 在使用props进行父子组件通信时,子组件无法成功渲染数据,导致拿到数据为空问题 提示:这里填写问题的分析: 在使用

    2024年02月11日
    浏览(28)
  • vue3 使用 mitt 插件实现非父子组件传值

    介绍 : mitt 是一个 JavaScript 库,用于实现事件的订阅和发布 1、安装 2、新建 utils/eventBus.ts 文件 3、使用

    2024年02月09日
    浏览(41)
  • Vue3 setup tsx 子组件向父组件传值 emit

    需求: Vue3 setup 父组件向子组件传值,子组件接收父组件传入的值;子组件向父组件传值,父组件接收的子组件传递的值。 父组件: parent.tsx : 子组件: TotalPreview.tsx : 页面效果:

    2024年02月13日
    浏览(31)
  • watch监听,解决Vue3父组件异步props传值,子组件接收不到的问题

    写静态数据的时候父组件传值子组件接收并渲染是没问题的,但当父组件异步获取数据,子组件接收数据会晚于渲染,就会产生接收不到的问题,我在用echarts绘制图表时图表就直接不显示  用watch监听props数据并在watch内进行赋值操作可解决该问题 直接上代码 父组件,vue3语法

    2024年02月15日
    浏览(36)
  • vue3-setup语法糖 - 父子组件之间的传值

    近期学习 vue3 的父子组件之间的传值,发现跟vue2的并没有太大的区别,然后发现网络上很少基于setup语法糖的教程,我这边总结一下,希望对大家有所帮助。 父组件向子组件传值的时候,子组件是通过props来接收的,然后以变量的形式将props传递到setup语法糖果中使用(defin

    2024年02月11日
    浏览(35)
  • vue3实现父组件向子组件传值并监听props改变触发事件

    1. 父组件 向子组件 loginPhone 传递 tel 参数  phone 是在 reactive 定义的变量也可是是 ref 定义的变量 2. 子组件

    2024年02月05日
    浏览(30)
  • Vue3.2+TS的组件间的v-model传值

    组件之间的v-model,为什么可以v-model,大家可以去看看v-model的原理,然后就会发现这个方法一目了然。 父组件 子组件 假如子组件需要按照某个方法变化,那么可以自己定义,比如需要自增加50

    2024年02月13日
    浏览(38)
  • vue3中监听,组件通信如父子传值、Vuex、Event Bus的使用

    目录 一、监听 二、父子传值: 1、父传子: 2、子传父 三、全局状态管理(Vuex): 四、事件总线(Event Bus): 我们有一个父组件ParentComponent和一个子组件ChildComponent。在父组件中,我们使用:childProp=\\\"parentData\\\"将数据传递给子组件。在子组件中,我们使用defineProps来接收父组件

    2024年02月13日
    浏览(28)
  • VUE3传值相关六种方法

    目录 1.父传子(props)  2.子传父组件方法和值(emit)  3.子传父(v-model) 4.父组件调用子组件方法(ref) 5.VUEX 6.第六种爷孙传值provide / inject(官方并不建议未总结) VUE3父传子 1.将fatherToChild的值传递到index子组件之中并且在父组件中操作按钮子组件数据会跟随变化 2.引入vue的

    2024年02月03日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包