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网页关键字高亮代码
Jul 30 Javascript
javascript break指定标签打破多层循环示例
Jan 20 Javascript
javascript继承机制实例详解
Nov 20 Javascript
JS实现窗口加载时模拟鼠标移动的方法
Jun 03 Javascript
js实现网站最上边可关闭的浮动广告条代码
Sep 04 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
Oct 28 Javascript
javascript实现2016新年版日历
Jan 25 Javascript
js实现背景图自适应窗口大小
Jan 10 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
Sep 08 Javascript
React-native桥接Android原生开发详解
Jan 17 Javascript
json对象及数组键值的深度大小写转换问题详解
Mar 30 Javascript
vue项目中使用scss的方法步骤
May 16 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
memcache命令启动参数中文解释
2014/01/13 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
input框中的name和id的区别
2016/11/16 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
Python简单生成随机姓名的方法示例
2017/12/27 Python
Django之模型层多表操作的实现
2019/01/08 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
python中对_init_的理解及实例解析
2019/10/11 Python
django框架中间件原理与用法详解
2019/12/10 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
2014年会演讲稿范文
2014/01/06 职场文书
八一建军节感言
2014/02/28 职场文书
企业后勤岗位职责
2014/02/28 职场文书
工业设计专业自荐书
2014/06/05 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
高中生毕业评语
2014/12/30 职场文书
慰问信格式
2015/02/14 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
Python实现仓库管理系统
2022/05/30 Python