七种Vue3传值方式
props
emit
v-model
refs
provide/inject
eventBus
vuex/pinia(状态管理工具)

Props方式

Props方式是Vue中最常见的一种父传子的一种方式
父组件代码如下:

<template><child-components :list="list"></child-components><div><input v-model="value" type="text" placeholder="请输入"/><button @click="handleAdd" type="button">添加</button></div>
</template>
<script setup>
import { ref } from 'vue'
import ChildComponents from './child.vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
const a= ref('1')
// add 触发后的事件处理函数
const handleAdd = () => {list.value.push(a.value)
}
</script>

子组件只需要对父组件传递的值进行渲染即可,代码如下:

<template><ul ><li v-for="i in props.list" :key="i">{{ i }}</li></ul>
</template>
<script setup>
import { defineProps } from 'vue'
const props = defineProps({list: {type: Array,default: () => [],},
})
</script>

emit方式

emit方式也是Vue中最常见的组件通信方式,该方式用于子传父;

子组件代码如下:
<template><div ><input v-model="value" type="text" placeholder="请输入"/><button @click="handleSubmit" type="button">添加</button></div>
</template>
<script setup>
import { ref, defineEmits } from 'vue'
const a= ref('1')
const emits = defineEmits(['add'])
const handleSubmit = () => {emits('add', a.value)a.value = ''
}
</script>
在子组件中点击【添加】按钮后,emit一个自定义事件,并将添加的值作为参数传递。

父组件代码如下:

<template><ul><li v-for="i in list" :key="i">{{ i }}</li></ul><child-components @add="handleAdd"></child-components>
</template>
<script setup>
import { ref } from 'vue'
import ChildComponents from './child.vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
// add 触发后的事件处理函数
const handleAdd = value => {list.value.push(value)
}
</script>

在父组件中只需要监听子组件自定义的事件,然后执行对应的添加操作。

v-model

v-model是Vue中一个比较出色的语法糖,就比如下面这段代码

<ChildComponent v-model:title="pageTitle" />
// 就是下面这段代码的简写形势
<ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />

子组件

<template><div><input v-model="value" placeholder="请输入"/><button @click="handleAdd" type="button">添加</button></div>
</template>
<script setup>
import { ref, defineEmits, defineProps } from 'vue'
const value = ref('')
const props = defineProps({list: {type: Array,default: () => [],},
})
const emits = defineEmits(['update:list'])
// 添加操作
const handleAdd = () => {const arr = props.listarr.push(value.value)emits('update:list', arr)value.value = ''
}
</script>

在子组件中我们首先定义props和emits,然后添加完成之后emit指定事件。
注:update:*是Vue中的固定写法,*表示props中的某个属性名。

父组件中使用就比较简单,代码如下:
<template><!-- 父组件 --><ul ><li  v-for="i in list" :key="i">{{ i }}</li></ul><!-- 子组件 --><child-components v-model:list="list"></child-components>
</template>
<script setup>
import { ref } from 'vue'
import ChildComponents from './child.vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
</script>

refs

在使用选项式API时,我们可以通过this.$refs.name的方式获取指定元素或者组件,但是组合式API中就无法使用哪种方式获取。如果我们想要通过ref的方式获取组件或者元素,需要定义一个同名的Ref对象,在组件挂载后就可以访问了。

<template><ul><li v-for="i in childRefs?.list" :key="i">{{ i }}</li></ul><!-- 子组件 ref的值与<script>中的保持一致 --><child-components ref="childRefs"></child-components><!-- 父组件 -->
</template>
<script setup>
import { ref } from 'vue'
import ChildComponents from './child.vue'
const childRefs = ref(null)
</script>

子组件

<template><div><input v-model="value" placeholder="请输入"/><button @click="handleAdd" type="button">添加</button></div>
</template>
<script setup>
import { ref, defineExpose } from 'vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
const a= ref('1')
// add 触发后的事件处理函数
const handleAdd = () => {list.value.push(a.value)a.value = ''
}
defineExpose({ list })
</script>

setup组件默认是关闭的,也即通过模板ref获取到的组件的公开实例,不会暴露任何在**

provide/inject

provide和inject是Vue中提供的一对API,该API可以实现父组件向子组件传递数据,无论层级有多深,都可以通过这对API实现。示例代码如下所示:

父组件

<template><!-- 子组件 --><child-components></child-components><!-- 父组件 --><div><input v-model="value" placeholder="请输入"/><button @click="handleAdd" type="button">添加</button></div>
</template>
<script setup>
import { ref, provide } from 'vue'
import ChildComponents from './child.vue'
const list = ref(['JavaScript', 'HTML', 'CSS'])
const a= ref('')
// 向子组件提供数据
provide('list', list.value)
// add 触发后的事件处理函数
const handleAdd = () => {list.value.push(a.value)a.value = ''
}
</script>

