Vue2.0 组件传值通讯的示例代码


Posted in Javascript onAugust 01, 2017

在Vue项目中,我们经常把某个功能模块封装起来,形成组件,下次调用时非常方便,同时也是在一些循环中进行dom操作的一种较好方式。

本次我想以一个评价组件来说一下组件的事件和参数是怎样传递的,如何完成的组件通讯。

示例如下:

Vue2.0 组件传值通讯的示例代码

这里先说一下组件设计思路:

明确整个功能场景,找出存在的事件操作,此例是一个简单的评价功能,即点击某一个星星时左边以及当前为选中的黄色星,右边为未选中的白色星。

确定可复用的组件,即具有重复操作的模块,这里明显的每一个星星为一个可复用组件, 其实还有个星星变成白色和黄色也是一个小组件,这种在具体写的时候觉得可以再分即可。

至此一个划分了三个组件:JudgeOf、JudgeStar、StarImg

这里需要明确的是,在大多数的组件通讯中,父组件往子组件传递的都是数据,子组件往父组件传递的才是事件,
我们姑且称父到子走的是一个数据流,子到父走的是一个事件流,了解这一点基本可以很好的了解组件通讯的情况。

Vue2.0 组件传值通讯的示例代码

JudgeOf组件:

基本的外框,循环starList构成三个评分选项。向子组件传递选项名字,和当前选项的索引

<template>
 <div>
 <div class="judge-modal" @click="cancel"></div>
 <div class="judge">
  <br>
  <div class="text-center font16">评价</div>
  <judge-star v-for="item,index in starList" :key="index" @judge="judge" :name="item.name" :index="index" ></judge-star>
  <br>
  <div class="box container text-left">
  <span class="icon-i"></span> 评价内容
  </div>
  <div class="bgfff container font14">
  <textarea placeholder="请输入您的评价,方便我们改进,谢谢!" type="textarea" class="textarea" rows="6" v-model="judgeTxt"></textarea>
  </div>
  <div class="container">
  <br>
  <div class="btn btn_block text-center" @click="submit">提交</div>
  </div>
 </div>
 </div>
</template>

<script>
 import JudgeStar from './judgeStar.vue'
 export default{
 data(){
  return{
  starList:[
   {name:'服务态度',key:'evaluate.serviceStarLevel'},
   {name:'责任感',key:'evaluate.dutyStarLevel'},
   {name:'准时度',key:'evaluate.onTimeStarLevel'},
  ],
  evaluate:[],
  judgeTxt:''
  }
 },
 components:{
  JudgeStar
 },
 computed:{

 },
 methods:{
  cancel(){
  this.$emit('cancel')
  },
  submit(){
  let data = '';
  this.starList.forEach((val,index)=>{
   data =`${val.key}:${this.evaluate[index]}`
   console.log(data)
  });
  },
  judge(data){
   this.evaluate[data[0]]=data[1];
  }
 }
 }
</script>

JudgeStar组件:

在这里注册一个chooseIndex,当点击某一个星星时,StarImg组件emit当前星星的index,JudgeStar组件中接收此参数并赋值给chooseIndex,同时StarImg里面watch这个参数,大于index表明没有被选中,反之则为选中,

<template>
 <div class="flex_cont container">
 <div class="flex_item name">{{name}}</div>
 <div class="flex_item">
  <star-img @choose="choose" v-for="item,index in starArr" :key="index" :chooseIndex="chooseIndex" :index="index"></star-img>
 </div>
 </div>

</template>

<script>
 import StarImg from './starImg.vue'
 export default{
 props:{
  name:String,
  index:''
 },
 data(){
  return{
  chooseIndex:4,
  starArr:Array.from({ length: 5 })
  }
 },
 components:{
  StarImg
 },
 mounted(){
  this.$emit('judge',[this.index,this.chooseIndex+1]);
 },
 methods:{
  choose(data){
  this.chooseIndex = data;
  this.$emit('judge',[this.index,this.chooseIndex+1]);
  }
 }
 }
</script>

StarImg组件:

观察chooseIndex值的变化

<template>
 <i style="margin: 0 3px;" :class="icon" @click="choose"></i>
</template>

<script>
export default{
 props:{
  index:Number, //当前星星的索引
  chooseIndex:Number //选中星星的索引
 },
 data(){
  return{
   icon:'icon-star'
  }
 },
 watch:{
 //大于index表明没有被选中,反之则为选中,
  chooseIndex:function () {
  if(this.chooseIndex>=this.index){
   this.icon = 'icon-star'
  } else {
   this.icon = 'icon-star2'
  }
  },
 },
 methods:{
  choose(){
   /*所选星星最大索引*/
   this.$emit('choose',this.index)
  }
 },
 created(){

 }
}
</script>

总结一下:

  1. 父组件通过v-bind:绑定参数传给子组件,子组件通过props接受这个参数。
  2. 在组件的最底层开始写事件,由最底层组件逐步向上$emit事件流,并携带相应参数,最后在父组件内完成总的数据处理。

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

Javascript 相关文章推荐
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
Jul 13 Javascript
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
Jan 30 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
Dec 01 Javascript
JavaScript 消息框效果【实现代码】
Apr 27 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
Jul 01 Javascript
最细致的vue.js基础语法 值得收藏!
Nov 03 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
Jan 03 Javascript
js+canvas实现滑动拼图验证码功能
Mar 26 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
Sep 26 Javascript
jQuery事件blur()方法的使用实例讲解
Mar 30 jQuery
谈谈VUE种methods watch和compute的区别和联系
Aug 01 #Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 #Javascript
详解js静态资源文件请求的处理
Aug 01 #Javascript
Angular4学习笔记之准备和环境搭建项目
Aug 01 #Javascript
jQuery上传插件webupload使用方法
Aug 01 #jQuery
js实现鼠标拖拽多选功能示例
Aug 01 #Javascript
使用Node.js实现RESTful API的示例
Aug 01 #Javascript
You might like
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
Python实现控制台输入密码的方法
2015/05/29 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
浅谈python常用程序算法
2019/03/22 Python
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
财务经理的岗位职责
2013/12/17 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
工会积极分子个人总结
2015/03/03 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
大学生逃课检讨书
2015/05/04 职场文书
大学生求职意向书
2015/05/11 职场文书
活着观后感
2015/06/03 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
我收到了德劲DE1107
2022/04/05 无线电