vue2.0组件通信各种情况总结与实例分析

Props在vue组件中各种角色总结

在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下:

使用props传递数据---组件内部

//html
<div id="app1">
    <i>注意命名规定:仅在html内使用my-message</i>
    <child my-message="组件内部数据传递"></child>
</div>
//js
<script>
    Vue.component(‘child‘, {
        props: [‘myMessage‘],
        template: ‘<mark>{{ myMessage }}<mark/>‘
    });
    new Vue({
        el: ‘#app1‘
    })
</script>

动态props通信---组件与根节点(父子之间)

<div id="app2">
    <input v-model="parentMsg">
    <br>
    <child :parent-msg="parentMsg"></child>
</div>
<script>
    Vue.component(‘child‘, {
        props: [‘parentMsg‘],
        template: ‘<mark>{{ parentMsg }}<mark/>‘
    });
    new Vue({
        el: ‘#app2‘,
        data: {
            parentMsg: ‘msg from parent!‘
        }
    })
</script>
  • 对比分析:
  • 例子1:
    <comp some-prop="1"></comp>
    //组件内部数据传递,对应字面量语法:传递了一个字符串"1" 
  • 例子2:
    <comp v-bind:some-prop="1"></comp>
    //组件与根节点数据传递,对应动态语法:传递实际的数字:js表达式 

    单向数据流动特点:父组件属性变化时将传导给子组件,反之不可

  • 两种改变prop情况
  • 注意在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。
    //定义一个局部data属性,并将 prop 的初始值作为局部数据的初始值
    props: [‘initialCounter‘],
            data: function () {
            return { counter: this.initialCounter }
            }
    //定义一个局部computed属性,此属性从 prop 的值计算得出
     props: [‘size‘],
            computed: {
            normalizedSize: function () {
            return this.size.trim().toLowerCase()
            }
            }

    子组件索引

    尽管有 props 和 events ,但是有时仍然需要在 JavaScript 中直接访问子组件。为此可以使用 ref 为子组件指定一个索引 ID

    <div id="parent">
    <!-- vm.$refs.p will be the DOM node -->
    <b ref="p">hello</b>
    <!-- vm.$refs.child will be the child comp instance -->
    <user-profile v-for=‘i in 3‘ ref="profile"></user-profile>
    </div>
    <script>
    var userPf=Vue.component(‘user-profile‘,{
        template:‘<div>hello $refs</div>‘
    });
    var parent = new Vue({ el: ‘#parent‘ });
    // 访问子组件
    var child = parent.$refs.profile;
    console.log(child[0]);
    console.log(parent.$refs.p);
    </script>

    $refs 只在组件渲染完成后才填充,并且它是非响应式的。它仅仅作为一个直接访问子组件的应急方案——应当避免在模版或计算属性中使用 $refs 。

数据反传---自定义事件

自定义事件的根基在于每个vue实例都实现了事件接口(Event interface)
Vue的事件系统分离自浏览器的EventTarget API。尽管它们的运行类似,但是$on 和 $emit 不是addEventListener 和 dispatchEvent 的别名。
父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件

  • 监听:$on(eventName)
  • 触发:$emit(eventName)
    <div id="app3">
    <p>Look at the parent‘s data: <mark>{{t}}</mark> & the child‘s data: <mark>{{childWords}}</mark></p>
    <child v-on:add="pChange"></child>
    <child v-on:add="pChange"></child>
    <child v-on:click.native="native"></child>
    </div>
    <script>
    Vue.component(‘child‘, {
        template: `<button @click="add">{{ c }}</button>`,
        data: function () {
            return {
                c: 0,
                msg: ‘I am from child\‘s data‘
            }
        },
        methods: {
            add: function () {
                this.c += 1;
                this.$emit(‘add‘,this.msg);
            }
        },
    });
    new Vue({
        el: ‘#app3‘,
        data: {
            t: 0,
            childWords: ‘‘
        },
        methods: {
            pChange: function (msg) {
                this.t += 1;
                this.childWords=msg;
            },
            native:function () {
                alert(‘I am a native event ,which comes from the root element!‘);
            }
        }
    })
    </script>

    兄弟间通信---简单场景用bus,复杂场景用vuex

<div id="app4">
    <display></display>
    <increment></increment>
</div>
<script>
    var bus = new Vue();
    Vue.component(‘increment‘, {
        template: `<button @click="add">+</button>`,
        data: function () {
            return {count: 0}
        },
        methods: {
            add: function () {
                bus.$emit(‘inc‘, this.count+=1)
            }
        }
    });
    Vue.component(‘display‘, {
        template: `<span>Clicked: <mark>{{c}}</mark> times</span>`,
        data: function () {
            return {c: 0}
        },
        created: function () {
            var self=this;
//            bus.$on(‘inc‘, function (num) {
//                self.c = num
//            });
            bus.$on(‘inc‘,  (num) =>
                this.c = num
            );
        }
    });
    vm = new Vue({
        el: "#app4",
    })
</script>

总结:Vue中关于组件间及组件与根节点间通信都可以人为是父子兄弟间的通信,另外父子关系是相对的即与上下文有关(比如A组件的父组件可能是B组件的子组件);上述四个例子分别演示了不同组件通信的机制。

时间: 2024-10-12 21:10:30

vue2.0组件通信各种情况总结与实例分析的相关文章

vue2.0 组件通信

1.index.html  子组件直接修改父组件的数据 组件通讯: vm.$emit(); vm.$on(); 父组件和子组件: 子组件想要拿到父组件数据: 通过 props 之前,子组件可以更改父组件信息,可以是同步 sync 现在,不允许直接给父级的数据,做赋值操作 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>

通信vue2.0组件

vue2.0组件通信各种情况总结与实例分析 Props在vue组件中各种角色总结 在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下: 使用props传递数据---组件内部 //html <div id="app1"> <i>注意命名规定:仅在html内使用my-message</i> <child my-message="组件内部数据传递"></child&

vue2.0组件之间的传值--新入坑,请指教

prop down   emit up 嘿嘿    如果是第一次接触vue2.0组件传值的肯定很疑惑,这是什么意思(大神总结的,我也就是拿来用用) "down"->指的是下的意思,即父组件向子组件传值,用props:"up"->指的是上的意思,即子组件想父组件传值,用emit. 1.子组件向父组件的传值: Child.vue <template> <div class="child"> <h1>子组

Vue2.0组件注册

//全局注册: Vue.component("my-component",{ template:'<div>A custom component!</div>' }); /*交换位置会报错----创建组件必须在根实例化之前*/ //创建根实例: new Vue({ el:"#app" }) --------- //局部注册: new Vue({ el: "#app1", components: { // <my-zu

Vue2.0组件之间通信

Vue中组件这个特性让不少前端er非常喜欢,我自己也是其中之一,它让前端的组件式开发更加合理和简单.笔者之前有写过一篇Vue2.0子父组件通信,这次我们就来聊一聊平级组件之间的通信. 首先我们先搭好开发环境,我们先得装好git和npm这两个工具(如果有不清楚的同学请自行百度哦) 环境搭建步骤: 打开git ,运行 npm install --global vue-cli 这是安装vue的命令行 vue init webpack vue-demo 这是vue基于webpack的模板项目 cd vu

vue2.0组件快速入门

前言 最近开始在学vue相关的内容.组件这章的内容比较多.看了http://www.cnblogs.com/keepfool/p/5625583.html这篇博客,博主总结的还比较全面也挺清晰,可是这篇博客的知识点跟实例都是基于vue 1.0版本的,所以参考这篇博客,我将vue2.0版本中的相关知识点做了一个总结.算是自己学习的一个笔记 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.我们可以将组件看成是封装好的HT

vue29-vue2.0组件通信_recv

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>智能社--http://www.zhinengshe.com</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, ma

Vue2.0组件间数据传递

Vue1.0组件间传递 使用$on()监听事件: 使用$emit()在它上面触发事件: 使用$dispatch()派发事件,事件沿着父链冒泡: 使用$broadcast()广播事件,事件向下传导给所有的后代 Vue2.0后$dispatch(),$broadcast()被弃用,见https://cn.vuejs.org/v2/guide/migration.html#dispatch-和-broadcast-替换 1,父组件向子组件传递场景:Father上一个输入框,根据输入传递到Child组件

EventBus3.0 组件通信框架源码学习总结

一.初始化 EventBus的初始化虽然用了单例模式,但是构造方法居然是public修饰符,可能是应对项目中的多线操作. //单例模式,针对并发情况进行了双层判断 public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance == null) { defaultInstance = new EventBus(); }