缓存方式即通过 sessionStorage 、 localStorage 、 Cookie 方式传参,这种方式和是不是用Vue无关,因此,不谈。
三丶父子组件之间传值在components目录下创建父组件 parent.vue 和子组件 children.vue ,在父组件中引入子组件。为了演示方便,在路由配置中加入 /parent 路径。
3.1 父组件向子组件传值 props
在 parent.vue 的子组件标签上注册message1,在 children.vue 中通过 props 接收message1,如果传递的值为变量,则使用 v-bind: 或直接用 : ,参考如下:
parent.vue
<template> <div> <div>我是父组件</div> <children message1='我是直接参数' v-bind:message2='msg' :message3='obj'></children> </div> </template> <script> import Children from './children' export default{ components:{ Children }, data(){ return{ msg:'我是父组件的参数' } }, created(){ this.obj = {a:'1',b:'2',c:'3'} } } </script> <style> </style>
children.vue
<template> <div> <div>我是子组件</div> <div>{{message1}}</div> <div>{{message2}}</div> <div>{{message3}}</div> </div> </template> <script> export default{ props:['message1','message2','message3'], created(){ console.log(this.message3) } } </script> <style> </style>
在浏览器中打开:
3.2 子组件向父组件传值 $emit
子组件通过vm.$emit( event, […args] ),触发当前实例上的事件。附加参数都会传给监听器回调。父组件在子组件标签上监听事件获得参数。
children.vue
<template> <div> <div>我是子组件</div> <div>{{message1}}</div> <div>{{message2}}</div> <div>{{message3}}</div> <button @click='ChildToParent'>点我传爱</button> </div> </template> <script> export default{ props:['message1','message2','message3'], data(){ return{ loud:'I love xx' } }, methods:{ ChildToParent(){ this.$emit('emitToParent',this.loud) } }, created(){ console.log(this.message3) } } </script> <style> </style>
parent.vue
<template> <div> <div>我是父组件</div> <div>大声告诉我你爱谁:{{loveWho}}</div> <children @emitToParent='parentSayLove' message1='我是直接参数' v-bind:message2='msg' :message3='obj'></children> </div> </template> <script> import Children from './children' export default{ components:{ Children }, data(){ return{ msg:'我是父组件的参数', loveWho:'' } }, methods:{ parentSayLove(data){ this.loveWho = data } }, created(){ this.obj = {a:'1',b:'2',c:'3'} } } </script> <style> </style>
点击按钮浏览器显示:
3.3 小结
props 可以是字符串数组,也可以是对象(可以类型验证、设置默认值等) ;
使用 .native 修饰监听事件,开发中使用了 element-ui 的框架标签时候,使用事件绑定无效。这时候需要使用 .native 修饰 v-on:event ,可以在框架标签或组件的根元素 上监听一个原生事件,例如 <my-component v-on:click.native="doTheThing"></my-component> 。
四丶非父子(兄弟)组件之间传值非父子组件之间传值,需要定义公共实例文件 bus.js ,作为中间仓库来传值,不然路由组件之间达不到传值的效果。在components目录下新建 first.vue 和 second.vue 以及公共文件 bus.js 。
bus.js
import Vue from 'vue' export default new Vue()
在 first.vue 和 second.vue 中分别引入bus.js。
import Bus from '../bus.js'
模拟情景: first.vue 向 second.vue 传值。在 first.vue 通过在事件中添加 Bus.$emit( event, […args] ) 进行传值,在 second.vue 中通过 Bus.$on(event,callBack) 进行监听。
first.vue
<template> <div> <div>我是first.vue</div> <button @click="firstToSecond">点击传值给second.vue</button> </div> </template> <script> import Bus from '../bus.js' export default{ data(){ return{ msg:'我是first.vue传到second.vue的参数' } }, methods:{ firstToSecond(){ Bus.$emit('emitToSecond',this.msg) } } } </script> <style> </style>
second.vue