Vue组件传参方式总结(Vue2、Vue3)

23 篇文章 0 订阅
18 篇文章 4 订阅

一、Vue2

1. 父传子

props
<!-- 父组件 -->
<template>
  <child-component title="这是标题" content="这是内容,可能有各种类型" />
</template>
// 子组件
export default {
  props: {
    marjorCollegeName: {
      type: String,
      default: ''
    },
    content: {
      type: [Array, String], // 把可能的类型都列出来
      default: () => []
    },
  }
}
事件传值
<!-- 父组件 -->
<template>
  <child-component ref="childcomponent" />
</template>

<script>
export default {
  methods: {
    this.$ref.childcomponent.changeData()
  }
}
</script>
// 子组件
export default {
  methods: {
    changeData() {}
  }
}
vuex

vuex 的值是实时同步的,所有组件都可以访问到,由于内容过多,本文不做详细介绍,附另一篇详细介绍 vuex 使用方法的博客链接。

vuex使用方法:https://blog.csdn.net/m0_53808238/article/details/117091249

2. 子传父

事件传值
// 子组件
this.$emit('changeValue', 100)
// 父组件
export default {
  methods: {
    changeValue(value) {
      console.log(value)
    }
  }
}
vuex

同上,

vuex使用方法:https://blog.csdn.net/m0_53808238/article/details/117091249

3. 兄弟组件互传

路由传参
this.$router.push({
  path: "/detail",
  query: {
    id: 12345
  },
})
export default {
  computed: {
    id() {
      return this.$route.query.id;
    },
  },
}
浏览器缓存

使用 sessionStorage 或者 localStorage 进行存储/读取。

// 存储
sessionStorage.setItem("id", 12345);
localStorage.setItem("id", 12345);

// 读取
sessionStorage.getItem("id");
localStorage.getItem("id");

如果是对象类型,需要使用 JSON 进行转换。

JSON.stringify() 、JSON.parse()

vuex

同上,

vuex使用方法:https://blog.csdn.net/m0_53808238/article/details/117091249

二、Vue3

1. 父传子

props
<!-- 输入 -->
<template>
  <child-component id="12345" />
</template>

ts 的写法接收时需要断言类型,如果不确定是否使用需要加一个 ?

// 接收
<script setup lang='ts'>
const props = defineProps<{
  id?: string,
}>()
</script>
Pinia

Pinia 使用方法内容有点多,本文限于篇幅,不做介绍,附一篇详细介绍使用方法的博客链接。

Pinia 使用方法:https://juejin.cn/post/7213994684262891576

依赖注入

依赖注入不仅可以父子传值,也可以传递给更深层次的子组件。如果提供的值是响应式数据,那么注入的值也是响应式的。所谓注入就是读取的意思。

// 父组件-提供
import { provide } from 'vue'

provide('id', 12345)
// 后代组件-注入
import { inject } from 'vue'

// 注入时需提供一个默认值
const id = inject<string>('id', '')
事件传值
<!-- 父组件 -->
<script setup lang='ts'>
import { ref } from 'vue'

const childComponent:any = ref(null)
childComponent.value.getList()
</script>

<template>
<child-component ref="childComponent"></child-component>
</template>
// 子组件
const getList = () => {
  console.log(12345)
}

defineExpose({
  getList 
})

2. 子传父

事件传值
<!-- 父组件 -->
<child-component @onSearch="getList"></child-component>
// 子组件
const emit = defineEmits(['onSearch'])

const onSearch = () => {
  emit('onSearch', 123456)
}
Pinia

同上。

Pinia 使用方法:https://juejin.cn/post/7213994684262891576

3. 兄弟组件互传

路由传参
// 传递
import { useRouter } from 'vue-router'

const router = useRouter()

router.push({
  path: '/detail',
  query: {
    id: 12345
  }
})
// 接收
import { useRoute, computed } from 'vue-router'

const route = useRoute()

const id = computed(() => {
  return route.query.id
})
浏览器缓存

使用 sessionStorage 或者 localStorage 进行存储/读取。

// 存储
sessionStorage.setItem("id", 12345);
localStorage.setItem("id", 12345);

// 读取
sessionStorage.getItem("id");
localStorage.getItem("id");

如果是对象类型,需要使用 JSON 进行转换。

JSON.stringify() 、JSON.parse()

Pinia

同上。

Pinia 使用方法:https://juejin.cn/post/7213994684262891576

END

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在2中,子组件通过$emit方法发送事件来传递参数给父组件,而父组件通过自定义事件来接收子组件传递的参数。具体实现是,子组件在需要传递参数的地方使用$emit方法发送事件,并传递参数值;而父组件则在接收子组件传递参数的地方定义一个自定义事件,并在该事件的回调函数中接收子组件传递的参数。 而在Vue3中,组件传参有一些变化。父组件在引入子组件后,无需再进行注册,可以直接使用子组件。子组件可以通过defineEmits方法定义要发送的事件,并使用emits方法发送事件和参数给父组件。父组件则可以直接在模板中监听子组件发送的事件,并在事件回调函数中接收子组件传递的参数。 此外,Vue2中父组件向子组件传递参数的方式是通过自定义属性发送,并在子组件中使用props接收传递的参数;而Vue3中,父组件向子组件传递参数仍然无需注册,可以直接使用子组件,并使用defineProps方法在子组件中接收父组件传递的参数。所以,Vue3相对于Vue2,组件传参方式更加简洁和灵活。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [vue2和vue3 父子组件传参及区别](https://blog.csdn.net/weixin_50370865/article/details/128413462)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温其如玉_zxh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值