Vue中的八种传参方式你了解多少!

在这里插入图片描述

一.父传子,子传父

父传递子如何传递:

  • (1)在父组件的子组件标签上绑定一个属性,挂载要传输的变量
  • (2)在子组件中通过props来接受数据,props可以是数组也可以是对象,接受的数据可以直接使用 props:[“属性 名”] props:{属性名:数据类型}

子传递父如何传递

  • (1)在父组件的子组件标签上自定义一个事件,然后调用需要的方法
  • (2)在子组件的方法中通过 this.$emit(“事件”)来触发在父组件中定义的事件,数据是以参数的形式进行传递的

父组件代码

<template>
  <div id="Parent">
    <Child :ChildData="ParentData" @alter="alter"></Child>
  </div>
</template>
<script>
import Child from "../views/Child";
export default {
  components: { Child },
  data() {
    return {
      ParentData: "我是父组件中一段文字"
    };
  },
  methods: {
    alter(title) {
      this.ParentData = title;
    }
  }
};
</script>
<style lang="scss" scoped>
#Parent {
  width: 100%;
  height: 100%;
}
</style>

子组件代码

<template>
  <div>
    <h2>{{ChildData}}</h2>
    <button @click="alter">点击更改,子组件触发父组件</button>
  </div>
</template>

<script>
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  props: ["ChildData"], //我把父组件的文字给传到子组件中去了
  data() {
    //这里存放数据
    return {};
  },
  //计算属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {
    alter() {
      var data =
        "在子组件的方法中通过 this.$emit('事件')来触发在父组件中定义的事件,数据是以参数的形式进行传递的";
      this.$emit("alter", data);
    }
  },
  }
</script>
<style lang='scss' scoped>
</style>

实现效果如图下
在这里插入图片描述
在这里插入图片描述

vuex中state传值

state 所有的数据都存储在state中 state是一个对象

state组件中的代码

<template>
  <div>
    <h3 v-for="item in stateData" :key="item.id">{{item.id}}:{{item.title}}</h3>
  </div>
</template>

<script>
import { mapState } from "vuex";
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  props: {},
  data() {
    //这里存放数据
    return {};
  },
  //计算属性 类似于data概念
  computed: {
    ...mapState(["stateData"])
  },
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {}
};
</script>
<style lang='scss' scoped>
</style>

vuex中state的代码(store.js中)

  state: {
    stateData:[
      {id:1,title:"我是vuex中来存储数据的"},
      {id:2,title:"所有的数据都存储在state中 state是一个对象"},
      {id:3,title:" Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储和管理程序的所有组件的数据"},
      {id:4,title:"在大型的程序中如果多个组件中用到的数据我们可以存储到vuex,如果小型项目我们可以适当的使用vuex"}
    ]
  },

效果如下图
在这里插入图片描述

三.sessionStorage,localStorage传值

存储数据

  • 采用setItem()方法存储

存储到本地的数据如下图

在这里插入图片描述
在这里插入图片描述

读取数据

  • 通过getItem()方法取值
<template>
  <div>
    <h2>{{this.localStorage}}</h2>
    <h2>{{this.sessionStorage}}</h2>
  </div>
</template>

<script>
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  props: {},
  data() {
    //这里存放数据
    return {
      // localStorage,  sessionStorage
      localStorage:"",
      sessionStorage:"",
    };
  },
  //计算属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  mounted() {
    var obj = {
        username: "康康",
        Email: "3368327138@qq.com"
      }
      var obj2 = {
          username:"小康康",
          phone:"不告诉你"
      }
    localStorage.setItem("localStorage",JSON.stringify(obj))
    sessionStorage.setItem("sessionStorage",JSON.stringify(obj2))
    this.localStorage=JSON.parse(localStorage.getItem('localStorage'))
    this.sessionStorage=JSON.parse(sessionStorage.getItem("sessionStorage"))
   
  }
};
</script>
<style lang='scss' scoped>
</style>

效果实现
在这里插入图片描述

四.Promise来传值

Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
从语法上说,promise 是一个对象,从它可以获取异步操作的的最终状态(成功或失败)。
Promise是一个构造函数,对外提供统一的 API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。

Promise组件代码


<template>
  <div>
    <!-- 自己模拟一段json数据放在api中 -->
    <h2 v-for="item in promiseData" :key="item.id">
        {{item.id}}:{{item.title}}
    </h2>
  </div>
</template>

<script>
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  props: {},
  data() {
    //这里存放数据
    return {
        promiseData:[]
    };
  },
  //计算属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {},
  //生命周期 - 创建完成(可以访问当前this实例)
  created() {
    this.$http
      .get("/api/promise.json")
      .then(res => {
        console.log(res);
        this.promiseData=res.data
      })
      .catch(err=>{
          console.log(err);
          
      });
  }
};
</script>
<style lang='scss' scoped>
</style>

自己模拟promise.json数据

[
    {
        "id": "1",
        "title": "Promise"
    },
    {
        "id": 2,
        "title": "我即将通过promise来被获取到"
    },
    {
        "id": 3,
        "title": "我能被通过异步操作来获取成功状态或者失败状态"
    },
    {
        "id": 4,
        "title": "我的初始状态时pending,成功状态是fulfilled ,失败状态是rejected "
    }
]

效果如下图
在这里插入图片描述

五.路由传参

先有如下场景 点击当前页的某个按钮跳转到另外一个页面去,并将某个值带过去

<div  @click="insurance('我是通过路由传参获取到的值')">查看详情</div>

