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 相关文章推荐
在网页中屏蔽快捷键
Sep 06 Javascript
比较全面的event对像在IE与FF中的区别 推荐
Sep 21 Javascript
javascript中call和apply方法浅谈
Sep 27 Javascript
jQuery控制TR显示隐藏的三种常用方法
Aug 21 Javascript
一个JavaScript递归实现反转数组字符串的实例
Oct 14 Javascript
javascript结合canvas实现图片旋转效果
May 03 Javascript
jQuery中$(function() {});问题详解
Aug 10 Javascript
JQuery学习总结【二】
Dec 01 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
Jul 13 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
Nov 14 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
Feb 15 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 preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
JS抛物线动画实例制作
2018/02/24 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
利用Python实现颜色色值转换的小工具
2016/10/27 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
python使用PyQt5的简单方法
2019/02/27 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
python实现手势识别的示例(入门)
2020/04/15 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
2014的自我评价
2014/01/13 职场文书
欢送退休感言
2014/02/08 职场文书
部门2014年度工作总结
2014/11/12 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