前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue组件之间传值

Vue组件之间传值

作者头像
梨涡浅笑
发布2022-01-06 14:27:10
1.2K0
发布2022-01-06 14:27:10
举报
文章被收录于专栏:全栈自学笔记全栈自学笔记

1.Vue组件之间传值

1.1父组件向子组件传值

  1.组件内部通过props接收传递过来的值

  2.父组件通过属性将值传递给子组件

  • 父组件发送的形式是以属性的形式绑定值到子组件身上。
  • 然后子组件用属性props接收
  • 在props中使用驼峰形式,模板中需要使用短横线的形式字符串形式的模板中没有这个限制
代码语言:javascript
复制
 <div id="app">
    <div>{{pmsg}}</div>
     <!--1、menu-item  在 APP中嵌套着 故 menu-item   为  子组件      -->
     <!-- 给子组件传入一个静态的值 -->
    <menu-item title='来自父组件的值'></menu-item>
    <!-- 2、 需要动态的数据的时候 需要属性绑定的形式设置 此时 ptitle  来自父组件data 中的数据 . 
          传的值可以是数字、对象、数组等等
    -->
    <menu-item :title='ptitle' content='hello'></menu-item>
  </div>
​
  <script type="text/javascript">
    Vue.component('menu-item', {
      // 3、 子组件用属性props接收父组件传递过来的数据  
      props: ['title', 'content'],
      data: function() {
        return {
          msg: '子组件本身的数据'
        }
      },
      template: '<div>{{msg + "----" + title + "-----" + content}}</div>'
    });
    var vm = new Vue({
      el: '#app',
      data: {
        pmsg: '父组件中内容',
        ptitle: '动态绑定属性'
      }
    });
  </script>

3.props属性名规则

在props中使用驼峰形式,模板中需要使用短横线的形式

字符串形式的模板中没有这个限制

代码语言:javascript
复制
<body>
    <div id="app">
        <!-- <div>{{msg}}</div> -->
        <!-- <menu-item title="来自父组件中的内容"></menu-item> -->
        <!-- 在props中使用驼峰形式,模板中需要使用短横线的形式 -->
        <menu-item :menu-Item='emsg'></menu-item>
​
    </div>
    <script src="vue.js"></script>
    <script>
        Vue.component('third-item', {
            props: ['textItem'],
            template: '<div>{{textItem}}</div>'
        });
        Vue.component('menu-item', {
            props: ['menuItem'],
            // 字符串形式的模板中没有这个限制
            template: '<div>{{menuItem}}<third-item textItem="hello"></third-item></div>'
        });
        var vm = new Vue({
            el: '#app',
            data: {
                msg: '父组件',
                emsg: '我是动态绑定属性',
                pmsg: 'abc'
            },
            methods: {
​
            }
        })
    </script>
</body>
1.2子组件向父组件传值

  1.子组件通过自定义事件向父组件传递信息

代码语言:javascript
复制
    <button @click='$emit("enlarge-text",5)'>扩大父组件中内容的字体大小</button>

  2.父组件监听子组件的事件

代码语言:javascript
复制
    <menu-item :msg='msg' @enlarge-text='handel($event)'></menu-item>
  • 子组件用$emit()触发事件
  • $emit() 第一个参数为 自定义的事件名称 第二个参数为需要传递的数据
  • 父组件用v-on 监听子组件的事件
代码语言:javascript
复制
<body>
    <div id="app">
​
        <div :style='{fontSize: fontSize + "px"}'>{{msg}}</div>
        <!-- 2 父组件用v-on 监听子组件的事件
        这里 enlarge-text  是从 $emit 中的第一个参数对应   handle 为对应的事件处理函数 
    -->
        <menu-item :msg='msg' @enlarge-text='handel($event)'></menu-item>
    </div>
    <script src="vue.js"></script>
    <script>
        /*
      子组件向父组件传值-携带参数
    */
        Vue.component('menu-item', {
            props: [],
            /* 
                 1、子组件用$emit()触发事件
                第一个参数为 自定义的事件名称   第二个参数为需要传递的数据
             */
            template: `
                <div> 
                   <button @click='$emit("enlarge-text",5)'>扩大父组件中内容的字体大小</button>
                   <button @click='$emit("enlarge-text",12)'>扩大父组件中内容的字体大小</button>
                
                </div>
            `
        })
        var vm = new Vue({
            el: '#app',
            data: {
                msg: '父组件中的内容',
                fontSize: 10
            },
            methods: {
                handel: function (val) {
                    // 扩大字体大小
                    this.fontSize += val;
                }
            }
        })
    </script>
</body>
​
1.3非父子组件间传值-兄弟之间的传递

  1.单独的事件中心管理组件间的通信

    var hub = new Vue();

  2.监听事件与销毁事件

hub.$on('jerry-event', jerryEvent)

    hub.$off('jerry-event');

  • 兄弟之间传递数据需要借助于事件中心,通过事件中心传递数据
    • 提供事件中心 var hub = new Vue()
  • 传递数据方,通过一个事件触发hub.$emit(方法名,传递的数据)
  • 接收数据方,通过mounted(){} 钩子中 触发hub.$on()方法名
  • 销毁事件 通过hub.$off()方法名销毁之后无法进行传递数据
代码语言:javascript
复制
<body>
    <div id="app">
        <div>{{msg}}</div>
        <div>
            <button v-on:click="handel">销毁事件</button>
        </div>
        <tom-item></tom-item>
        <jerry-item></jerry-item>
    </div>
    <script src="vue.js"></script>
    <script>
        /* 兄弟组件之间的传递 */
        //1、 提供事件中心
        var hub = new Vue();
        Vue.component("tom-item", {
            data: function () {
                return {
                    num: 0
                }
            },
            template: `
                <div>
                    <span>Tom:{{num}}</span>
                    <div>
                        <button @click='handel'>点击</button>
                    </div>
                </div>
            `,
            methods: {
                handel: function () {
                    //2、传递数据方,通过一个事件触发hub.$emit(方法名,传递的数据)   触发兄弟组件的事件
                    hub.$emit('jerry-event', 1);
                }
            },
            mounted: function () {
                // 3、接收数据方,通过mounted(){} 钩子中  触发hub.$on()方法名
                hub.$on('tom-event', (val) => {
                    this.num += val;
                })
            }
        });
        Vue.component("jerry-item", {
            data: function () {
                return {
                    num: 0
                }
            },
            template: `
                <div>
                    <span>Jerry:{{num}}</span>
                    <div>
                        <button @click='handel'>点击</button>
                    </div>
                </div>
            `,
            methods: {
                handel: function () {
                    hub.$emit('tom-event', 2)
                }
            },
            mounted: function () {
                // 监听事件
                hub.$on('jerry-event', (val) => {
                    this.num += val;
                })
​
            }
        });
        var vm = new Vue({
            el: '#app',
            data: {
                msg: '父组件'
            },
            methods: {
                handel: function () {
                    //4、销毁事件 通过hub.$off()方法名销毁之后无法进行传递数据  
                    hub.$off('tom-event');
                    hub.$off('jerry-event');
                }
            }
        })
    </script>
</body>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Vue组件之间传值
    • 1.1父组件向子组件传值
      • 1.2子组件向父组件传值
        • 1.3非父子组件间传值-兄弟之间的传递
        相关产品与服务
        事件总线
        腾讯云事件总线(EventBridge)是一款安全,稳定,高效的云上事件连接器,作为流数据和事件的自动收集、处理、分发管道,通过可视化的配置,实现事件源(例如:Kafka,审计,数据库等)和目标对象(例如:CLS,SCF等)的快速连接,当前 EventBridge 已接入 100+ 云上服务,助力分布式事件驱动架构的快速构建。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档