1.通过路由带参数进行传值
两个组件 A和B,A组件通过query把orderId传递给B组件(触发事件可以是点击事件、钩子函数等)
1
| this.$router.push({ path: '/conponentsB', query: { orderId: 123 } })
|
在B组件中获取A组件传递过来的参数
1
| this.$route.query.orderId
|
2.通过设置Session Storage缓存的形式进行传递
两个组件A和B,在A组件中设置缓存orderData
1 2
| const orderData = {'orderData':123,'price':88} sessionStorage.setItem('缓存名称', JSON.stringify(orderData))
|
在B组件中获取A中设置的缓存
1
| const dataB = JSON.parse(sessionStorage.getItem('缓存名称'))
|
3.父组件往子组件传值props
定义父组件,父组件传递 number这个数值给子组件,如果传递的参数很多,推荐使用json数组{}的形式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <template> <div class="parent"> <Children number="888"></Children> </div> </template> <script> import Children from 'components/children'
export default{ components:{ Children } } </script>
|
定义子组件,子组件通过 props方法获取父组件传递过来的值。props中可以定义能接收的数据类型,如果不符合会报错。
1 2 3 4 5 6 7 8 9 10 11 12 13
| <template> <div class="children"> {{number}} </div> </template> <script> export default{ props:{ 'number':[Number,String,Object], 'string':[String] } } </script>
|
- 父子组件传值,数据是异步请求,有可能数据渲染时报错原因:异步请求时,数据还没有获取到但是此时已经渲染节点了
- 解决方案:可以在 父组件需要传递数据的节点加上 v-if = false,异步请求获取数据后,v-if = true
4.子组件往父组件传值,通过emit事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <template> <div class="children"> <button @click = "emitToParent">按钮点击传值个父组件</button> </div> </template> <script> export default{ methods:{ emitToParent(){ this.$emit('child-event','数据') } } } </script>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <template> <div class="parents" > <Children v-on:child-event = 'parentEvent'></children> </div> </template>
<script> import Children from 'components/children' export default{ components:{ Children }, methods:{ parentEvent(data){ console.log(data) } } } </script>
|
不同组件之间传值,通过eventBus(小项目少页面用eventBus,大项目多页面使用 vuex)
定义一个新的vue实例专门用于传递数据,并导出
1 2
| import Vue from 'vue'; export default new Vue();
|
定义传递的方法名和传输内容,点击事件或钩子函数触发eventBus.emit事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <template> <div class="componentsA" > <button @click = "emitToB">传送数据给b</button> </div> </template>
<script> import eventBus from 'common/js/eventBus.js'
export default{ methods:{ emitToB(){ eventBus.$emit('emitToA','data') } } } </script>
|
接收传递过来的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <template> <div class="componentsB" > {{title}} </div> </template>
<script> import eventBus from 'common/js/eventBus.js'
export default{ data(){ tittle:'' }, mounted(){ this.getEventData() }, methods:{ getEventData(){ const that = this; eventBus.$on('emitToA',function(val){ that.title = val }) } } } </script>
|