美文网首页Vue
非父子组件间传值(Bus/总线/发布订阅模式/观察者模式)

非父子组件间传值(Bus/总线/发布订阅模式/观察者模式)

作者: 程序员同行者 | 来源:发表于2018-07-12 18:35 被阅读4次
    <!DOCTYPE html>
    <html>
    <head>
        <title>非父子组件间传值(Bus/总线/发布订阅模式/观察者模式)</title>
        <script src="./vue.js"></script>
    </head>
    <body>
        <!-- // 功能,实现页面上点击dell,lee也会变成dell,点击lee,dell也改成lee -->
        <div id='app'>
            <child content="Dell"></child>
            <child content="Lee"></child>
        </div>
    <script>
        // 给Vue实例的prototype绑定个bus属性(全局),之后其他组件和实例下都可以使用这个bus属性
        Vue.prototype.bus = new Vue()
    
        Vue.component('child',{
            // 子组件中data属性必须为函数
            // 子组件中不能去修改父实例传进来的值,如非要修改,就定义个data函数 把传的值在组件内部保存下就行了
            data: function() {
                return {
                    selfContent: this.content
                }
            },
            props: {
                // 对传进来的参数进行校验
                content: {
                // 必须为字符串
                 type: String,
                 // 必填
                 required: true
                }
                //
                
            },
            template: '<div @click="handleClick">{{selfContent}}</div>',
            methods: {
                handleClick: function() {
                    // 向外层触发事件并传递一个参数
                this.bus.$emit('change',this.selfContent)
            }
            },
            // 定义个生命周期钩子函数,当页面元素有变动的时候执行
            mounted: function() {
                var this_ = this
                this.bus.$on('change', function(msg) {
                    console.log(msg)
                    // 触发事件,执行操作
                    this_.selfContent = msg
                })
            }
        })  
        var vm =  new Vue({
            el:'#app',
        })
    </script>
    </body>
    </html>
    

    相关文章

      网友评论

        本文标题:非父子组件间传值(Bus/总线/发布订阅模式/观察者模式)

        本文链接:https://www.haomeiwen.com/subject/fewrpftx.html