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+json实现数据二级联动的方法
Nov 28 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
Nov 29 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
Apr 07 Javascript
浅析script标签中的defer与async属性
Nov 30 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
Oct 27 Javascript
JS实现的ajax和同源策略(实例讲解)
Dec 01 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
5 种JavaScript编码规范
Jan 30 Javascript
基于Node.js实现压缩和解压缩的方法
Feb 13 Javascript
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 Javascript
在weex中愉快的使用scss的方法步骤
Jan 02 Javascript
Vue的过滤器你真了解吗
Feb 24 Vue.js
微信小程序(订阅消息)功能
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
做个自己站内搜索引擎
2006/10/09 PHP
php中的登陆login
2007/01/18 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
PDO::inTransaction讲解
2019/01/28 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
2017/08/17 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
What is view? why do we have view?
2012/06/22 面试题
好习惯伴我成长演讲稿
2014/05/21 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
抢劫罪辩护词
2015/05/21 职场文书
跑出一片天观后感
2015/06/08 职场文书
子女赡养老人协议书
2016/03/23 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers