广告
返回顶部
首页 > 资讯 > 精选 >vue组件如何传值
  • 617
分享到

vue组件如何传值

2023-07-04 23:07:33 617人浏览 八月长安
摘要

这篇文章主要介绍“Vue组件如何传值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue组件如何传值”文章能帮助大家解决问题。传值方法:1、利用props实现父传子;2、子传父,需要自定义事件,在子

这篇文章主要介绍“Vue组件如何传值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue组件如何传值”文章能帮助大家解决问题。

传值方法:1、利用props实现父传子;2、子传父,需要自定义事件,在子组件中用“this.$emit(‘事件名’)”触发,而父中用“@事件名”监听;3、兄弟间,通过公有父元素作为桥接,结合父子props传参、子父自定义事件;4、用路由传值;5、用$ref传值;6、用依赖注入传给后代子孙曾孙;7、利用$attrs;8、借助$listeners中间事件;9、用$parent传等。

vue组件传值的10种方式,常用的也有五六种,先上一张总结图:

vue组件如何传值

1、父组件传给子组件

在子组件里定义一个props,即props:[‘msg’],msg可以是对象也可以是基本数据类型

如果你想定义一个默认值,即 props:{msg: {type: String, default: ‘hello world’}},
若默认值是对象类型:props: { msg: { type: Object, default: () => { return { name: ‘dan_seek’ } } }}

需要注意的是这种传值是单向的,你无法改变父组件的值(当然引用类型例外);而且如果直接修改props的值会报一个警告。

推荐的写法是在data()里重新定义一个变量(见Children.vue),并把props赋值给它,当然计算属性也行。

Children.vue

<template>    <section>        父组件传过来的消息是:{{myMsg}}    </section></template><script>    export default {        name: "Children",        components: {},        props:['msg'],        data() {            return {                myMsg:this.msg            }        },        methods: {}    }</script>

Parent.vue

<template>  <div class="parent">    <Children :msg="message"></Children>  </div></template><script>import Children from '../components/Children'export default {  name: 'Parent',  components: {      Children  },  data() {      return {          message:'hello world'}},}</script>

2、子组件传给父组件

这里需要使用自定义事件,在子组件中使用this.$emit(‘myEvent’) 触发,然后在父组件中使用@myEvent监听

Children.vue

