Vue组件之极简的地址选择器的实现


Posted in Javascript onMay 31, 2018

一、前言

本文用Vue完成一个极简的地点选择器,我们接下来带大家实现这个。当然其中也有一些值得学习与注意的地方。话不多说,我们先上demo图。因为每个人的需要不一样,我这边就不在实现更多的功能,所以留有更大的空间供大家增删改。

Vue组件之极简的地址选择器的实现

GitHub地址:Vue-location_Select

二、需要学习的地方

(1)数据更新Vue无法监控

首先要说一下的就是这个点,我们在Vue中有个好处就是可以不用操作dom,直接操作数据。但是这其实也有Vue无法监控的数据。如数组和对象。当然这里只是指一小部分操作而已,大部分操作都是没毛病的。接下来说说哪些数据操作Vue无法监控

1、数组

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

  1. 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
  2. 当你修改数组的长度时,例如:vm.items.length = newLength

意思就是下面的情况都不能监控到,因此这样改变数组是不会刷新视图的

var vm = new Vue({
 data: {
  items: ['a', 'b', 'c']
 }
})
vm.items[1] = 'x' // 不是响应性的,
vm.items.length = 2 // 不是响应性的

实际上要解决这两者的方法也简单:

//解决第一类问题

vm.$set(vm.items, indexOfItem, newValue)

//为了解决第二类问题,你可以使用 splice:

vm.items.splice(newLength)

这样就可以使得Vue监控到数组操作的变化。当然还有以下的操作Vue也可以监控到的

  1. push()
  2. pop()
  3. shift()
  4. unshift()
  5. splice()
  6. sort()
  7. reverse()

2.对象

由于 JavaScript 的限制,Vue不能检测对象属性的添加或删除! 这个是重点,如果动态的添加对象属性的话,那么请注意你添加对象属性的方式是否为$set,不然的话视图很有可能不更新。

var vm = new Vue({
 data: {
  userProfile: {
   name: 'Anika'
  }
 }
})

vm.userProfile.age = 27;  //看着没问题,实际上Vue无法监控

因此解决办法也是老办法,用vm.$set(vm.userProfile, 'age', 27);

使用Object.assign()添加多个属性也要注意一下用法

//错误
Object.assign(vm.userProfile, {
 age: 27,
 favoriteColor: 'Vue Green'
})

//正确
vm.userProfile = Object.assign({}, vm.userProfile, {
 age: 27,
 favoriteColor: 'Vue Green'
})

(2)V-for的用法

1.遍历数组

这里直接撸码,一看就懂

v-for = "(val,index) in arr" 
//得到的就是值和数组下标

//习惯性用法
<div v-for="(val,index) in arr" :key="index">
</div>

2.遍历对象

v-for = "(val,key,index) in object" 
//得到的就是键值对还有下标

//习惯性用法
<div v-for = "(val,key,index) in object" :key="index">
</div>

CSS3样式

当然这里就不多说了。这个直接给出传送门:css3用scale实现下划线动画

实现极简地点选择

这里就放主要的代码吧,虽然总代码也不多

html部分

<div class="siteBox" id="siteBox" v-if="isShow">
  <header>
    <ul class="classify">
      <li :class="{active:isClassify===key}" v-for="(arr,key,index) in this.locationName" :key="index" @click="isClassify=key">
        <a class="classify-a" href="#" rel="external nofollow" rel="external nofollow" >{{key}}</a>
      </li>
    </ul>
  </header>
  <main class="site-name">
    <dl v-for="value of isClassify">
      <dt>{{value}}</dt>
      <div class="list-dd">
        <dd v-for="(val,index) in locationName[isClassify][value]" :key="index" @click="site=val;isShow=false">
          <a class="list-a" href="#" rel="external nofollow" rel="external nofollow" >{{val}}</a>
        </dd>
      </div>
    </dl>
  </main>
</div>

js

methods:{
  getData(){
    let xhr = new XMLHttpRequest();           //原生ajax
    xhr.open('get','http://127.0.0.1:3001/read');    //请求mock
    xhr.send();
    xhr.onreadystatechange = ()=> {
      if (xhr.readyState === 4 && xhr.status === 200) {
        let locationN = JSON.parse(xhr.responseText);    //获取数据,地点json
        for (let key of Object.keys(locationN)) {      //遍历取出数据,取得键值
          for(let key2 of Object.keys(this.locationName)){    //遍历data中locationName,为了分类
            let pattern = new RegExp("["+key2.toString()+"]");   
            if(pattern.test(key)){               //正则匹配,如果找到就进入对应的分类对象中
              
              //判断该类中是否存在该字母这地名集合,如A,B,C
              if (Array.isArray(this.locationName[key2][key.charAt(0)])) {
                //如果存在则直接推入地名
                this.locationName[key2][key.charAt(0)].push(locationN[key]);
                
                //没有则先创建再推入地名
              } else {
                this.$set(this.locationName[key2],key.charAt(0),[]);
                this.locationName[key2][key.charAt(0)].push(locationN[key]);
              }
              break;
            }
          }
        }
      }
    }
  },
}

后话

到这里,我们就已经实现了该Vue组件,如果想细看代码或者使用的话,请点击Vue-location_Select,当然如果喜欢就不要吝啬你的star哦!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
23个Javascript弹出窗口特效整理
Feb 25 Javascript
js两行代码按指定格式输出日期时间
Oct 21 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
Mar 01 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
Nov 25 Javascript
jquery实现网页查找功能示例分享
Feb 12 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
Aug 17 Javascript
深入解析JavaScript中函数的Currying柯里化
Mar 19 Javascript
微信小程序 页面跳转传参详解
Oct 28 Javascript
Vue.JS入门教程之事件监听
Dec 01 Javascript
基于Javascript实现的不重复ID的生成器
Dec 25 Javascript
javascript实现滑动解锁功能
Mar 22 Javascript
小程序组件之仿微信通讯录的实现代码
Sep 12 Javascript
node跨域转发 express+http-proxy-middleware的使用
May 31 #Javascript
Vue实现侧边菜单栏手风琴效果实例代码
May 31 #Javascript
Node.js笔记之process模块解读
May 31 #Javascript
Vue组件中prop属性使用说明实例代码详解
May 31 #Javascript
用JS实现根据当前时间随机生成流水号或者订单号
May 31 #Javascript
Vue2 轮播图slide组件实例代码
May 31 #Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 #Javascript
You might like
自己做矿石收音机
2021/03/02 无线电
解析thinkphp的左右值无限分类
2013/06/20 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
完美的php分页类
2017/10/24 PHP
js post方式传递提交的实现代码
2010/05/31 Javascript
JQuery从头学起第一讲
2010/07/04 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
JS简易计算器实例讲解
2020/06/30 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
分享一个简单的python读写文件脚本
2017/11/25 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
django使用LDAP验证的方法示例
2018/12/10 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
Django URL参数Template反向解析
2020/11/24 Python
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
自我鉴定思想方面
2013/10/07 职场文书
单位介绍信范文
2014/01/18 职场文书
新学期教师寄语
2014/04/02 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript