vue组件之间传值的几种方式

2023-11-20

vue组件传值

在这里插入图片描述

父传子

父组件

<child :childMsg="parentMsg"></child>
data(){
	return{
		//父组件的数据
		parentMsg:'父组件将要给子组件的数据'
	}
}

子组件(Child)

<p>{{childMsg}}</p>
props:{
	childMsg:{
		type:String,  //类型可以定义
		default:''  //默认是空值
	}
},
//或者直接props:['childMsg'],这种写法也行
mounted() {
    console.log(this.childMsg);//获取过来的直接当作data数据的用法来用
},

子传父

根据业务选择方式,这边列举三种当然还有其他的
方法一:$emit
方法二:$children/$parent
方法二:$refs

一:
子组件(mChild)

<button @click="childFn">
data(){
	return {
		pushParent:'即将要给父组件的值'
	}
}
methods:{
	childFn(){
		//第一个参数自定义事件名,第二个是数据
		this.$emit("childFnGetParent",pushParent)
	}
}

父组件

<p>{{msg}}</p>
<m-child @childFnGetParent="parentFn"></m-child>
data(){
	return {
		mag:''
	}
}
methods:{
	parentFn(val){
		this.msg=val
	}
}

二:
父传子第二种方法($children/ $parent)

这种方法就不多解释了,挺容易理解的,实在不理解可以打印this. c h i l d r e n / t h i s . children/this. children/this.parent 就可以获取到相关组件信息
在这里插入图片描述
在这里插入图片描述

三:
父传子的第三种方法(ref)
在父组件中的子组件m-child中添加一个ref=“事件名“,同样可以获取到i相关组件信息
在这里插入图片描述

非父子组件传值

provide 和 inject 传值

用于祖先与后代传值

简单贴张图
在这里插入图片描述

事件总线传值

传值思想其实是一致的,先使用$on定义一个全局事件,后面写个回调函数,触发这个事件执行的方法,可以接参数bus.$on('msg',val=>{ }),msg就是全局事件,然后在想要获取这个全局事件里面的值就调用他,不过这时候不是 this. e m i t 而是 b u s . emit 而是 bus. emit而是bus.emit

  • 事件总线
    首先创建一个公共文件夹 util
    其次在创建一个js文件 例如bus.js

事件主线bus.js下面的代码

import Vue from 'vue'
export default new Vue() //创建一个实例对象

这是两个组件传值,在互相传值各组件中引入bus.js文件
import bus from "../bus.js"
在A组件中通过$emit调用自定义函数并且传参

<template>
  <div>
    A组件:
    <span>{{elementValue}}</span>
    <input type="button" value="点击触发" @click="elementByValue">
  </div>
</template>
<script>
  // 引入公共的bug,来做为中间传达的工具
  import Bus from './bus.js'
  export default {
    data () {
      return {
        elementValue: 4
      }
    },
    methods: {
      elementByValue: function () {
        Bus.$emit('val', this.elementValue),//注册时间相当于你创建的实例对象 vm.$emit注册事件并传值
      }
    }
  }
</script>

B组件 用$on事件来接收参数

<template>
  <div>
    B组件:
    <input type="button" value="点击触发" @click="getData">
    <span>{{name}}</span>
  </div>
</template>
<script>
  import Bus from './bus.js'
  export default {
    data () {
      return {
        name: 0
      }
    },
    mounted: function () {
      var vm = this
      // 用$on事件来接收参数
      Bus.$on('val', (data) => {
        console.log(data)
        this.name = data
      })
    },
    methods: {
      getData: function () {
        this.name++
      }
    }
  }
</script>

全局组件传值,单个组件调用

然后在所有需要用到这个文件下面的数据只需要导入这个文件就行

APP.vue下面定义一个方法

//全局中定义的方法名
methods:{
	passMsg(){
	//注意这里的写法 
		bus.$emit('msg','要传入的数数据')//自定义事件都用emit
	}
}
//子组件利用勾子函数监听事件
mounted(){
	bus.$on('msg',(val)=>{
		
	})
}
注意的是 在页面销毁的时候需要吧bus销毁掉
 destroyed() {
    bus.$off("child2", this.destroyedMessage);
  }
  • $ attrs / listeners
    解决多级组件间传值的问题

attrs listeners

App.vue下面定义数据并且把想要的数据全部绑定到相应的子组件上面
然后在在其父组件上面绑定一个v-bind=‘$attrs’ 注意这里不能简写,如果本身有的数据跟vue的数据名相同时,他会自动过滤

