vue组件间参数传递的方法,vuex组件之间传值

  vue组件间参数传递的方法,vuex组件之间传值

  本文主要介绍vue组件之间传递值的方式。对vue感兴趣的同学可以参考一下。

  

目录

  概述1。父组件将该值传输给子组件2。子组件将该值传输给父组件1。子组件绑定一个事件,并由此触发。$emit () 2。回调函数3。组件实例由$parent/$children或$refs 3访问。该值在兄弟1之间传输。或者$emit和props 2的组合。

  

概述

  我们都知道Vue是一个轻量级的前端框架,其核心是组件开发。Vue是由一个个组件组成的,组件化是它的本质,也是最强大的功能之一。然而,组件实例的范围是相互独立的,这意味着不同组件之间的数据不能相互引用。

  但是在实际的项目开发过程中,我们需要访问其他组件的数据,所以就有了组件通信的问题。在vue中,组件之间的关系是:父亲、儿子、兄弟和代。根据不同的关系,如何实现数据传输是我们接下来要讲的。

  

一、父组件向子组件传值

  即父组件通过属性的方式将值传递给子组件,子组件通过props接收。

  在父组件的子组件标签中绑定自定义属性。

  //父组件

  用户详细信息:myName=name /

  导出默认值{

  组件:{

  用户详细信息

  }

  .

  }

  使用props(可以是数组或对象)在子组件中接收它。您可以传递多个属性。

  //子组件

  导出默认值{

  道具:[我的名字]

  }

  /*

  Props: {myName: String} //这个指定传入的类型,如果类型不对会发出警告。

  道具:{我的名字:[字符串,数字]}//多种可能的类型

  prosp:{我的名字:{type: string,requires:true } }//必选string

  道具:{

  childMsg: {

  类型:数组,

  默认值:()=[]

  }

  } //default指定默认值。

  如果道具验证失败,控制台会发出警告。

  */

  子组件接收到的父组件的值分为两种类型:引用类型和公共类型:

  常见类型:字符串、数字、布尔、空。

  引用类型:数组、对象

  基于vue的单向数据流,即组件之间的数据单向流动,不允许子组件直接修改父组件传递的值,所以要避免这种直接修改父组件传递的值的操作,否则控制台会报错。

  如果传递的值是简单数据类型,则可以在子组件中修改它,并且它不会影响从父组件调用相同值的其他同级组件。

  具体来说,您可以先将传递的值重新分配给数据中的一个变量,然后更改该变量。

  //子组件

  导出默认值{

  道具:[我的名字],

  data() {

  返回{

  Name: this.myName //将传递的值赋给新变量

  }

  },

  观察:{

  我的名字(新值){

  This.name=newVal //监视父组件传递的值,如果值发生变化,则更改子组件内部的值。

  }

  },

  方法:{

  changeName() {

  This.name=Lily //你在这里修改的只是你自己的内部值,所以不会报错。

  },

  }

  }

  注意:如果不使用watch来监视父组件传递的myName值,那么子组件中的Name值不会随着父组件的myName值而改变,因为name: this.myName在数据中只定义了一个初始值。

  如果引用了类型的值,当在子组件中修改该值时,父组件的也将被修改,因为其数据是公共的,并且也引用该值的其他子组件也将被修改。可以理解为父组件传递给子组件的值相当于复制了一个副本,这个副本的指针仍然指向父组件中的那个,也就是共享同一个引用。所以除非有特殊需求,否则不要轻易修改。

  

二、子组件向父组件传值

  

1.子组件绑定一个事件,通过 this.$emit() 来触发

  在子组件中绑定一个事件,并为此事件定义一个函数。

  //子组件

  Button @click=changeParentName 更改父组件的名称/按钮

  导出默认值{

  方法:{

  //子组件的事件

  changeParentName: function() {

  这个。$ emit (handleChange , Jack )//触发父组件中的handleChange事件,并将其传递给Jack。

  //注意:这里的事件名应该和父组件中绑定的事件名一致。

  }

  }

  }

  在父组件中定义并绑定handleChange事件

  //父组件

  child @ handle change= change name /child

  方法:{

  参数changeName(name) {//name是从子组件传入的值Jack。

  this.name=name

  }

  }

  

2.通过 callback 函数

  首先,在父组件中定义一个回调函数,并传递回调函数。

  //父组件

  child:callback= callback /child

  方法:{

  回调:函数(名称){

  this.name=name

  }

  }

  在子组件中接收并执行回调函数。

  //子组件

  Button @click=callback(Jack )更改父组件的名称/按钮

  道具:{

  回调:函数,

  }

  

3. 通过 $parent / $children 或 $refs 访问组件实例

  这两种方法都可以直接获取组件实例,使用后可以直接调用组件的方法或者访问数据。

  //子组件

  导出默认值{

  data () {

  返回{

  标题:“子组件”

  }

  },

  方法:{

  说你好(){

  console . log( Hello );

  }

  }

  }

  //父组件

  模板

  child ref=childRef /

  /模板

  脚本

  导出默认值{

  已创建(){

  //通过$ref访问子组件

  console.log(这个。$ refs . child ref . title);//子组件

  这个。$ refs . child ref . say hello();//你好

  //通过$children调用子组件的方法

  这个。$ children . say hello();//你好

  }

  }

  /脚本

  注意:这种方式的组件通信不能跨级别。

  

三、兄弟组件之间传值

  

