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 相关文章推荐
jQuery 事件队列调整方法
Sep 18 Javascript
第一个JavaScript入门基础 document.write输出
Feb 22 Javascript
动态的创建一个元素createElement及删除一个元素
Jan 24 Javascript
node.js中的fs.lstat方法使用说明
Dec 16 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
Feb 15 Javascript
js下将金额数字每三位一逗号分隔
Feb 19 Javascript
JS数组去掉重复数据只保留一条的实现代码
Aug 11 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
Mar 23 jQuery
解决vue项目nginx部署到非根目录下刷新空白的问题
Sep 27 Javascript
cdn模式下vue的基本用法详解
Oct 07 Javascript
react同构实践之实现自己的同构模板
Mar 13 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
Oct 28 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
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
php发送邮件的问题详解
2015/06/22 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
JS面向对象编程 for Cookie
2010/09/19 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
通过Kettle自定义jar包供javascript使用
2020/01/29 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
python实现简易数码时钟
2021/02/19 Python
python conda操作方法
2019/09/11 Python
postman传递当前时间戳实例详解
2019/09/14 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
python中get和post有什么区别
2020/06/19 Python
Python与C/C++的相互调用案例
2021/03/04 Python
美国校服网上商店:French Toast
2019/10/08 全球购物
办公室主任职责范本
2014/03/07 职场文书
投资意向书范本
2014/04/01 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
先进个人自荐书
2015/03/06 职场文书
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python