详解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 相关文章推荐
JavaScript根据数据生成百分比图和柱状图的实例代码
Jul 14 Javascript
jquery设置元素的readonly和disabled的写法
Sep 22 Javascript
用JS将搜索的关键字高亮显示实现代码
Nov 08 Javascript
Jquery中children与find之间的区别详细解析
Nov 29 Javascript
Javascript动态引用CSS文件的2种方法介绍
Jun 06 Javascript
jQuery中eq()方法用法实例
Jan 05 Javascript
js实现发送验证码后的倒计时功能
May 28 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
Oct 09 Javascript
vue.js中mint-ui框架的使用方法
May 12 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
Jul 20 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
Dec 10 Javascript
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
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
PHP中static关键字以及与self关键字的区别
2015/07/01 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
python二叉树的实现实例
2013/11/21 Python
Python中文件遍历的两种方法
2014/06/16 Python
python文件与目录操作实例详解
2016/02/22 Python
详解django三种文件下载方式
2018/04/06 Python
Python切片操作深入详解
2018/07/27 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
Python绘制组合图的示例
2020/09/18 Python
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
会计毕业生自我鉴定
2013/11/04 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
房屋质量投诉书
2015/07/02 职场文书
用Python爬取某乎手机APP数据
2021/06/15 Python
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs