由于Vue组件存在嵌套使用,组件间的关系可以分为以下几种:父子、兄弟… 那么组件之间是如何传递参数的呢?
提示:以下是本篇文章正文内容,下面案例可供参考
父组件向子组件传递参数
子组件中新增props属性,属性值是数组,数组中存放待接收参数列表(定义参数名字) 代码如下(示例):
let CommonHead={ template:` <div> <h1>我是 {{title}} 的标题</h1> <h2>我是 {{ subTitle }} </h2> </div> `, props:['title',"subTitle"] // 接受来自父组件的状态"title"、"subTitle",可以在CommonHead组件中使用 }在父组件中,使用子组件的自定义标签,通过属性的形式传入父组件的数据 代码如下(示例):
let Home = { template:` <div> <h4>我是home组件</h4> <common-head :title="myTitle" :subTitle=" '我是home组件副标题' "></common-head> // 属性名和子组件props属性中接收列表中的变量名必须相同 // 属性传参可以是静态的: title="这是静态数据" // 也可以是动态的: :title="myTitle"(myTitle是父组件data中的状态) 【:title是v-bind:title的简写】 </div> `, data(){ return { myTitle:"首页组件" } }, components: { CommonHead } }props通信,没有校验props数据类型,以及必须填写情况、默认值等情况,导致代码不健壮。 为了解决这种状况,我们给props添加验证
【说明】
props中定义的参数名会自动 编译成 实例(组件)属性(同data中的属性以及计算属性中的属性)props里属性名不能和data中以及methods和计算属性等里的内容重名数据类型为引用数据类型(Array/Object)时,默认值必须是一个函数的返回值,形成闭包,生成自己单独的作用域props不能在子组件中直接改变值(单向数据流)【易于维护】子组件向父组件传递参数
通过事件弹射形式进行通信
子组件通过事件弹射将携带参数传递到父组件上 代码如下(示例):
let son = { template: ` <div> 子组件 <button @click='biu'>点击<button> </div> `, data () { return { msg: '这是子组件的值!' } }, methods: { biu () { # this.$emit('自定义事件名',携带参数) this.$emit('piu',this.msg) // 弹射一个自定义事件,并携带参数 // 当click事件触发执行biu函数,子组件会弹射触发事件piu,并执行相应的事件处理函数fn // click触发-》执行biu()-》弹射piu-》执行fn } } }在父组件通过形参获取到子组件传递过来的参数 代码如下(示例):
let father = { template: ` <div> 父组件 <son @piu='fn'><son> </div> `, methods: { fn (msg) { alert(msg) // 参数即为子组件传来的数据 } }, components: { son } }兄弟组件间传递参数
原理:利用一个第三方的 实例 进行弹射事件和监听事件 弹射事件:第三方实例.$emit(“自定义事件名”,携带的参数) 监听事件:第三方实例.$on(“自定义事件名”,回调函数)
let eventBus = new Vue(); // 定义的第三方实例 eventBus.$emit("自定义事件名",携带的参数) eventBus.$on("自定义事件名",回调函数)子组件依赖第三方实例,通过事件弹射将携带参数传递 子组件1(示例):
let CommonTitle1 = { template:` <div> 子组件1 <button @click="biubiubiu">点击传数据</button> </div> `, data(){ return { msg:"我是子组件1的数据" } }, methods:{ biubiubiu(){ eventBus.$emit("piu",this.msg) // 通过第三方实例弹射事件 } } }子组件2(示例):
let CommonTitle2 = { template:` <div> 子组件2 {{msg}} </div> `, mounted(){ // 通过第三方实例监听事件 eventBus.$on("piu",(msg)=>{ this.msg = msg; }) }, data(){ return { msg:"我是子组件2的数据" } } }在父组件依赖第三方实例,监听事件获取传递过来的值 代码如下(示例):
let Home = { template:` <div> home页内容 <common-title1></common-title1> <hr/> <common-title2></common-title2> </div> `, components:{ CommonTitle1, CommonTitle2 } }