VUE组件通信、传值的方式汇总

一、路由传值

1.用name传递参数

(1)首先在路由文件src/router/index.js里配置name属性。

routes: [
    {
      path: '/',
      name: 'Hello',
      component: Hello
    }
]

(2)然后在模板里(src/APP.vue)用$router.name的形势接收,比如直接在模板中显示:

​<p>{{ $router.name}}</p>

2.用冒号的形式传递参数

(1)在配置文件里以冒号的形式设置参数。我们在/src/router/index.js文件里配置路由。

{
    path:'/params/:newsId/:newsTitle',
     component:Params
}

这里我们需要传递参数是新闻ID(newsId)和新闻标题(newsTitle).所以我们在路由配置文件里制定了这两个值。

(2)在src/components目录下建立我们params.vue组件,也可以说是页面。我们在页面里输出了url传递的的新闻ID和新闻标题。

<template>
    <div>
        <h2>{{ msg }}</h2>
        <p>新闻ID:{{ $route.params.newsId}}</p>
        <p>新闻标题:{{ $route.params.newsTitle}}</p>
    </div>
</template>
 
<script>
export default {
  name: 'params',
  data () {
    return {
      msg: 'params page'
    }
  }
}
</script>

(3)在App.vue文件里加入我们的<router-link>标签。这时候我们可以直接利用url传值了。

​<router-link to="/params/198/jspang website is very good">params</router-link> |

3.通过路由属性中的name来确定匹配的路由,通过params来传递参数。

this.$router.push({
          name: 'Describe',
          params: {
            id: id
          }
        })
对应的路由配置:
{
     path: '/describe',
     name: 'Describe',
     component: Describe
   }

获取时候这样来获取:

<P>{{$route.params.id}}</P>

4.使用path来匹配路由,然后通过query来传递参数。

这种情况下,query传递的参数会显示在url后面?id=?

this.$router.push({
          path: '/describe',
          query: {
            id: id
          }
        })

对应的路由配置:

{
     path: '/describe',
     name: 'Describe',
     component: Describe
   }

获取时候这样来获取:

<p>{{$route.query.id}}</p>

二、通过设置缓存形式来传值

1.两个组件a和b,在组件a中设置缓存userData:

​
const userData = { 'userName': 123, 'age': 19 }
 
sessionStorage.setItem('用户信息缓存', JSON.stringify(userData))

2.这时b组件中就可以获取在a组件中存储的值了:

const userData = JSON.parse(sessionStorage.getItem('用户信息缓存'))

三、父子组件之间的传值

1.父组件向子组件传值用props

(1)定义父组件,父组件传递num这个数值给子组件,如果传递的参数很多的话,推荐使用json的形式传递:

​<template>
    <div class="father">
        <children num="666"></children>
    </div>
</template>
<script>
import Children from './children'
export default {
  components:{
      Children
  }
}
</script>

(2)定义子组件,子组件通过 props方法获取父组件传递过来的值。props中可以定义能接收的数据类型,如果不符合会报错。

​<template>
    <div class="children">{{num}}</div>
</template>
<script>
import Children from './children'
export default {
    props:{
        'num': [Number, String],
        'string': [String]
    }
}
</script>

(3)假如接收的参数是动态的,比如 input输入的内容 v-model的形式:

父组件中:

<template>
    <div class="father">
        <input type="text" v-model="inputText">
        <children :inputVal="inputText"></children>
    </div>
</template>
<script>
    import Children from './children'
    export default {
        components:{
            Children
        }
    }
</script>

子组件中: 

​​​<template>
    <div class="children">{{inputVal}}</div>
</template>
<script>
    import Children from './children'
    export default {
        props:{
            'inputVal': [String]
        }
    }
</script>

(4)父子组件传值,数据是异步请求,有可能数据渲染时报错:

原因:异步请求时,数据还没有获取到但是此时已经渲染节点了。

解决方案:可以在父组件需要传递数据的节点加上v-if = false,异步请求获取数据后,v-if = true。

2.子组件往父组件传值,通过emit事件:

子组件中:

​​​<template>
    <div class="children">
        <div @click="emitToFather">点击按钮传值给父亲</div>
    </div>
</template>
<script>
    import Children from './children'
    export default {
        methods:{
            emitToFather () {
                this.$emit('childClick', '子组件传递的值')
            }
        }
    }
</script>

父组件中:

<template>
    <div class="father">
        <children @childClick="fatherClick"></children>
    </div>
</template>
<script>
    import Children from './children'
    export default {
        components:{
            Children
        },
        methods:{
            fatherClick(val){
                console.log(val) // 打印内容为"子组件传递的值"
            }
        }
    }
</script>

四、不同组件之间传值,通过eventBus。

1.定义一个新的vue实例,专门用于数据传输,并导出;

2.定义传递的方法名和传输内容,点击事件或钩子函数触发eventBus.emit事件;

3.接收传递过来的数据。

五、用vuex进行传值。

这里只做简单的介绍和还是用,复杂的使用情况,自己参照官网。vuex官网地址: https://vuex.vuejs.org/zh-cn/intro.html 

1.如果没有安装vuex ,通过命令行: npm install vuex --save 进行安装;

2.然后在 main.js 中引入并在Vue实例中注入:

import Vuex from 'vuex'

import store from './store/store'

new Vue({ el: '#app',store,.....还有其他的一些组件模板等)

3.构建核心仓库store.js:

vuex 应用的状态 state都应当存放在store.js 里面,vue 组件可以从 store.js 里面获取状态,可以把 store 通俗的理解为一个全局变量的仓库。但是和单纯的全局变量又有一些区别,主要体现在当 store 中的状态发生改变时,相应的 vue 组件也会得到高效更新。在 src 目录下创建一个 vuex 目录,将 store.js 放到 store 目录下。

store.js 中:

import Vuex from 'vuex'

import Vue  from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({

    state:{

        id: ' '

    },

    mutations:{

        setId(state ,  id) {

            state.id = id

        }

    }

})

传递方法:

 A界面改变store中state里的参数:

①可以通过直接赋值的方法进行改变this.$store.state.id =  (要传递的参数id);

②官方建议的修改方法: this.$store.commit( 'setId' ,(要传递的参数id) );

B界面接收变化数据参数:

this.$store.state.id 

不过需要注意的是通过vuex这样写,页面刷新之后,数据也会消失。它只是对变量提升。如果不想数据刷新消失,就把数据存储到Local Storage或者Session Storage或者本地存储库中。

 

 

(ps:如果小伙伴们还有其他的方法,欢迎留言交流~(#^.^#))

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值