点击查看详情跳转到页面route

   // 路由传参 点击查看详情跳转到页面route
    insurance(title){
      this.$router.push("/route?title="+title)
    }

在router当中配置路由如下

  {
    path:"/route",
    name:"router传值",
    component: () => import('../views/router.vue'),
    
  }

在详情页面通过this.$route.query.title来获取传过来的值

<template>
  <div>{{title}}</div>
</template>

<script>
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  props: {},
  data() {
    //这里存放数据
    return {
      title: ""
    };
  },
  //计算属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {},
  //生命周期 - 创建完成(可以访问当前this实例)
  created() {
    var title = this.$route.query.title;
    console.log(title);
    this.title = title;
  }
};
</script>
<style lang='scss' scoped>
</style>

效果如下
在这里插入图片描述

六.eventbus,组件之间的传参

(1)在src中新建一个Bus.js的文件,然后导出一个空的vue实例

  import Vue from 'vue'
  export default new Vue({})

举例说明

在这里插入图片描述

(2)在传输数据的一方引入Bus.js 然后通过Bus. e m i t ( “ 事 件 名 ” , " 参 数 " ) 来 来 派 发 事 件 , 数 据 是 以 emit(“事件名”,"参数")来来派发事件,数据是以 emit(,"")emit()的参数形式来传递

state组件是传输数据的一方

<template>
  <div>
    <h3 v-for="item in stateData" :key="item.id">{{item.id}}:{{item.title}}</h3>
    <button @click="bus">BUS,点我会进行兄弟间通信</button>
  </div>
</template>

<script>
import { mapState } from "vuex";
import Bus from "../Bus"
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  props: {},
  data() {
    //这里存放数据
    return {
      busData:"我是兄弟间的交流的纽带"
    };
  },
  //计算属性 类似于data概念
  computed: {
    ...mapState(["stateData"])
  },
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {
    bus(){
      Bus.$emit("bus",this.busData)
    }
  }
};
</script>
<style lang='scss' scoped>
</style>

看图在原有代码上添加

在这里插入图片描述

(3)在接受的数据的一方 引入 Bus.js 然后通过 Bus.$on(“事件名”,(data)=>{data是接受的数据})

  created(){
    Bus.$on('bus',(data)=>{
      console.log(data);
      
    })
  }

在这里插入图片描述

7.全局变量使用与传值

1.创建全局文件

在这里插入图片描述
2.main.js中引入

在这里插入图片描述
3.直接在组件中使用

<template>
  <div>
    <h2>{{this.Global.title}}</h2>
  </div>
</template>

<script>
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {},
  props: {},
  data() {
    //这里存放数据
    return {};
  },
  //计算属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {},
  //生命周期 - 创建完成(可以访问当前this实例)
  created() {
      console.log(this.Global);
    //   
      
  }
};
</script>
<style lang='scss' scoped>
</style>

效果图如下

在这里插入图片描述

八.this.$refs的使用与传值

1.给组件加ref
2.可以通过 r e f s 得 到 组 件 , 进 而 调 用 组 件 的 变 量 和 方 法 , 如 t h i s . refs 得到组件,进而调用组件的变量和方法,如 this. refsthis.refs.comp.$el得到了组件中的所有元素

在这里插入图片描述
打印出来的信息如下图
在这里插入图片描述

九. $parent 和 $children

1、ref为子组件指定一个索引名称,通过索引来操作子组件;

2、this. $parent可以直接访问该组件的父实例或组件;
在这里插入图片描述

在这里插入图片描述

3、父组件也可以通过this.$children 访问它所有的子组件; 需要注意 $children 并不保证顺序,也不是响应式的。

在这里插入图片描述
在这里插入图片描述
讲到这里终于结束了,这次的博客之旅也让我自己学到了很多知识,愿屏幕前努力的奋斗的你从中能收获多多,完结撒花!!!
在这里插入图片描述

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3是目前前端开发非常流行的框架之一,常用于构建单页应用(SPA)。在开发,经常会遇到需要向新页面传递参数的需求。而有时会发现在新页面无法正确获取到传递的参数值。这通常是由于参数传递的方式或组件使用方式不正确导致的。 首先,我们需要了解Vue3params传参的使用方法。在Vue3,我们通过router.push方法跳转页面并传递参数,示例如下: ```js this.$router.push({path:'/user',params:{id:1}}) ``` 在新页面,我们可以通过$route.params.id的方式获取到传递的参数值。但是,在实际开发,我们会发现有时无法获取到传递的参数值,这时我们需要对可能出现问题的方面进行排查。 第一步,检查路由配置。在Vue3,我们需要在路由配置文件定义路由,需要注意的是params传参需要使用动态路由。如下面的示例所示: ```js { path:'/user/:id', component:User } ``` 第二步,检查组件使用方式。在我们的组件,需要使用$route对象来获取传递的参数值。如果$route对象没有被正确的引入或使用,则可能会导致无法获取到传递的参数值。在组件使用$route对象,实现如下: ```js export default{ name: 'User', created(){ console.log(this.$route.params.id) } } ``` 最后,检查参数传递方式。在使用params传参时,需要注意传递的参数值是通过URL编码而来,因此需要在获取参数值的时候进行解码。如下所示: ```js export default{ name: 'User', created(){ console.log(decodeURIComponent(this.$route.params.id)) } } ``` 综上所述,Vue3新页面params传参取不到值的原因可能有多种,我们需要对可能出现问题的方面进行排查和分析。需要注意路由配置、组件使用方式以及参数传递方式等几个方面,以确保能够正确获取到传递的参数值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值