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 相关文章推荐
Extjs中常用表单介绍与应用
Jun 07 Javascript
js 火狐下取本地路径实现思路
Apr 02 Javascript
jquery遍历数组与筛选数组的方法
Nov 05 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
Apr 29 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
Dec 16 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
May 24 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
详解Vue方法与事件
Mar 09 Javascript
React Native 截屏组件的示例代码
Dec 06 Javascript
说说如何利用 Node.js 代理解决跨域问题
Apr 22 Javascript
微信小程序实现渐入渐出动画效果
Jun 13 Javascript
原生JS运动实现轮播图
Jan 02 Javascript
谈谈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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
JS 分号引起的一段调试问题
2009/06/18 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
Vue父子组件传值的一些坑
2020/09/16 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
numpy实现RNN原理实现
2021/03/02 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
学院书画协会部门岗位职责
2013/12/01 职场文书
自荐信写法介绍
2014/01/25 职场文书
培训自我鉴定
2014/01/31 职场文书
升学宴演讲稿
2014/09/01 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
2014年勤工助学工作总结
2014/11/24 职场文书
安全教育第一课观后感
2015/06/17 职场文书
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
css3新特性的应用示例分析
2022/03/16 HTML / CSS