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 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
复选框全选与全不选操作实现思路
Aug 18 Javascript
js中回调函数的学习笔记
Jul 31 Javascript
JavaScript中跨域调用Flash的方法
Aug 11 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
JS中dom0级事件和dom2级事件的区别介绍
May 05 Javascript
jQuery基于正则表达式的表单验证功能示例
Jan 21 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
Dec 29 Javascript
vue-cli3.0使用及部分配置详解
Aug 29 Javascript
node.js的http.createServer过程深入解析
Jun 06 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 Javascript
vue-router 路由传参用法实例分析
Mar 06 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反向代理类代码
2014/08/15 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
学习ExtJS fit布局使用说明
2009/10/08 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
JavaScript中EventLoop介绍
2018/01/22 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
vue-cli3+typescript新建一个项目的思路分析
2019/08/06 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
python多线程同步之文件读写控制
2021/02/25 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
什么是serialVersionUID
2016/03/04 面试题
教师的实习自我鉴定
2013/12/17 职场文书
优秀员工自荐书
2013/12/19 职场文书
信息专业学生学习的自我评价
2014/02/17 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书