Vue 11种组件传参方式

这篇具有很好参考价值的文章主要介绍了Vue 11种组件传参方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. props 和 emit

  • vue2

父组件

<son count="100" @addCount = "addCount"></son>

addCount(val) {}

子组件

props: ['count'] // [{count: Number}]  [{count: {type: Number, default: 0}],this.$emit('addCount', value)
  • vue3

父组件

<son count="100" @addCount = "addCount"></son>

constaddCount = (val) => {}

子组件

const props = defineProps(['count']) // defineProps({ count: Number })  

defineProps<{ count?: number }>(),const emit = defineEmits(['addCount']) 
functionbuttonClick() { 
    emit('addCount') 
}

2. $attrs 和 $listeners

$attrs // 组件传值, 除了已在prop声明的值和 class样式名 style行内样式
$listeners // 组件传函数, 除了.native// 父组件
<Son :num="num" @addNum='addNum'></Son>

// 子组件
<GrandSon></GrandSon><div>{{$attrs.num}}</div>
// 孙子组件
<div @click="clickFn">{{$attrs.num}}</div>methods:{
    clickFn(){
        this.$listeners.addNum()
    }
}

3. v-model

  • vue2

vue2 v-mode 是 :value="msg" @input="msg=$event" 的语法糖

父组件

<TabsVue v-model="activeComponent" />

子组件

props:{
    activeComponent:{
        type:string,
        default:''
    }
}
this.$emit('update:activeComponent',value)
  • vue3

vue3 v-mode 是 :modelValue="msg" @update:modelValue="msg=$event" 的语法糖

父组件

<TabsVue v-model:activeComponent="activeComponent" />

子组件

const props = defineProps({
    activeComponent: {
        type: String,
        default: '库存信息',
    },
});
const emit = defineEmits(['update:activeComponent']);
functiontabsChange(index: number) {
    activeIndex.value = index;
    emit('update:activeComponent', props.data[index]);
}

4. 作用域插槽

<template>
    <div>
        <!--默认插槽-->
        <slot></slot>
        <!--另一种默认插槽的写法-->
        <slot name="default"></slot>
        <!--具名插槽-->
        <slot name="footer"></slot>
        <!--作用域插槽-->
        <slot v-bind:user="user" name="header"></slot>
    </div>
</template>

<!--使用-->
<children>
    <!--跑到默认插槽中去-->
    <div>123</div>
    <!--另一种默认插槽的写法-->
    <template v-slot:default></template>
    <!--跑到具名插槽 footer 中去-->
    <template v-slot:footer></template>
    <!--缩写形式-->
    <template #footer></template>
    <!--获取子组件的值-->
    <template v-slot:header="slot">{{slot.user}}</template>
    <!--结构插槽值-->
    <template v-slot:header="{user: person}">{{person}}</template>
    <!--老式写法,可以写到具体的标签上面-->
    <template slot="footer" slot-scope="scope"></template>
</children>

5. $refs, $root, $parent, $children

  1. $root 获取根组件

  1. $parent 获取父组件

  1. $children 获取子组件(所有的子组件,不保证顺序)

  1. $refs 组件获取组件实例,元素获取元素

6. provide 和 inject

  • vue2

父组件

provide(){
 return{
     color:this.color
 }
}

子孙组件

<h3>{color}</h3>

exportdefault{
  inject:['color'] //inject: { color: 'color' }  inject: {color: {from: 'colorcolor',default:#333}}
}
  • vue3

父组件

import { provide } from'vue';
provide('money',money)
provide('changeMoneyFn',number=>{
    money.value-=number
})

子孙组件

import { inject } from"vue";
const money =inject('money')
const changeMoneyFn=inject('changeMoneyFn')

7. mitt/ event-bus

  • event-bus

/* eventbus.js 暴露总结总线文件 */// 这里我们在js中暴露这个事件总线对象 
import Vue from 'vue'
export default new Vue()
// 注册事件
bus.$on("getScore", data => {
    this.yoursore = data;
});
// 触发事件
bus.$emit("getScore", this.score);
  • mitt

/* eventbus.js 暴露总结总线文件 */// 这里我们在js中暴露这个事件总线对象 import mitt from"mitt"; 
const emitter = mitt(); 
exportdefault emitter;
// 注册事件import emitter from"./utils/eventbus.js";
emitter.on("getScore", data => {
    this.yoursore = data;
});
// 触发事件import emitter from"./utils/eventbus.js";
emitter.emit("getScore", this.score)

8. pina/vuex

  • vuex

声明

import { createApp } from'vue'import { createStore } from'vuex'// 创建一个新的 store 实例const store = createStore({
  state () {
    return {
      count: 0
    }
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {},
  getters: {},
  modules: {}
})

