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 相关文章推荐
Display SQL Server Version Information
Jun 21 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
Feb 03 Javascript
Summernote实现图片上传功能的简单方法
Jul 11 Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 Javascript
JS键盘版计算器的制作方法
Dec 03 Javascript
JS+DIV实现的卷帘效果示例
Mar 22 Javascript
微信小程序 image组件遇到的问题
May 28 Javascript
手把手教您实现react异步加载高阶组件
Apr 07 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
Apr 15 Javascript
微信小程序实现日历签到
Sep 21 Javascript
JavaScript 实现轮播图特效的示例
Nov 05 Javascript
js正则表达式简单校验方法
Jan 03 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
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
javascript显示选择目录对话框的代码
2008/11/10 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
Bootstrap每天必学之表格
2015/11/23 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
2021/02/25 Javascript
js实现分页功能
2017/05/24 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
使用PYTHON创建XML文档
2012/03/01 Python
python批量修改文件后缀示例代码分享
2013/12/24 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
生产部厂长助理职位说明书
2014/03/03 职场文书
2014统计局民主生活会对照检查材料思想汇报
2014/10/02 职场文书
优秀班集体申报材料
2014/12/25 职场文书
小学生交通安全寄语
2015/02/27 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript