vue下的@change事件的实现


Posted in Javascript onOctober 25, 2019

楼主最近在项目中实践了一下vue,期间遇到了一些坑,现在记录一下

先上代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<script src="vue.js"></script>
<body>
  <div id="app">
    <select name="" id="" @change="getCity(provinceId)" v-model="provinceId">
      <option value="">请选择</option>
      <option v-for="province in provinces" :value="province.id">{{province.text}}</option>
    </select>
    <select name="" id="">
      <option value="">请选择</option>
      <option :value="city.id" v-for="city in citys">{{city.text}}</option>
    </select>
  </div>
</body>
<script>
  new Vue({
    el:'#app',
    data:{
      provinces:[],
      provinceId:'',
      citys:[],
      areas:[]
    },
    created:function() {
      this.areas = [  
        {text:'广东省',id:1,pid:0}, 
        {text:'上海市',id:2,pid:0},
        {text:'广州市',id:11,pid:1},
        {text:'中山市',id:12,pid:1}
      ];

      var provinces=this.areas.filter(function (area) {
        return area.pid == 0;
      });
      this.provinces = provinces;

    },
    methods:{
      getCity:function (id) {
        var citys=this.areas.filter(function (city) {
          return city.pid == id;
        })
        this.citys = citys;
      }
    }
  })
</script>
</html>

如果按照平常的使用习惯,看起来好像没多大问题,切换父元素的时候监听change事件联动子元素值的变化,很符合常年使用jQuery开发的习惯,效果如图:

vue下的@change事件的实现

那如果页面上有多个使用到相同的联动效果的地方呢?我们看下效果会是怎样,如图

<select name="" id="" @change="getCity(provinceId)" v-model="provinceId">
      <option value="">请选择</option>
      <option v-for="province in provinces" :value="province.id">{{province.text}}</option>
    </select>
    <select name="" id="">
      <option value="">请选择</option>
      <option :value="city.id" v-for="city in citys">{{city.text}}</option>
    </select>
    <select name="" id="" @change="getCity(provinceId)" v-model="provinceId">
      <option value="">请选择</option>
      <option v-for="province in provinces" :value="province.id">{{province.text}}</option>
    </select>
    <select name="" id="">
      <option value="">请选择</option>
      <option :value="city.id" v-for="city in citys">{{city.text}}</option>
    </select>

vue下的@change事件的实现

结果是互相受到影响,这并不是我们想看到的。

我的解决办法是,citys改为一个实时计算得到的数组而不是绑定现有仅有的同一个数组,代码改写如下:

<select name="" id="">
      <option value="">请选择</option>
      <option :value="city.id" v-for="city in getCity(provinceId)">{{city.text}}</option>
    </select>

      getCity:function (id) {
        var citys=this.areas.filter(function (city) {
          return city.pid == id;
        })
        return citys;
      }

效果如下:

vue下的@change事件的实现

可以看到,现在已经不会互相影响了。

总结:类似vue的mvvm框架都是数据与视图双向绑定的,而change事件往往用于视图改变的时候去操作数据,这在mvvm框架里面显得多此一举,框架本身已映射视图的变化到数据上,所以绝大部分的change事件监听都是不必要的,对应vue,可改写为methods方法或者computed计算属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery试卷自动排版系统
Jul 18 Javascript
IE6 fixed的完美解决方案
Mar 31 Javascript
javascript拖拽上传类库DropzoneJS使用方法
Dec 05 Javascript
Node.js事件循环(Event Loop)和线程池详解
Jan 28 Javascript
javascript实现数字倒计时特效
Mar 30 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
javascript关于继承解析
May 10 Javascript
javascript如何定义对象数组
Jun 07 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
Vue组件通信的四种方式汇总
Feb 08 Javascript
微信小程序 授权登录详解(附完整源码)
Aug 23 Javascript
解决layer弹出层自适应页面大小的问题
Sep 16 Javascript
微信小程序(订阅消息)功能
Oct 25 #Javascript
layui 解决form表单点击无反应的问题
Oct 25 #Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
Oct 25 #Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
Oct 25 #Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
Oct 25 #Javascript
vue实现评论列表功能
Oct 25 #Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 #Javascript
You might like
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
php use和include区别总结
2019/10/13 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
利用Python对文件夹下图片数据进行批量改名的代码实例
2019/02/21 Python
python web框架中实现原生分页
2019/09/08 Python
python批量修改交换机密码的示例
2020/09/22 Python
python安装及变量名介绍详解
2020/12/12 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
应届生骨科医生求职信
2013/10/31 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
秋冬农业生产标语
2014/10/09 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
结婚纪念日感言
2015/08/01 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技