zoukankan      html  css  js  c++  java
  • Vue组件之间传值

    1.Vue组件之间传值

    1.1父组件向子组件传值

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

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

    • 父组件发送的形式是以属性的形式绑定值到子组件身上。

    • 然后子组件用属性props接收

    • 在props中使用驼峰形式,模板中需要使用短横线的形式字符串形式的模板中没有这个限制

       <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中使用驼峰形式,模板中需要使用短横线的形式

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

    <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.子组件通过自定义事件向父组件传递信息

        <button @click='$emit("enlarge-text",5)'>扩大父组件中内容的字体大小</button>

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

        <menu-item :msg='msg' @enlarge-text='handel($event)'></menu-item>
    • 子组件用$emit()触发事件

    • $emit()  第一个参数为 自定义的事件名称     第二个参数为需要传递的数据

    • 父组件用v-on 监听子组件的事件

    <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()方法名销毁之后无法进行传递数据

    <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>
  • 相关阅读:
    阿里HBase高可用8年“抗战”回忆录
    Service Mesh 初体验
    阿里云HBase推出普惠性高可用服务,独家支持用户的自建、混合云环境集群
    Ververica Platform-阿里巴巴全新Flink企业版揭秘
    深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?
    AI加持的阿里云飞天大数据平台技术揭秘
    Nacos 常见问题及解决方法
    数据上云,应该选择全量抽取还是增量抽取?
    一文带你了解 Flink Forward 柏林站全部重点内容
    Oracle数据库中序列(SEQUENCE)的用法详解
  • 原文地址:https://www.cnblogs.com/bky-/p/14081071.html
Copyright © 2011-2022 走看看