子组件

<template><ul ><li v-for="i in list" :key="i">{{ i }}</li></ul>
</template>
<script setup>
import { inject } from 'vue'
// 接受父组件提供的数据
const list = inject('list')
</script>

使用provide进行数据传递时,尽量readonly进行数据包装,避免子组件修改父级传递过去的数据。

事件总线

Vue3中移除了事件总线,但是可以借助于第三方工具来完成,Vue官方推荐mitt[2]或tiny-emitter[3]

状态管理工具

Vuex[4]和Pinia[5]可以轻松实现组件通信,由于这两个工具功能比较强大,具体可以查阅文档

七种Vue3传值方式相关推荐

  1. 函数传参string_C/C++的三种函数传值方式及其区别

    C/C++函数传参方式我想很多朋友应该都知道,但是不同传参方式的背后他们的区别是什么我想很多人并不那么清楚.本文就给大家揭露一下各传参方式的区别. 传参方式有这三种:值传递.引用传递.指针传递 大家可 ...

  2. 【Python教程】七种创建对象的方式,你知道几种?

    Python语言提供了多种创建对象的方式,这里列出其中方式,比如下面有一个类: class Bar:def __init__(self,x):print(x)self.x=x 方式一: 传统方式构建, ...

  3. CSS七种常用居中方式

    1. 水平居中 效果: <!DOCTYPE html> <html lang="en"><head><title>水平居中</ ...

  4. JavaScript中七种函数调用方式及对应 this 的含义

    http://blog.sina.com.cn/s/blog_621f1e120100rj21.html this 在 JavaScript 开发中占有相当重要的地位,不过很多人对this这个东西都感 ...

  5. Vue.js 定义组件模板的七种方式

    转载自  Vue.js 定义组件模板的七种方式 在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式): 字符串 模板字面量 x-template 内联模板 render ...

  6. 【数据库视频】七种连接方式

    数据表的查询与管理只是针对数据库中的一个表格进行的查询管理,如果现在我们想要同时的看到两个数据表中的数据的或,需要怎么实现?答案是:使用多连接的方式进行查询 标题中说了SQL中有七种连接的方式,那么具 ...

  7. iOS 页面间几种传值方式(属性,代理,block,单例,通知)

    第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...

  8. JavaScript七种非常经典的创建对象方式

    JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产.接下来介绍七种非常经典的创建对象的方式,他们也 ...

  9. MFC对话框控件访问的七种方式

    void CTestDlg::OnButtonAdd() {// TODO: Add your control notification handler code here//动态创建按钮 /* if ...

最新文章

  1. postmaster.c 中的 ListenAddresses
  2. Objective-C总Runtime的那点事儿(一)消息机制
  3. SQL Error: 957, SQLState: 42000 ORA-00957: duplicate column name
  4. 串口 驱动 热敏打印机_热敏纸标签打印不出来文字 是因为……
  5. HTTP Status 500 - 问题
  6. 数据库创建时间,更新时间设计
  7. Matplotlib库入门
  8. 理解insert all/insert first的使用
  9. 获取电脑上连接的USB打印机
  10. [137]win10想开测试模式,提示“设置元素数据时出错
  11. win7怎样在线升级到win10 win7直接升级win10详细教程
  12. Frequency Estimation
  13. Diego1# 机器视觉 -AR标签跟随
  14. 2022-2028全球及中国电动直线执行器行业研究及十四五规划分析报告
  15. 线性回归中的最小二乘法和梯度下降法比较
  16. 新算法可干扰脸部识别系统
  17. 【交换篇】(6.4) ❀ 01. HA 状态下的核心交换机连接方法 (上) ❀ FortiSwitch 交换机
  18. srm32f4按键蜂鸣器_STM32F407通过按键控制LED和蜂鸣器
  19. 二年级的女儿用计算机算算术,二年级数学 | 关于计算,学而思老师这样说...
  20. 黑马程序员——UI基础纪要

热门文章

  1. QT关于使用MSVC之后,之前用MGW编译代码,用这个GDB调试器出现error
  2. Catch Me If You ... Can't Do Otherwise--转载
  3. Java Math 类中的新功能--浮点数
  4. Hudson-ci/Using Hudson/Installing Hudson/Installing Hudson RPM--官方文档
  5. 【机器翻译】transformer
  6. 专访格灵深瞳CTO赵勇:为 计算机视觉 赋予智慧的光芒
  7. 让餐厅放心的云服务-雅座CRM技术解密
  8. 白话Elasticsearch05- 结构化搜索之使用range query来进行范围过滤
  9. 白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化
  10. ngrok-外网访问内网工具NGROK的使用