vue方法封装,vue 组件封装应该遵循 什么样的设计模式

  vue方法封装,vue 组件封装应该遵循 什么样的设计模式

  存储作为Web存储API的接口,提供了访问特定域名下的会话存储或本地存储的功能,比如可以添加、修改或删除存储的数据项。本文主要介绍如何使用Vue的思想打包存储。有需要的可以参考一下。

  

目录

   setgetdeleteproperty preventextensions as的背景、功能、目的、想法来源、实现摘要

  

背景

  localStorage和sessionStorage这两个API是我们前端日常开发中存储的利器,我们经常用它们来存储一些数据。当我们每天操作它们时,本地存储和会话存储的使用通常是直接的:

  localStorage.setItem(xxx,XXX);

  sessionStorage.setItem(xxx,XXX);

  local storage . getitem(XXX);

  session storage . getitem(XXX);

  或者有些同学会简单的这样包装:

  const getItem=(key)={

  const serialized value=window . local storage . getitem(key)as any;

  返回JSON . parse(serialized value);

  };

  const setItem=(key,value)={

  if (window window.localStorage) {

  window . local storage . setitem(key,JSON . stringify(value));

  }

  };

  不过,虽然用这种方式问题不大,但总感觉代码不够优雅。就在最近,一些底层的基本库被封装了,包括对两兄弟的封装。找点更有趣的。边肖也有一些新的经验和想法与大家分享。

  

功能

  设置localStorage和sessionStorage

  本地存储,会话存储获取

  从localStorage和sessionStorage中删除一个项目。

  LocalStorage和sessionStorage清除所有存储。

  

目的

  封装一个localStorage和sessionStorage API来添加、删除、更改和检查存储。

  

想法来源

  如果你用过Vue2.0,那么你一定知道Object.defineProperty方法。这个API是Vue response的核心,用来观察数据的变化,但是有一些弊端:

  在对象数据中添加新的一对键/值或删除现有的一对键/值时,无法观察到。因此,当我们向对象数据添加或删除值时,我们不能通知依赖关系并驱动视图相应地更新。

  对于数组变化检测,Vue2.0是通过拦截器实现的,也就是说只要数组原型上的方法操作数组就可以检测到。但是用数组下标操作数据时,需要手动操作。

  这些问题在Vue 3.0中已经解决了,解决方案是ES6中的方法代理。

  代理是用来修改一些操作的默认行为的,相当于在语言层面做出改变,所以属于一种“元编程”,也就是对编程语言进行编程。

  代理可以理解为在目标对象前面设置一层“拦截”。所有对对象的外部访问都必须通过这一层来拦截,因此它提供了一种过滤和重写外部访问的机制。Proxy这个词的原意是代理,这里用来表示它“代理”某些操作,可以翻译为“代理”。

  Proxy是一个天然的拦截器和代理,所以我们也可以用Proxy来代理localStorage和sessionStorage的操作。话不多说,直接去码。

  

实现

  var proxyStorage={

  /**

  *返回存储代理

  * @返回代理

  * @示例

  * proxy storage . getstorageproxy(local storage, _ )

  */

  getStorageProxy: (storage,prefix)={

  如果(!存储)

  返回false

  const getKey=(prop)=`${prefix}。$ { String(prop)} `;

  返回新代理(新对象(),{

  /**

  *设置存储

  * @返回布尔值

  * @示例

  * const storage proxy=proxy storage . getstorageproxy(local storage, _ );

  * storage proxy . a=1;

  */

  设置(目标,属性,值){

  target[prop]=值;

  storage.setItem(getKey(prop),JSON . stringify(value));

  返回true

  },

  /**

  *获取存储空间

  * @返回布尔值

  * @示例

  * const storage proxy=proxy storage . getstorageproxy(local storage, _ );

  * console . log(storage proxy . a);

  */

  get(_,prop) {

  return JSON . parse(storage . getitem(getKey(prop)) );

  },

  /**

  *删除存储

  * @返回布尔值

  * @示例

  * const storage proxy=proxy storage . getstorageproxy(local storage, _ );

  *删除storageProxy.a

  */

  deleteProperty(_,prop) {

  storage . remove item(getKey(prop));

  返回true

  },

  /**

  *空存储

  * @返回布尔值

  * @示例

  * const storage proxy=proxy storage . getstorageproxy(local storage, _ );

  * object . prevent extensions(storage proxy);

  */

  preventExtensions(目标){

  object . prevent extensions(target);

  storage . clear();

  返回true

  },

  /**

  *查询存储

  * @返回布尔值

  * @示例

  * const storage proxy=proxy storage . getstorageproxy(local storage, _ );

  * storage proxy中的“a ”;

  */

  有(目标,道具){

  尝试{

  回归!storage . key(prop);

  } catch(错误){

  返回false

  }

  }

  });

  },

  };

  var proxyStorageTest=proxy storage . getstorageproxy(local storage, _ );

  使用Proxy返回localStorage和sessionStorage的代理对象,该对象劫持set、get、delete、preventExtensions和in等操作。

  

set

  截取对象属性的设置,如storage.foo=v或storage[foo]=v,并返回一个布尔值。给代理对象的属性赋一个值,截取这个赋值,操作对应存储的setItem,这样值就可以直接存储在对应的存储中了。

  storage . a=1;

  //或者

  存储[ a ]=1;

  

get

  拦截对象属性的读取,比如storage.foo和storage[foo]。读取代理对象的属性值,截取这个获取操作,获取对应的key,操作对应存储的getItem,从对应存储中获取对应的值。

  console . log(storage . a);//1

  

deleteProperty

  拦截删除存储[propKey]的操作,并返回一个布尔值。这里拦截的是对象的数据删除操作,存储内部操作removeItem item,删除数据。

  删除proxyStorageTest.a

  

preventExtensions

  截取object . prevent extensions(storage)并返回一个布尔值。拦截对象的不可扩展操作,内部清空对应的存储,清除所有存储的值。

  object . prevent extensions(proxyStorageTest);

  

has

  拦截proxy中propKey的操作和对象的hasOwnProperty方法,返回一个布尔值。截取对象的查询属性来查询对应的存储中是否存在一个键。

  proxyStorageTest中的“a ”;

  

总结

  localStorage和sessionStorage的操作由代理表示,并封装了一个简单的存储API。该代理可用于操作localStorage、sessionStorage、document.cookie和indexedDB。当然,代理的作用不仅限于此。它还有很多其他用途,比如在Vue 3.0中使用代理,或者其他。本文的重点不是封装一个简单的API,而是引导大家学习这种思想。

  这就是这篇关于如何用Vue的创意包装储物件的文章。更多关于用Vue的创意包装储物的信息,请搜索我们之前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: