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 相关文章推荐
javascript实现unicode和字符的互相转换
Jul 18 Javascript
JS打开层/关闭层/移动层动画效果的实例代码
May 11 Javascript
javascript中的this详解
Dec 08 Javascript
js鼠标悬浮出现遮罩层的方法
Jan 28 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
jQuery中show与hide方法用法示例
Sep 16 Javascript
JS获得一个对象的所有属性和方法实例
Feb 21 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
使用JS判断移动端手机横竖屏状态
Jul 30 Javascript
axios对请求各种异常情况处理的封装方法
Sep 25 Javascript
ajax与jsonp的区别及用法
Oct 16 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
微信小程序(订阅消息)功能
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常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
Python实现检测文件MD5值的方法示例
2018/04/11 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
Python logging设置和logger解析
2019/08/28 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
北大研究生linux应用求职信
2013/10/29 职场文书
幼儿园教师请假制度
2014/01/16 职场文书
保密普查工作实施方案
2014/02/25 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
员工年终考核评语
2014/12/31 职场文书
公司表扬稿范文
2015/05/05 职场文书
酒桌上的开场白
2015/06/01 职场文书