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


Posted in Javascript onMarch 22, 2017

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 来监听子组件触发的事件

  1. 监听:$on(eventName)
  2. 触发:$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组件的子组件);上述四个例子分别演示了不同组件通信的机制。

澄清了上述问题不难理这句话:

编译作用域---父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。分发内容是在父组件作用域内编译

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中更短的 Array 类型转换
Oct 30 Javascript
利用cookie记住背景颜色示例代码
Nov 04 Javascript
javascript判断chrome浏览器的方法
Mar 26 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 Javascript
浅谈javascript中return语句
Jul 15 Javascript
jQuery toggle 代替方法
Mar 22 Javascript
微信小程序 教程之注册程序
Oct 17 Javascript
node.js+jQuery实现用户登录注册AJAX交互
Apr 28 jQuery
利用JavaScript对中文(汉字)进行排序实例详解
Jun 18 Javascript
vue 中滚动条始终定位在底部的方法
Sep 03 Javascript
vue cli 3.0 搭建项目的图文教程
May 17 Javascript
JavaScript 与 TypeScript之间的联系
Nov 27 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
Mar 22 #Javascript
Vue计算属性的学习笔记
Mar 22 #Javascript
Angular2实现自定义双向绑定属性
Mar 22 #Javascript
Bootstrap如何激活导航状态
Mar 22 #Javascript
Bootstrap超大屏幕的实现代码
Mar 22 #Javascript
Bootstrap缩略图的创建方法
Mar 22 #Javascript
JS+DIV实现的卷帘效果示例
Mar 22 #Javascript
You might like
海贼王:最美的悬赏令!
2020/03/02 日漫
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
简单实现js浮动框
2016/12/13 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
JavaScript实现类似淘宝的购物车效果
2017/03/16 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
JS中this的指向以及call、apply的作用
2018/05/06 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
PyQt5每天必学之事件与信号
2018/04/20 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
python贪吃蛇游戏代码
2020/04/18 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
小加工厂管理制度
2014/01/21 职场文书
小学校园活动策划
2014/01/30 职场文书
写自荐信的注意事项
2014/03/09 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android