资讯专栏INFORMATION COLUMN

split,formatDate,store,util组件

kyanag / 1967人阅读

摘要:组件的代码组件因为常使用所以多带带独立出来并且结构相当简单组件过滤器使用在下函数的导入需要这样写导入自定义的模块里面的调用模块的函数来解析时间是一个自定义的组件不是组件目录位于这种写法是为了练习的模块化编程将多带带的一个函数写成

split组件(vue)的代码

split组件因为常使用,所以多带带独立出来,并且结构相当简单.





formatDate.js组件

{{rating.rateTime | formatDate}}
//在es6下,export 函数function的导入需要这样写
import { formatDate } from "../../common/js/date"; //导入自定义的date模块

//vue里面的filters
filters: {
      formatDate(time) {
        let date = new Date(time);
        //调用date模块的formatDate函数来解析时间
        return formatDate(date, "yyyy-MM-dd hh:mm");
      }
    },
    

formatDate.js是一个自定义的js组件,不是vue组件,目录位于:src/common/js,这种写法是为了练习js的模块化编程

将多带带的一个函数写成一个模块

通过export导出函数

通过import导入函数

export function formatDate(date, fmt) { //在es6下导出一个函数
//对一个或多个y进行匹配,匹配到就进行年的替换(年有四位,所以需要特殊处理)
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
  }
  let o = {
    "M+": date.getMonth() + 1, //js的月是从0开始算,所以要加1
    "d+": date.getDate(),
    "h+": date.getHours(),
    "m+": date.getMinutes(),
    "s+": date.getSeconds()
  };
  //对月,日,时,分,秒进行匹配替换(这些都是两位,可以一起处理)
  for (let k in o) {
    if (new RegExp(`(${k})`).test(fmt)) { //匹配到key例如MM
      let str = o[k] + ""; //然后o["MM"] 就是date.getMonth() + 1
      
      //如果匹配到的时间是1位数,例如是M,那么就直接使用date.getMonth() + 1的值,
      //如果是两位数,那么就在前面补0,使用padLeftZero函数
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str)); 
    }
  }
  return fmt;
};

//先加两个0,然后再根据长度截取(因为最长也就2个0的长度)
function padLeftZero(str) {
  return ("00" + str).substr(str.length);
}
store.js组件

这是一个js模块,负责html5的localstoage存储和读取的,位置: src/common/js/store.js

使用的方法是:

//在es6下,export 函数function的导入需要这样写
 import { saveToLocal, loadFromLocal } from "../../common/js/store";

代码:

//存储
//传入三个参数,seller的id,要存储的key和value
export function saveToLocal (id, key, value) {
//需要加上window对象来使用localstorage
  let seller = window.localStorage.__seller__; //使用__只是一种标记写法,标记是自定义的某种编码规范,这里代表这只是seller的数据
  if (!seller) { //第一次生成seller的时候初始化
    seller = {}; 
    seller[id] = {};
  } else {
    seller = JSON.parse(seller); //json字符串需要解析
    if (!seller[id]) { //不同seller的时候初始化
      seller[id] = {};
    }
  }
  seller[id][key] = value; //生成当前的seller对象
  //localStorage只能存储字符串,需要转成json字符串
  window.localStorage.__seller__ = JSON.stringify(seller);
}

//读取
三个参数,seller的id,之前存储的key,和一个默认值
export function loadFromLocal (id, key, def) {
  let seller = window.localStorage.__seller__;
  if (!seller) { //读取不到返回默认值
    return def; 
  }
  seller = JSON.parse(seller)[id]; //json解析
  if (!seller) { //解析失败返回默认值
    return def;
  }
  let ret = seller[key]; 
  return ret || def; //解析成功但是没有这个seller的id的也返回默认值
}

在node里面,没有默认全局window对象,所以需要指定加上才能使用window的相关方法和属性

seller[id][key] = value; 相当于是某个id的seller的某个属性(key)和值(value)保存为一个对象

关于写入的逻辑:先读取localstorage的已有值,判断是否存在,然后再去解析localstoage的已有值,判断是否等于当前的数据的key值(id),最后再处理最终的值是否存储,这里逻辑需要先判断已有值.

关于读取的逻辑:先读取localstorage判断是否有值,然后再去判断解析localstoage读取得到的值,最后再处理最终得到的值是否正常,按顺序进行逻辑处理

util.js组件

这个js模块负责获取url的参数,位置:src/common/js/util.js

/**
 * 解析url参数
 * @example ?id=12345&a=b
 * @return Object {id:12345,a:b}
 */

export function urlParse () {
  let url = window.location.search; //获取到url的所有参数
  let obj = {};
  let reg = /[?&][^?&]+=[^?&]+/g; //正则判断获取
  let arr = url.match(reg); //正则获取后会保存到一个数组
  // ["?id=12345","&a=b"]
  if (arr) {
    arr.forEach((item) => {
      let tempArr = item.substring(1).split("="); //将第一位去掉,然后用等号分隔
      let key = decodeURIComponent(tempArr[0]); //URI对于utf8格式会转码,所以这里需要解码
      let val = decodeURIComponent(tempArr[1]);
      obj[key] = val;
    });
  }
  return obj;
}

读取url的所有参数,例如http://a.com/?id=12345&a=b?id=12345&a=b

然后进行正则匹配,/[?&][^?&]+=[&?&]+/g,以?id=12345&a=b为举例:

[?&] 先匹配?和&的,url参数都是有这个2个字符作为连接符,就是指匹配?

[^?&]+ 然后匹配非?和&的多个,就是指匹配id

= 匹配等号

[^?&]+ 然后匹配非?和&的多个,就是指匹配12345

加起来就是能够匹配?id=12345&a=b

用对象返回,方便处理.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82880.html

相关文章

  • “React组件间通信”学习笔记

    React没有双向通信那么自由,而是单向的,即从父组件到子组件。 父组件->子组件:props 子组件->父组件:callback 子组件->子组件:子组件通过回调改变父组件中的状态,通过props再修改另一个组件的状态 父子组件间通信 var CalendarControl = React.createClass({ getDefaultProps: function () { ...

    darcrand 评论0 收藏0
  • 微信小程序开发初体验

    摘要:先上图开发环境准备小程序出来第二天就被破解,第三天微信就把开发工具开发下载了,现在只需要下载微信开发者工具就可以使用了,创建项目的时候,要选择无这样就不会有的验证了。 上周被 小程序 刷了屏,吓得我周末赶紧撸了个 小程序 版的 知乎日报 压压惊, 总结一下这个开发体验,和踩过的坑。 先上图 showImg(https://segmentfault.com/img/bVDyQU?w=42...

    jemygraw 评论0 收藏0
  • vue+iview 实现可编辑表格

    摘要:先简单说明一下这个引入的的方式是标签引入的没有用到之类的构建工具毕竟公司还在用这也是我第一次写文章大家看看思路就行了要是有大佬指点指点就更好了话不多说先来个效果图我们再看下极为简单的目录结构实现的可编辑表格首页首页相关与业务无关的纯工具函数 先简单说明一下,这个Demo引入的vue,iview的方式是标签引入的,没有用到webpack之类的构建工具...毕竟公司还在用angularjs...

    Anleb 评论0 收藏0
  • Nuxt.js服务端渲染实践,从开发到部署

    摘要:感悟经过几个周六周日的尝试,终于解决了服务端渲染中的常见问题,当不在是问题的时候,或许才是我们搞前端的真正的春天,其中也遇到了一些小坑,官方还是很给力的,提后很积极的给予帮助,再次感谢的开发团队。 感悟 经过几个周六周日的尝试,终于解决了服务端渲染中的常见问题,当SEO不在是问题的时候,或许才是我们搞前端的真正的春天,其中也遇到了一些小坑,Nuxt.js官方还是很给力的,提issue后...

    weij 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<