深入了解Vue3组件传值方式

 更新时间:2022年07月09日 14:08:09   作者:ed。  
学习过 vue2 的宝子们肯定知道,组件传值是 vue 项目开发过程中必不可少的功能场景,在 vue2 里面有很多传值的方式。今天就来和大家讲讲Vue3的组件传值方式,需要的可以参考一下

今天说一下 vue3 的组件间传值,学习过 vue2 的宝子们肯定知道,组件传值是 vue 项目开发过程中必不可少的功能场景,在 vue2 里面有很多传值的方式,vue3 的传值方式呢,在这里稍微整理总结一下,但是不是很全,后期可能慢慢补充。

父子组件传值 props

和 vue2 一样,vue3 也可以使用 props 进行父组件传值给子组件,这个就不多说了直接上代码。

父组件

<template>
  <div>
    <div class="father">
      <h1>这是父组件</h1>
      <h2>父组件的名字:{{boy.name}}</h2>
    </div>
    <hello-world :msg="msg" :boy="boy" @change="btn"></hello-world>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

import { ref, reactive } from "vue";

export default {
  name: "App",
  components: {
    HelloWorld
  },
  setup() {
    const boy = reactive({
      name: "我是𝒆𝒅.",
      age: 10
    });
    const msg = ref("这是一条信息");

    const btn = val => {
      console.log(val);
      alert(val);
    };

    return { boy, msg, btn };
  }
};
</script>

<style scoped>
.father {
  background-color: aquamarine;
}
</style>

子组件

<template>
  <div class="son">
    <h1>这是子组件</h1>
    <h2>这是父组件传进的数据: {{msg}}</h2>
    <h2>这是父组件传进的数据: {{boy.name}}</h2>
    <button @click="btn">传给父组件数据</button>
  </div>
</template>

<script>
import { toRefs } from "vue";
export default {
  name: "HelloWorld",
  props: {
    msg: String,
    boy: Object
  },
  setup(props, { emit }) {
    console.log(props);
    const p = toRefs(props);
    const msg = p.msg;
    const boy = p.boy;

    const btn = () => {
      const news = "我是子组件传进的值";
      emit("change", news);
    };

    return { msg, boy, btn };
  }
};
</script>

<style scoped>
.son {
  background-color: bisque;
}
</style>

保存查看效果。

上面就是 props 传值的基本用法。

祖孙组件传值 provide 和 inject

这个其实和 vue2 的写法是一模一样的。

直接上代码!!

父组件

<template>
  <div>
    <div class="father">
      <h1>这是父组件</h1>
      <h2>名字:{{boy.name}}</h2>
      <h2>年龄:{{boy.age}}</h2>
    </div>
    <hello-world></hello-world>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

import { reactive, provide } from "vue";

export default {
  name: "App",
  components: {
    HelloWorld
  },
  setup() {
    const boy = reactive({
      name: "我是𝒆𝒅.",
      age: 10
    });

    provide("boy", boy); // 往子孙组件传值

    return { boy };
  }
};
</script>

<style scoped>
.father {
  background-color: aquamarine;
}
</style>

子组件

<template>
  <div class="son">
    <h1>这是子组件</h1>
    <h2>这是父组件传进的数据: {{boy.name}}</h2>
    <h2>这是父组件传进的数据: {{boy.age}}</h2>
  </div>
</template>

<script>
import { toRefs, inject } from "vue";
export default {
  name: "HelloWorld",
  setup() {
    const boy = inject("boy"); // 子孙组件接收值
    return { boy };
  }
};
</script>

<style scoped>
.son {
  background-color: bisque;
}
</style>

刷新看一下效果。

好的,我们可以看到子组件可以顺利拿到父组件传进来的数据值。

父组件中点击按钮向子组件传值

就是使用 ref 来获取dom 然后操作里面的参数和方法。

父组件