1. 还是通过 $emit 和 props 结合的方式

  在父组件中,将要传递的变量绑定到希望传递值的两个兄弟组件,并定义事件。

  //父组件

  child-a :myName=name /

  child-b:myName= name @ changeName= editName /

  导出默认值{

  data() {

  返回{

  姓名:“约翰”

  }

  },

  组件:{

   ChildA :ChildA,

   child-b: ChildB,

  },

  方法:{

  editName(name) {

  this.name=name

  },

  }

  }

  接收子组件b中的变量和绑定触发事件。

  //子b组件

  p姓名:{{我的姓名}}/p

  按钮@click=changeName 修改名称/按钮

  脚本

  导出默认值{

  道具:[我的名字],

  方法:{

  changeName() {

  这个。$ emit (changename , lily )//触发事件并传递值

  }

  }

  }

  /脚本

  //子组件

  P name: {{ newName }}/p

  脚本

  导出默认值{

  道具:[我的名字],

  计算值:{

  newName() {

  If(this.myName) {//确定是否有值被传递。

  返回this.myName

  }

  Return John //传递的值没有默认值。

  }

  }

  }

  /脚本

  即当子组件B通过$emit()触发父组件的事件函数editName,改变父组件的变量名值时,父组件可以通过props将改变后的值传递给子组件A,从而实现兄弟组件之间的数据传递。

  

2.通过一个空 vue 实例

  创建一个EventBus.js文件并公开一个vue实例。

  从“Vue”导入Vue

  导出默认新Vue()

  将这个空的vue实例导入到要传递的文件中,绑定事件,通过$emit触发事件函数。

  (也可以在main.js中全局引入这个js文件我一般在需要使用的组件中引入。)

  模板

  差异

  P name: {{ name }}/p

  按钮@click=changeName 修改名称/按钮

  /div

  /模板

  脚本

  从导入{ EventBus }./EventBus.js

  导出默认值{

  data() {

  返回{

  姓名:“约翰”,

  }

  },

  方法:{

  changeName() {

  这个. name=Lily

  事件。$ emit(编辑名称,this。name)//触发全局事件,将更改后的值传入事件函数。

  }

  }

  }

  /脚本

  vue实例也被导入到接收传递值的组件中,回调由$on监控,回调函数在触发事件时接收所有传入的参数。

  从导入{ EventBus }./EventBus.js

  导出默认值{

  data() {

  返回{

  名称:“”

  }

  },

  已创建(){

  EventBus。$on(编辑名称,(名称)={

  this.name=name

  })

  }

  }

  这种创建空vue实例的方式相当于创建一个事件中心或中继站来发送和接收事件。这种方法也适用于任何组件之间的通信,包括父子、兄弟和跨级别。对于通信需求简单的项目比较方便,但是对于比较复杂的情况或者大型项目,可以使用Vue提供的比较复杂的状态管理模式vuex来处理。

  

四、多层父子组件通信

  有时候,需要沟通的两个组件并不是直接的亲子组件,而是祖孙,或者是跨越更多层次的亲子组件。在这种情况下,无法将参数从子组件级转移到子组件级,尤其是在组件级较深、嵌套较多的情况下,需要转移的事件和属性较多,会导致代码混乱。

  这时候就需要使用vue提供的高阶方法:provide/inject。

  这一对选项需要一起使用,以允许一个祖先组件向它的所有后代注入一个依赖项,不管组件级别有多深,只要建立了上下游关系,它就会一直生效。

  Provide/inject:简单来说就是通过provider在父组件中提供变量,然后通过inject注入到子组件中。无论组件级别有多深,该变量在父组件的整个生命周期中都将保持有效。

  父组件:

  导出默认值{

  Provide: {//它的作用是将变量**name**提供给它的所有子组件。

  姓名:“杰克”

  }

  }

  子组件:

  导出默认值{

  注入:[name],//注入父组件提供的名称变量

  已安装(){

  console . log(this . name);//插孔

  }

  }

  注意:提供和注入绑定没有响应。也就是说,父组件的名称改变后,子组件不会改变。

  如果要实现提供和注入数据响应,有两种方法:

  提供祖先组件的实例,然后将依赖注入到后代组件中,这样就可以在后代组件中直接修改祖先组件实例的属性。但是,这种方法有一个缺点,就是在这个实例上安装了很多不必要的东西,比如道具和方法。

  //父组件

  差异

  按钮@click=changeName 修改名称/按钮

  儿童-b /

  /div

  脚本

  .

  data() {

  返回{

  姓名:“杰克”

  };

  },

  提供(){

  返回{

  ParentObj: this //提供祖先组件的实例。

  };

  },

  方法:{

  changeName() {

  这个. name=Lily

  }

  }

  /脚本

  后代中的值:

  模板

  div class=border2

  P name: {{parentObj.name}}/P

  /div

  /模板

  脚本

  导出默认值{

  注入:{

  parentObj: {

  默认值:()=({})

  }

  }//或者注入:[parentObj]

  };

  /脚本

  注意:这种方法广泛应用于功能组件。功能组件,即无状态(无响应数据)、未初始化(无此上下文)、无任何内部生命周期处理方法的组件,渲染性能较高,更适合依赖外部数据传输和变化的组件。

  

总结

  亲子沟通:父母通过道具向孩子传输数据,孩子通过$ emit向父亲传输数据;通过$parent/$children进行交流;$ref也可以访问组件实例;提供/注入;$ attrs/$ listeners;

  兄弟通信:EventBus;Vuex

  跨级通信:EventBus;Vuex提供/注入;$ attrs/$ listeners;

  以上是对vue组件之间相互传递值的方式的详细解释。更多关于vue的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: