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背景图片闪烁(抖动)的解决办法
Sep 09 Javascript
JavaScript的strict模式与with关键字介绍
Feb 08 Javascript
一个jquery实现的不错的多行文字图片滚动效果
Sep 28 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
微信小程序通过api接口将json数据展现到小程序示例
Jan 20 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
Aug 23 Javascript
深入理解vuex2.0 之 modules
Nov 20 Javascript
JavaScript中变量、指针和引用功能与操作示例
Aug 04 Javascript
js实现点击展开隐藏效果(实例代码)
Sep 28 Javascript
Vue路由前后端设计总结
Aug 06 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
May 09 Javascript
Javascript柯里化实现原理及作用解析
Oct 22 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 学习资料零碎东西
2010/12/04 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
PHP+ajax实现二级联动菜单功能示例
2018/08/10 PHP
实例分析PHP将字符串转换成数字的方法
2019/01/27 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
javascript常用的方法整理
2015/08/20 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
详解python中的装饰器
2018/07/10 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
网络技术专业求职信
2014/07/13 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
同意报考证明
2015/06/17 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
Golang流模式之grpc的四种数据流
2022/04/13 Golang
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle