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 相关文章推荐
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
May 13 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
Jul 29 Javascript
node.js实现多图片上传实例
Jun 03 Javascript
jQuery使用之设置元素样式用法实例
Jan 19 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
Jun 23 Javascript
详解JavaScript中的客户端消息框架设计原理
Jun 24 Javascript
JavaScript实现复制文章自动添加版权
Aug 02 Javascript
详解用webpack2.0构建vue2.0超详细精简版
Apr 05 Javascript
详解VueJs前后端分离跨域问题
May 24 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
Webpack中publicPath路径问题详解
May 03 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
Nov 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
php include的妙用,实现路径加密
2008/07/29 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
JavaScript的事件绑定(方便不支持js的时候)
2013/10/01 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
python里 super类的工作原理详解
2019/06/19 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
Django解决frame拒绝问题的方法
2020/12/18 Python
物业管理大学生个人的自我评价
2013/10/10 职场文书
美发活动策划书
2014/01/14 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
精神文明单位申报材料
2014/05/02 职场文书
推荐信怎么写
2014/05/09 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python