vue作为现在前端使用的主流框架之一,组件一直是vue的核心部分。起初,我在学习vue的过程中接触到了组件之间传值的功能,但是由于在工作中使用较少,对于这一部分没有深入的认识,导致在开发过程中遇到了一些问题,通过进一步的学习,我了解到了vue组件传值的方式以及存在两类不同的组件传值方式:同级组件之间的传值、父子组件之间的传值。
同级组件之间的传值由于vue框架本身不支持同级之间组件的跳转,所以想要实现同级组件之间的跳转并且传值,需要先引入vue-router.js路由组件,使用路由的一大好处就是可以将所有功能组件化,实现单页面应用。既然说到单页面应用,这里推荐一个前端后台方案vue-element-admin,这里不做过多讲解了。
目前我是用比较多的方法是通过this.$router.push({})进行路由跳转。在使用这个方法进行跳转的时候,可以选择两种方式进行参数传递,分别是query方法和params方法。
使用param传参只能使用name进行引入,并且params一旦设置在路由,params就是路由的一部分,如果这个路由有params传参,但是在跳转的时候没有传这个参数,会导致跳转失败或者页面会没有内容。
params传递数据:
toEdit(){ this.$router.push({ name:'resourcesCourseEidt', params:{ info:'1' } }) },param接收数据:
var info = this.$router.params.info使用query方式可以通过path和name来进入路由,并且可以不进行传参。
query方法传递数据:
toEdit(){ this.$router.push({ path:'/resourcesCourseEidt', query:{ info:'1' } }) },query方法接收数据:
var info = this.$router.query.info总结:使用query和params来传递参数还是有不同的,query类似于get请求,在路由跳转的时候会在地址后面添加上组件之间传递的参数;而params类似于post方法相当于post请求,参数不会显示在地址栏,但是必须传递参数。
父子组件之间的传值在vue中,除了同级组件之外,还存在着另一种组件关系,那就是父子组件。父子组件之间的传值不能在使用this.$router.push({})方法,而vue框架本身给出了一种传值方法,那就是在父组件引入的子组件标签内,绑定上需要传递的参数,然后子组件被调用的时候对这些参数进行接收。
在父组件中引入子组件:
import upload from './components/upload'在父组件中的子组件标签绑定传递的参数值:
<upload v-model="uploadShow" :entity="chooseEntity" :actionUrl="actionUrl" :domain="domain" :token="postData.token" :name="postData.key" @change="handleChange()"></upload>在子组件中接收参数,其中type表示父组件传递过来的参数是什么种类:
props:{ entity: { type: Object }, actionUrl:{ type:String }, domain:{ type:String }, token:{ type:String }, name:{ type:String } },其实到了这一步,我们就可以使用父组件传递给子组件的数据了,这些数据和我们在子组件data中生命的一样,直接使用就可以了。但是还存在一种情况,就是这些数据每次父组件传递给子组件时都可能会变化,并且子组件需要操作这些数据,对这些数据进行修改,在这样的情况下,子组件是不能直接对父组件传递来的数据进行修改的,而要通过监听这些数据的变化,将这些数据保存在子组件自己的data中,然后进行数据修改。
watch:{ name(newKey){ this.postData.token = this.token this.postData.key = newKey } },这里的例子是在使用七牛云的过程中,需要拿到token以及需要传递自定义文件名称key,并且这些数据要放在postData中。其中token是负组件中通过调用后台接口从数据库中获取的,这个参数是一个不会改变的静态参数,所以我们直接拿来使用就可以了;而key值是动态数据,每次上传文件时都会产生变化,所以在watch中监听这个数据的变化,如果数据产生变化,就将父组件中传递过来的“name”(其实放的就是key值)赋给子组件中postData中的key,这样就实现了子组件对父组件传递过来的数据进行动态监听了。
在这里我产生了一个误区,在写总给的时候忽然想到,其实我不必使用watch进行监听,可以在上传组件调用上传文件前的钩子时对token和key进行赋值。