<template>
  <div>
    <div class="father">
      <h1>这是父组件</h1>
      <h2>名字:{{boy.name}}</h2>
      <h2>年龄:{{boy.age}}</h2>
      <button @click="btn">传值</button>
    </div>
    <hello-world ref="hello" style="color: red"></hello-world>
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

import { reactive, ref } from "vue";

export default {
  name: "App",
  components: {
    HelloWorld
  },
  setup() {
    const boy = reactive({
      name: "我是𝒆𝒅.",
      age: 10
    });

    const hello = ref();

    function btn() {
      hello.value.init(boy); // 调用子组件的方法,把boy对象传进去
    }

    return { boy, btn, hello };
  }
};
</script>

<style scoped>
.father {
  background-color: aquamarine;
}
</style>

子组件

<template>
  <div class="son">
    <h1>这是子组件</h1>
    <h2>这是父组件传进的数据: {{boy.name}}</h2>
    <h2>这是父组件传进的数据: {{boy.age}}</h2>
  </div>
</template>

<script>
import { reactive, toRefs } from "vue";
export default {
  name: "HelloWorld",
  setup() {
    let boy = reactive({
      name: "ed.",
      age: 11
    });

    // 提供给父组件调用的方法
    const init = val => {
      boy.name = val.name;
      boy.age = val.age;
    };

    return { init, boy };
  }
};
</script>

<style scoped>
.son {
  background-color: bisque;
}
</style>

以上就是深入了解Vue3组件传值方式的详细内容,更多关于Vue3组件传值的资料请关注脚本之家其它相关文章!

相关文章

  • vue 页面刷新、重置、更新页面所有数据的示例代码

    vue 页面刷新、重置、更新页面所有数据的示例代码

    Vue.js提供了多种方式来实现页面刷新、重置和更新页面所有数据的功能,下面通过示例代码演示vue 页面刷新、重置、更新页面所有数据,感兴趣的朋友跟随小编一起看看吧
    2024-01-01
  • Vue组件通信入门之Provide和Inject机制

    Vue组件通信入门之Provide和Inject机制

    这篇文章主要给大家介绍了关于Vue组件通信入门之Provide和Inject机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Vue组件通信具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • cdn模式下vue的基本用法详解

    cdn模式下vue的基本用法详解

    这篇文章主要介绍了cdn模式下vue的基本用法,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-10-10
  • 基于vue+openlayer实现地图聚合和撒点效果

    基于vue+openlayer实现地图聚合和撒点效果

    Openlayers 是一个模块化、高性能并且功能丰富的WebGIS客户端的JavaScript包,用于显示地图及空间数据,并与之进行交互,具有灵活的扩展机制,本文给大家介绍vue+openlayer实现地图聚合效果和撒点效果,感兴趣的朋友一起看看吧
    2021-09-09
  • vue实现点击选中,其他的不选中方法

    vue实现点击选中,其他的不选中方法

    今天小编就为大家分享一篇vue实现点击选中,其他的不选中方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue的状态管理模式vuex

    vue的状态管理模式vuex

    本篇文章主要介绍了深入理解vue的状态管理模式vuex,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Vue使用echarts绘制柱状图和折线图

    Vue使用echarts绘制柱状图和折线图

    这篇文章主要为大家学习介绍了Vue如何使用echarts绘制柱状图和折线图,文中有详细的示例代码,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • vue和webpack项目构建过程常用的npm命令详解

    vue和webpack项目构建过程常用的npm命令详解

    本文通过实例代码给大家介绍了vue和webpack项目构建过程常用的npm命令,需要的朋友可以参考下
    2018-06-06
  • vue绑定数字类型 value为数字的实例

    vue绑定数字类型 value为数字的实例

    这篇文章主要介绍了vue绑定数字类型 value为数字的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue如何根据条件判断按钮是否可以点击

    vue如何根据条件判断按钮是否可以点击

    这篇文章主要介绍了vue如何根据条件判断按钮是否可以点击,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04

最新评论