<template>    <div class="parent">        这里是计数:{{parentNum}}        <Children-Com @addNum="getNum"></Children-Com>    </div></template><script>    import ChildrenCom from '../components/Children'    export default {        name: 'Parent',        components: {            ChildrenCom        },        data() {            return {                parentNum: 0            }        },        methods:{            // childNum是由子组件传入的            getNum(childNum){                this.parentNum = childNum            }        }    }</script>

Parent.vue

<template>    <div class="parent">        这里是计数:{{parentNum}}        <Children-Com @addNum="getNum"></Children-Com>    </div></template><script>    import ChildrenCom from '../components/Children'    export default {        name: 'Parent',        components: {            ChildrenCom        },        data() {            return {                parentNum: 0            }        },        methods:{            // childNum是由子组件传入的            getNum(childNum){                this.parentNum = childNum            }        }    }</script>

3、兄弟组件间传值

运用自定义事件emit的触发和监听能力,定义一个公共的事件总线eventBus,通过它作为中间桥梁,我们就可以传值给任意组件了。而且通过eventBus的使用,可以加深emit的理解。

EventBus.js

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

Children1.vue

<template>    <section>        <div @click="pushMsg">push message</div>        <br>    </section></template><script>    import eventBus from './EventBus'    export default {        name: "Children1",        components: {},        data() {            return {                childNum:0            }        },        methods: {            pushMsg(){            // 通过事件总线发送消息                eventBus.$emit('pushMsg',this.childNum++)            }        }    }</script>

Children2.vue

<template>    <section>        children1传过来的消息:{{msg}}    </section></template><script>    import eventBus from './EventBus'    export default {        name: "Children2",        components: {},        data() {            return {                msg: ''            }        },        mounted() {        // 通过事件总线监听消息            eventBus.$on('pushMsg', (children1Msg) => {                this.msg = children1Msg            })        }    }</script>

Parent.vue

<template>    <div class="parent">        <Children1></Children1>        <Children2></Children2>    </div></template><script>    import Children1 from '../components/Children1'    import Children2 from '../components/Children2'    export default {        name: 'Parent',        components: {            Children1,            Children2        },        data() {            return {            }        },        methods:{        }    }</script>

GitHub上还有一个开源vue-bus库,可以参考下: https://github.com/yangmingshan/vue-bus#readme

4、路由间传值

i.使用问号传值

A页面跳转B页面时使用 this.$router.push(‘/B?name=danseek’)

B页面可以使用 this.$route.query.name 来获取A页面传过来的值

上面要注意router和route的区别

ii.使用冒号传值

配置如下路由:

{    path: '/b/:name',    name: 'b',    component: () => import( '../views/B.vue')  },

在B页面可以通过 this.$route.params.name 来获取路由传入的name的值

iii.使用父子组件传值

由于router-view本身也是一个组件,所以我们也可以使用父子组件传值方式传值,然后在对应的子页面里加上props,因为type更新后没有刷新路由,所以不能直接在子页面的mounted钩子里直接获取最新type的值,而要使用watch。

<router-view :type="type"></router-view>
// 子页面......props: ['type']......watch: {            type(){                // console.log("在这个方法可以时刻获取最新的数据:type=",this.type)            },        },

5、使用$ref传值

通过$ref的能力,给子组件定义一个ID,父组件通过这个ID可以直接访问子组件里面的方法和属性

首先定义一个子组件Children.vue

<template>    <section>        传过来的消息:{{msg}}    </section></template><script>    export default {        name: "Children",        components: {},        data() {            return {                msg: '',                desc:'The use of ref'            }        },        methods:{            // 父组件可以调用这个方法传入msg            updateMsg(msg){                this.msg = msg            }        },    }</script>

然后在父组件Parent.vue中引用Children.vue,并定义ref属性

<template>    <div class="parent">        <!-- 给子组件设置一个ID ref="children" -->        <Children ref="children"></Children>        <div @click="pushMsg">push message</div>    </div></template><script>    import Children from '../components/Children'    export default {        name: 'parent',        components: {            Children,        },        methods:{            pushMsg(){                // 通过这个ID可以访问子组件的方法                this.$refs.children.updateMsg('Have you received the clothes?')                // 也可以访问子组件的属性                console.log('children props:',this.$refs.children.desc)            }        },    }</script>

6、使用依赖注入传给后代子孙曾孙

假设父组件有一个方法 getName(),需要把它提供给所有的后代

provide: function () {  return {    getName: this.getName()  }}

provide 选项允许我们指定我们想要提供给后代组件的数据/方法

然后在任何后代组件里,我们都可以使用 inject 来给当前实例注入父组件的数据/方法:

inject: ['getName']

Parent.vue

<template>    <div class="parent">        <Children></Children>    </div></template><script>    import Children from '../components/Children'    export default {        name: 'Parent',        components: {            Children,        },        data() {            return {                name:'dan_seek'            }        },        provide: function () {            return {                getName: this.name            }        },    }</script>

Children.vue

<template>    <section>        父组件传入的值:{{getName}}    </section></template><script>    export default {        name: "Children",        components: {},        data() {            return {            }        },        inject: ['getName'],    }</script>

7、祖传孙 $attrs

正常情况下需要借助父亲的props作为中间过渡,但是这样在父亲组件就会多了一些跟父组件业务无关的属性,耦合度高,借助$attrs可以简化些,而且祖跟孙都无需做修改

GrandParent.vue

<template>    <section>        <parent name="grandParent" sex="男" age="88" hobby="code" @sayKnow="sayKnow"></parent>    </section></template><script>    import Parent from './Parent'    export default {        name: "GrandParent",        components: {          Parent        },        data() {            return {}        },        methods: {          sayKnow(val){            console.log(val)          }        },        mounted() {        }    }</script>

Parent.vue

<template>  <section>    <p>父组件收到</p>    <p>祖父的名字:{{name}}</p>    <children v-bind="$attrs" v-on="$listeners"></children>  </section></template><script>  import Children from './Children'  export default {    name: "Parent",    components: {      Children    },    // 父组件接收了name,所以name值是不会传到子组件的    props:['name'],    data() {      return {}    },    methods: {},    mounted() {    }  }</script>

Children.vue

<template>  <section>    <p>子组件收到</p>    <p>祖父的名字:{{name}}</p>    <p>祖父的性别:{{sex}}</p>    <p>祖父的年龄:{{age}}</p>    <p>祖父的爱好:{{hobby}}</p>    <button @click="sayKnow">我知道啦</button>  </section></template><script>  export default {    name: "Children",    components: {},    // 由于父组件已经接收了name属性,所以name不会传到子组件了    props:['sex','age','hobby','name'],    data() {      return {}    },    methods: {      sayKnow(){        this.$emit('sayKnow','我知道啦')      }    },    mounted() {    }  }</script>

显示结果

父组件收到祖父的名字:grandParent子组件收到祖父的名字:祖父的性别:男祖父的年龄:88祖父的爱好:code

8、孙传祖

借助$listeners中间事件,孙可以方便的通知祖,代码示例见7

9、$parent

通过parent可以获父组件实例,然后通过这个实例就可以访问父组件的属性和方法,它还有一个兄弟root,可以获取根组件实例。

语法:

// 获父组件的数据this.$parent.foo// 写入父组件的数据this.$parent.foo = 2// 访问父组件的计算属性this.$parent.bar// 调用父组件的方法this.$parent.baz()

于是,在子组件传给父组件例子中,可以使用this.$parent.getNum(100)传值给父组件。

10、sessionStorage传值

sessionStorage 是浏览器的全局对象,存在它里面的数据会在页面关闭时清除 。运用这个特性,我们可以在所有页面共享一份数据。

语法:

// 保存数据到 sessionStoragesessionStorage.setItem('key', 'value');// 从 sessionStorage 获取数据let data = sessionStorage.getItem('key');// 从 sessionStorage 删除保存的数据sessionStorage.removeItem('key');// 从 sessionStorage 删除所有保存的数据sessionStorage.clear();

注意:里面存的是键值对,只能是字符串类型,如果要存对象的话,需要使用 let objStr = JSON.stringify(obj) 转成字符串然后再存储(使用的时候 let obj = JSON.parse(objStr) 解析为对象)。

这样存对象是不是很麻烦呢,推荐一个库 Good-storage ,它封装了sessionStorage ,可以直接用它的api存对象

// localStorage storage.set(key,val)  storage.get(key, def)  // sessionStorage storage.session.set(key, val) storage.session.get(key, val)

关于“vue组件如何传值”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: vue组件如何传值

本文链接: https://www.lsjlt.com/news/348122.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue组件如何传值
    这篇文章主要介绍“vue组件如何传值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue组件如何传值”文章能帮助大家解决问题。传值方法:1、利用props实现父传子;2、子传父,需要自定义事件,在子...
    99+
    2023-07-04
  • vue父组件如何向子组件传值
    vue父组件向子组件传值的方法:vue父组件是通过props向子组件传值的,示例如下:父组件调用子组件时,绑定动态属性。<v-header :title='title' :homemsg='...
    99+
    2022-10-22
  • vue中父组件如何给子组件传值
    小编给大家分享一下vue中父组件如何给子组件传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一般情况下我们父子之间的传值用的是...
    99+
    2022-10-19
  • vue如何自定义组件传值
    本篇内容介绍了“vue如何自定义组件传值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!自定义组件传值常规prop-event父组件<p...
    99+
    2023-07-04
  • vue父子组件间如何传值
    本文小编为大家详细介绍“vue父子组件间如何传值”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue父子组件间如何传值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。父组件传递方法首先,在Vue中父组件向子组件传...
    99+
    2023-07-06
  • vue组件怎么传值
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。本篇文章带大家聊聊vue组件传值的10种方式,常用的也有五六种,先上一张总结图:1、父组件传给子组件在子组件里定义一个props,即props:[‘msg’],msg可以...
    99+
    2023-05-14
    Vue vue组件传值
  • vue如何实现父子组件传值
    小编给大家分享一下vue如何实现父子组件传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!父子组件传值<!DOCTYPE&...
    99+
    2022-10-19
  • Vue祖孙组件如何实现传值
    目录先看基础$props$attrs$listeners祖传孙1. $props 链2. $attrs孙传祖$listeners总结先看基础 祖孙组件,也就是 3 层嵌套的组件。关于...
    99+
    2023-03-24
    Vue祖孙组件 Vue传值 Vue组件
  • vue组件传值的方式
    vue组件传值的方式:1、父传子;2、子传父;3、兄弟传值;4、问号传值,冒号传值和父子组件传值;5、使用“$ref”传值;6、使用“inject”给当前实例注入父组件的数据;7、祖传孙;8、孙传祖;9、$parent;10、session...
    99+
    2023-07-18
  • Vue和React组件间如何实现传值
    这篇文章主要讲解了“Vue和React组件间如何实现传值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue和React组件间如何实现传值”吧!组件间的传值方式组件的传值场景无外乎以下几种:...
    99+
    2023-07-04
  • Vue中如何实现父子组件传值
    Vue中如何实现父子组件传值,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(一)传递数值1.子组件:Header.vue<templat...
    99+
    2022-10-19
  • Vue中父子组件如何实现传值
    目录前言一、将子组件引入父组件二、父组件如何传值给子组件三、子组件如何接收父组件传过来的值并使用(props)四、子组件如何传值给父组件($emit)五、父组件使用子组件传过来的值总...
    99+
    2023-01-28
    Vue父子组件 Vue组件传值 Vue父子组件传值
  • vue子组件如何使用父组件传过来的值
    目录子组件使用父组件传过来的值父组件子组件vue子组件调用父组件数据子组件使用父组件传过来的值 父组件 <alarmstatistics :roless.sync="role"...
    99+
    2022-11-13
  • vue如何实现父组件向子组件进行传值
    这篇文章给大家分享的是有关vue如何实现父组件向子组件进行传值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。父组件向子组件进行传值:在子组件绑定父的数据,子组件通过props接受参数。接下来我们通过一个例子,说明...
    99+
    2023-06-17
  • vue如何实现子组件向父组件进行传值
    这篇文章主要为大家展示了“vue如何实现子组件向父组件进行传值”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现子组件向父组件进行传值”这篇文章吧。子组件向父组件进行传值:父组件内设置...
    99+
    2023-06-17
  • 浅析vue中的组件传值
    目录一、正向传值验证写法 props验证更多验证二、逆向传值自定义事件实现逆向传值三、同胞传值/兄弟传值low的方式(了解)中央事件总线 eventBus前言: 只要是做项目,组件和...
    99+
    2022-11-13
  • vue中子组件怎么向父组件传值
    vue中子组件怎么向父组件传值,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一,子组件主动触发事件将数据传递给父组件1,在子组件上绑定某个事件以及事件触发的函数子组件代码&...
    99+
    2023-06-20
  • vue组件传值(高级)、属性传值、反向传值、跨级传值实例详解
    目录一、属性传值——父传子二、反向传值——子传父$emit三、反向传值——子传父--sync四、反向传值&md...
    99+
    2022-11-13
  • vue中怎么实现组件传值
    这篇文章给大家分享的是有关vue中怎么实现组件传值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是,使用Vue可...
    99+
    2023-06-14
  • vue组件传值方式有哪些
    vue组件传值的方法:1、使用props传递数据,父组件通过HTML属性的方式将数据传递给子组件,子组件通过props来接收传递过来的数据;2、使用$emit触发事件传递数据,子组件使用$emit触发自定义事件,父组件通过v-on来监听子组...
    99+
    2023-07-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作