v-bind="$attrs" v-on="$listeners"v-bind=" a t t r s " 监听数据 v − o n = " attrs" 监听数据 v-on=" attrs"监听数据von="listeners 监听事件
最外层的组件

  <Bro sex="男" name="xxx" @handleChange="getName"></Bro>

下一层的组件

  <Son v-bind="$attrs" v-on="$listeners"></Son>//必须要这样写不能改变

获取数据的组件

export default {
    components: { Last },
    mounted() {
        console.log(this.$attrs);
    }
}

在这里插入图片描述
如果还要把这个数据往下传就是组件继续v-bind="$attrs"往下传

 <Last v-bind="$attrs"></Last>

另外他的这种传值方式都是使用props传的只是用了一个组件过度,其实还有另外一种写法就是使用props的

最外层组件

 <Bro sex="男" name="xxx" @handleChange="getName"></Bro>

下一级组件

  <Son v-bind="$attrs" v-on="$listeners" :dataMsg="dataMsg"></Son>

最里面的组件,不仅可以使用props拿到上级的还可以拿到上上级的

在这里插入图片描述


其中还有inheritAttrs 的用法 默认是true,就是讲数据绑定在组件上,自己去研究
在这里插入图片描述

使用$attrs $listeners 进行子往上级传

逻辑过于简单,直接贴图自己实践
最里面组件

在这里插入图片描述
中间的组件都需要添加v-bind="$attrs" v-on="$listeners",不管中间有多少层

<Son v-bind="$attrs" v-on="$listeners" :dataMsg="dataMsg"></Son>

最外层
在这里插入图片描述

vueX

由于不是本篇讨论的东西,里面东西太多不过多展示有兴趣可以看下这个vuex的使用

剩下的还有路由传值,本地缓存等等这些都属于基础传值,自己去了解这里就这哪是先介绍这么多

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue组件之间传值的几种方式 的相关文章

  • javascript 中对象的“异步”循环

    通常 我们可以对数组和对象进行循环来迭代属性 值 但循环是阻塞的 但是 超时可用于模拟异步循环 我设法为数组做到了这一点 http jsfiddle net LHhy2 do stuff function asyncLoop i do st
  • 滚动时输入自动完成位置错误(chrome)

    我在输入文本的默认自动完成功能方面遇到了一些麻烦 滚动时它不会相应移动 我希望自动完成文本保留在输入的正下方 有办法做到这一点吗 我在 Chrome 浏览器版本 57 0 2987 133 中发生这种情况 fiddle https jsfi
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • 仅单击 div 内部

    我正在为一个小网站制作教程 我只想让教程气泡可点击 因此 当我们尝试单击气泡之外的某些内容时 什么也不会发生 换句话说 我希望我的 html 不可点击 而 tutorial bubble 可点击 尝试这个 jQuery function h
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • 有没有办法将变量从 javascript 导入到 sass 或反之亦然?

    我正在制作一个依赖于块概念的 CSS 网格系统 所以我有一个基本文件 例如 max columns 4 block width 220px block height 150px block margin 10px 它被 mixin 使用 m
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • jQM / jquery-collagePlus 使用问题

    我正在使用 jQM 构建应用程序 并且尝试使用 jquery collagePlus http ed lea github io jquery collagePlus http ed lea github io jquery collage
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • Firebase 警告:使用 Firebase Cloud Function 搜索数据时使用未指定的索引

    我构建了一个 Firebase 云函数 用于查找 IsNotificationEnabled 值等于 true 的用户 我的部分职能 export const sendPushNotification functions https onR
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • mozilla pdf.js 没有全视图

    我喜欢这个 pdf 查看器https github com mozilla pdf js https github com mozilla pdf js Demo http mozilla github com pdf js web vie
  • 如何使用 jQuery 或 JavaScript 聚焦 或 标签?

    for var i 0 i
  • Flowtype 属性“msg”缺失为 null 或未定义

    我发现 Flow 很难用 我明白那个Array find可以返回或未定义 因此 通过阅读以下内容 github Array find on Array 引发 https github com facebook flow issues 351
  • 使用 JQuery 根据下拉列表选择的值显示/隐藏控件

    我正在尝试使用 JQuery 根据下拉菜单的选定索引显示 隐藏 div 标签 但它不起作用 任何帮助将不胜感激 Thanks
  • 无法使用 HTML 设置未定义 jQuery UI 自动完成的属性“_renderItem”

    我使用以下代码将 jQuery UI 自动完成项呈现为 HTML 这些项目在自动完成控件中正确呈现 但我不断收到此 JavaScript 错误并且无法移动过去 Firefox 无法转换 JavaScript 参数 Chrome 无法设置未定

随机推荐