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的实现简单的分页控件
Oct 10 Javascript
jQuery ajax dataType值为text json探索分享
Sep 23 Javascript
Jquery解析json字符串及json数组的方法
May 29 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
Jul 06 Javascript
Three.js学习之几何形状
Aug 01 Javascript
使用gulp搭建本地服务器并实现模拟ajax
Apr 05 Javascript
微信小程序实现默认第一个选中变色效果
Jul 17 Javascript
vue打包使用Nginx代理解决跨域问题
Aug 27 Javascript
微信小程序实现的一键拨号功能示例
Apr 24 Javascript
vuex 中插件的编写案例解析
Jun 10 Javascript
layui实现给某一列加点击事件
Oct 26 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操作redis缓存方法分享
2015/06/03 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
限制文本框输入N个字符的js代码
2010/05/13 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
Python进程间通信Queue实例解析
2018/01/25 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
模具设计与制造专业应届生求职信
2013/10/18 职场文书
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
优秀士兵个人事迹材料
2014/01/19 职场文书
毕业生如何写自我鉴定
2014/03/15 职场文书
导师就业推荐信范文
2014/05/22 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
领导参观欢迎词
2015/01/26 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android