const app = createApp({ /* 根组件 */ })

// 将 store 实例作为插件安装
app.use(store)

使用

1. 直接调用
this.$store.state.name// 跨模块访问 state 数据: store.rootState.user.profile.tokenthis.$store.commit('setCount', 5) // 跨模块访问mutation方法 : store.commit('permission/setRoutes', [], { root: true })this.$store.dispatch("asyncSetCount", 5)
this.$store.getters.validList2. 计算属性调用
computed: { 
  name(){ 
    returnthis.$store.state.name; 
  },
  validList(){ 
    returnthis.$store.getters.validList;
  }
}
3. 方法调用

4. 引入辅助函数, 延展运算符展开调用
import { mapState, mapMutations, mapActions, mapGetters } from'vuex'computed: { ...mapState(['name']), ...mapGetters(['validList']) }
methods: { ...mapMutations(['setCount']), ...mapActions(['asyncSetCount']) }
5. 模块化调用
import { mapMutations } from'vuex'this.$store.state.user.tokenthis.$store.commit('user/setNewState', 666)
methods: {
...mapMutations(["user/setNewState"]),
setNewState(data) {
this['user/setNewState'](data)
}
}
6. createNamespacedHelpers 创建基于某个命名空间辅助函数
import { createNamespacedHelpers, mapGetters } from"vuex";
const { mapMutations } = createNamespacedHelpers("user");
exportdefault {
computed: {
...mapGetters(["token", "name"]),
},
methods: {
...mapMutations(["setNewState"]),
},
};
< h3 > name: { { name } }< /h3>
< button @click="setNewState(666)" > 修改数据 < /button >
  • pina

声明

import { createPinia } from'pinia'
app.use(createPinia())
import { defineStore } from'pinia'// useStore 可以是 useUser、useCart 之类的任何东西// 第一个参数是应用程序中 store 的唯一 idexportconst useStore = defineStore('main', {
 state: () => {
    return {
      // 所有这些属性都将自动推断其类型counter: 0,
    }
  },
  getters: {
    doubleCount: (state) => state.counter * 2,
  },
  actions: {
    increment() {
      this.counter++
    },
  },
})

使用

import { useStore } from'@/stores/counter'const store = useStore()
const { counter, doubleCount } = storeToRefs(store)
store.$reset() // 将状态 重置 到其初始值
store.counter++
store.$patch({
  counter: store.counter + 1,
})
store.$state = { counter: 666 }
pinia.state.value = {}

9. 路由传参

this.$router 相当于一个全局的路由器对象,包含了很多属性和对象(比如 history 对象),任何页面都可以调用其 push(), replace(), go() 等方法。

跳转带参
//字符串this.$router.push('home')

//对象this.$router.push({path:'/user/${userId}'})

//命名的路由this.$router.push({name:'user', params:{userId: '123'}})

//带查询参数,变成 /register?plan=privatethis.$router.push({path:'register', query:{plan:private}})

this.$route 表示当前路由对象,每一个路由都会有一个 route 对象,是一个局部的对象,可以获取对应的 name, path, params, query 等属性。

  • params

1. router-link导航aaaa
父组件 <router-link to="/child/123">
</router-link>
子组件 this.$route.params.num
路由配置  {path:'/child/:num',name:'child',component:Child}
地址栏  /child/123 显示参数,刷新不丢失

2.$router.push跳转
父组件 
<li @click='this.$router.push({path:'/child/${itemId}'})'> </li>
子组件 this.$route.params.id
路由配置  {path:'/child/:id',name:'child',component:Child}
地址栏  /child/1 显示参数,刷新不丢失

3.通过name确定路由,params传参
父组件 
<li @click='this.$router.push({name:'child',params:{id:1}})'> </li>
子组件 this.$route.params.id
路由配置  {path:'/child',name:'child',component:Child}
地址栏  /child  不显示参数,刷新丢失
  • query

1.path匹配路由,通过query传参
父组件 
<li @click='this.$router.push({path:'/child',query:{id:1}})'> </li>
子组件 this.$route.query.id
路由配置  {path:'/child',name:'child',component:Child}
地址栏  /child?id=1  显示参数,刷新不丢失
  • path

获取当前路由地址
this.$route.path
  • meta

获取路由meta属性值
this.$route.meta

10. 全局变量

将属性挂载到window对象

window.myName = 'fish'// window['mayName'] = 'fish'

11. 本地存储

  • LocalStorage

// 存储数据localStorage.setItem("info",JSON.stringify(info));
// 获取数据const info = JSON.parse(localStorage.getItem("info"));
// 移除数据localStorage.removeItem("info");
// 清除localStorage.clear()
  • SessionStorage文章来源地址https://www.toymoban.com/news/detail-689305.html

// 存储数据
sessionStorage.setItem("info",JSON.stringify(info));
// 获取数据const info = JSON.parse(sessionStorage.getItem("info"));
// 移除数据
sessionStorage.removeItem("info");
// 清除
sessionStorage.clear()

到了这里,关于Vue 11种组件传参方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 组件传参

    原理: 通过第三个“东西”,一个往里写,一个读取。 方案:Mitt.js Mitt.js 安装及使用方法 安装 包的官网: https://www.npmjs.com/package/mitt 封装: 在项目src目录下新建一个 bus文件夹,里面再建一个bus.ts文件,用来存放咱们的EventBusa事件总线。在 bus.ts 文件中,封装代码。 简单: 复杂点

    2024年04月26日
    浏览(38)
  • 【vue3】vue3中父子组件传参:

    一、父传子: 【1】父组件传值: 【2】子组件接收: 二、父调用子方法: 【1】父组件调用: 【2】子组件暴露: 三、子组件发送emit方法给父组件: 【1】父组件: 【2】子组件调用:

    2024年02月13日
    浏览(42)
  • VUE3父子组件传参

    父传子 父组件 template    sonComponent :sendValue=\\\"value(//传递的值)\\\"/sonComponent /template //引入组件 import sonComponent from \\\"XXXXX\\\"; 子组件 //定义名字与父组件对应 const props = defineProps({   sendValue:{type: String,default:\\\'\\\'}  }) 子传父 子组件 // 定义发送 const emit = defineEmits([\\\'sendValue\\\']) //发送(在想

    2024年02月07日
    浏览(44)
  • vue路由传参(六种方式)

    1.query传参:         query传参,通过get传参也就是原始传参,在path路径后面跟上?id=18name=“张三”,会传递到query里面         实例: {                 path:\\\'/home\\\'?name=\\\'张三\\\'age=18,                 component:()=import(\\\'./home.vue\\\')            }         通过$ro

    2024年02月13日
    浏览(35)
  • VUE路由传参的实用方式

    本文讲解了VUE项目中路由之间的传值方式,涉及到的方法都是开发时常用的,希望对大家有多帮助。 首先定义好路由 在需要跳转的home组件中使用 router-link 标签 在跳转到的about组件中拿到传过来的值 小结:params传参类似post,路由配置可以为  path : \\\'/about/ : id’ 或   path :

    2024年02月08日
    浏览(55)
  • Vue3中props传参(多种数据类型传参方式)

    在Vue3中,`props`接收的`type`类型有以下几种: 1. String:字符串类型 2. Number:数字类型 3. Boolean:布尔类型 4. Array:数组类型 5. Object:对象类型 6. Date:日期类型 7. Function:函数类型 8. Symbol:符号类型 9. [Custom Types]:自定义类型 你也可以使用数组形式来表示多种类型的

    2024年02月03日
    浏览(46)
  • Vue学习笔记11--路由2(路由传参/命名路由)

    路由的query参数 传递参数 接收参数 作用:可以简化路由的跳转 使用方法 给路由命名: 简化跳转 配置路由,声明接收params参数 传递参数 特别注意:路由携带params参数时,若使用to对象写法,则不能使用path配置项,必须使用name配置! 接收参数 作用:让路由组件更方便的收到

    2024年01月24日
    浏览(41)
  • vue路由传参的三种方式

    目录 1.动态路由传参 2.params传参 3.query传参         使用“路径参数”使用冒号  :  标记。当匹配到一个路由时,参数值会被设置到  this.$route.params ,也可以使用props来接收   params  传参(不显示参数)也可分为 声明式 和 编程式 两种方式,与方式一不同的是,这里是通过

    2024年02月11日
    浏览(40)
  • Vue前端框架10 组件的组成、组件嵌套关系、组件的注册方式、组件传递数据(props $emit)、数组传递多种数据类型、组件传递props校验、组件事件

    组件最大的优势就是可复用性 通常将组件定义在.vue中,也就是SFC单文件组件 组件的基本组成: 组件允许我们将UI划分为独立的、可重用的部分,并且对每个部分单独思考 实际应用中组件常常被组件成层层嵌套的树状结构 Vue组件使用前要注册,注册有两种方式:全局注册和

    2024年02月09日
    浏览(51)
  • vue中组件传参的几种方法

    Props:通过在父组件中定义props属性,将数据传递给子组件。子组件通过props属性接收数据。例如: $emit:通过在子组件中触发事件,将数据传递给父组件。父组件通过在子组件上监听事件,接收数据。例如: Provide/Inject:通过在父组件中提供数据,让子孙组件可以注入数据。

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包