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 String.replace的妙用
Sep 08 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
Sep 12 Javascript
js中设置元素class的三种方法小结
Aug 28 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
Nov 05 Javascript
js实现div拖动动画运行轨迹效果代码分享
Aug 27 Javascript
简单理解js的冒泡排序
Dec 19 Javascript
ES6 Set结构的应用实例分析
Jun 26 Javascript
layui实现三级导航菜单
Jul 26 Javascript
JS实现扫码枪扫描二维码功能
Jan 03 Javascript
JS实现页面数据懒加载
Feb 13 Javascript
前端学习——JavaScript原生实现购物车案例
Mar 31 Javascript
JavaScript 反射学习技巧
Oct 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
用PHP和ACCESS写聊天室(四)
2006/10/09 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
php实现简单文件下载的方法
2015/01/30 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
C#中TrimStart,TrimEnd,Trim在javascript上的实现
2011/01/17 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
Angular路由简单学习
2016/12/26 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
swiper自定义分页器使用方法详解
2020/09/14 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
vue使用nprogress实现进度条
2019/12/09 Javascript
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
Python实现的knn算法示例
2018/06/14 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
2015新年寄语大全
2014/12/08 职场文书
金榜题名主持词
2015/07/02 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python