返回顶部
首页 > 资讯 > 精选 >Vue3 shared模块下的工具函数有哪些
  • 866
分享到

Vue3 shared模块下的工具函数有哪些

2023-07-04 19:07:24 866人浏览 安东尼
摘要

本篇内容主要讲解“vue3 shared模块下的工具函数有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3 shared模块下的工具函数有哪些”吧!Vue3的工具函数对比于Vue2的工

本篇内容主要讲解“vue3 shared模块下的工具函数有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习Vue3 shared模块下的工具函数有哪些”吧!

Vue3的工具函数对比于Vue2的工具函数变化还是很大的,个人感觉主要还是体现在语法上,已经全面拥抱es6了;

对比于工具类的功能变化并没有多少,大多数基本上都是一样的,只是语法上和实现上有略微的区别。

所有工具函数

  • makeMap: 生成一个类似于Set的对象,用于判断是否存在某个值

  • EMPTY_OBJ: 空对象

  • EMPTY_ARR: 空数组

  • NOOP: 空函数

  • NO: 返回false的函数

  • isOn: 判断是否是on开头的事件

  • isModelListener: 判断onUpdate开头的字符串

  • extend: 合并对象

  • remove: 移除数组中的某个值

  • hasOwn: 判断对象是否有某个属性

  • isArray: 判断是否是数组

  • isMap: 判断是否是Map

  • isSet: 判断是否是Set

  • isDate: 判断是否是Date

  • isRegExp: 判断是否是RegExp

  • isFunction: 判断是否是函数

  • isString: 判断是否是字符串

  • isSymbol: 判断是否是Symbol

  • isObject: 判断是否是对象

  • isPromise: 判断是否是Promise

  • objectToString: Object.prototype.toString

  • toTypeString: Object.prototype.toString的简写

  • toRawType: 获取对象的类型

  • isPlainObject: 判断是否是普通对象

  • isIntegerKey: 判断是否是整数key

  • isReservedProp: 判断是否是保留属性

  • isBuiltInDirective: 判断是否是内置指令

  • camelize: 将字符串转换为驼峰

  • hyphenate: 将字符串转换为连字符

  • capitalize: 将字符串首字母大写

  • toHandlerKey: 将字符串转换为事件处理的key

  • hasChanged: 判断两个值是否相等

  • invokeArrayFns: 调用数组中的函数

  • def: 定义对象的属性

  • looseToNumber: 将字符串转换为数字

  • toNumber: 将字符串转换为数字

  • getGlobalThis: 获取全局对象

  • genPropsAccessExp: 生成props的访问表达式

这其中有大部分和Vue2的工具函数是一样的,还有数据类型的判断,使用的是同一种方式,因为有了之前Vue2的阅读经验,所以这次快速阅读;而且这次是直接源码ts版本的,不再处理成js,所以直接阅读ts源码。

正式开始

makeMap

export function makeMap(  str: string,  expectsLowerCase?: boolean): (key: string) => boolean {  const map: Record<string, boolean> = Object.create(null)  const list: Array<string> = str.split(',')  for (let i = 0; i < list.length; i++) {    map[list[i]] = true  }  return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val]}

makeMap的源码在同级目录下的makeMap.ts文件中,引入进来之后直接使用export关键字导出,实现方式和Vue2的实现方式相同;

EMPTY_OBJ & EMPTY_ARR

export const EMPTY_OBJ: { readonly [key: string]: any } = __DEV__  ? Object.freeze({})  : {}export const EMPTY_ARR = __DEV__ ? Object.freeze([]) : []

EMPTY_OBJEMPTY_ARR的实现方式和Vue2emptyObject相同,都是使用Object.freeze冻结对象,防止对象被修改;

NOOP

export const NOOP = () => {}

Vue2noop实现方式相同,都是一个空函数,移除了入参;

NO

export const NO = () => false

Vue2no实现方式相同,都是一个返回false的函数,移除了入参;

isOn

const onRE = /^on[^a-z]/export const isOn = (key: string) => onRE.test(key)

判断是否是on开头的事件,并且on后面的第一个字符不是小写字母;

isModelListener

export const isModelListener = (key: string) => key.startsWith('onUpdate:')

判断是否是onUpdate:开头的字符串;

参考:startWith

extend

export const extend = Object.assign

直接拥抱es6Object.assignVue2的实现方式是使用for in循环;

remove

export const remove = <T>(arr: T[], el: T) => {  const i = arr.indexOf(el)  if (i > -1) {    arr.splice(i, 1)  }}

对比于Vue2删除了一些代码,之前的快速删除最后一个元素的判断不见了;

猜测可能是因为有bug,因为大家都知道Vue2的数组响应式必须使用Arrayapi,那样操作可能会导致数组响应式失效;

hasOwn

const hasOwnProperty = Object.prototype.hasOwnPropertyexport const hasOwn = (  val: object,  key: string | symbol): key is keyof typeof val => hasOwnProperty.call(val, key)

使用的是Object.prototype.hasOwnProperty,和Vue2相同;

isArray

export const isArray = Array.isArray

使用的是Array.isArray,和Vue2相同;

isMap & isSet & isDate & isRegExp

export const isMap = (val: unknown): val is Map<any, any> =>  toTypeString(val) === '[object Map]'export const isSet = (val: unknown): val is Set<any> =>  toTypeString(val) === '[object Set]'export const isDate = (val: unknown): val is Date =>  toTypeString(val) === '[object Date]'export const isRegExp = (val: unknown): val is RegExp =>  toTypeString(val) === '[object RegExp]'

都是使用Object.toString来判断类型,对比于Vue2新增了isMapisSetisDate,实现方式没变;

isFunction & isString & isSymbol & isObject

export const isFunction = (val: unknown): val is Function =>  typeof val === 'function'export const isString = (val: unknown): val is string => typeof val === 'string'export const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol'export const isObject = (val: unknown): val is Record<any, any> =>  val !== null && typeof val === 'object'

Vue2的实现方式相同,都是使用typeof来判断类型,新增了isSymbol

isPromise

export const isPromise = <T = any>(val: unknown): val is Promise<T> => {  return isObject(val) && isFunction(val.then) && isFunction(val.catch)}

Vue2对比修改了实现方式,但是判断逻辑没变;

objectToString

export const objectToString = Object.prototype.toString

直接是Object.prototype.toString

toTypeString

export const toTypeString = (value: unknown): string =>  objectToString.call(value)

对入参执行Object.prototype.toString

toRawType

export const toRawType = (value: unknown): string => {  // extract "RawType" from strings like "[object RawType]"  return toTypeString(value).slice(8, -1)}

Vue2的实现方式相同;

isPlainObject

export const isPlainObject = (val: unknown): val is object =>  toTypeString(val) === '[object Object]'

Vue2的实现方式相同;

isIntegerKey

export const isIntegerKey = (key: unknown) =>  isString(key) &&  key !== 'NaN' &&  key[0] !== '-' &&  '' + parseInt(key, 10) === key

判断一个字符串是不是由一个整数组成的;

isReservedProp

export const isReservedProp =  makeMap(  // the leading comma is intentional so empty string "" is also included  ',key,ref,ref_for,ref_key,' +    'onVnodeBeforeMount,onVnodeMounted,' +    'onVnodeBeforeUpdate,onVnodeUpdated,' +    'onVnodeBeforeUnmount,onVnodeUnmounted')

使用makeMap生成一个对象,用于判断入参是否是内部保留的属性;

isBuiltInDirective

export const isBuiltInDirective =  makeMap(  'bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo')

使用makeMap生成一个对象,用于判断入参是否是内置的指令;

cacheStringFunction

const cacheStringFunction = <T extends (str: string) => string>(fn: T): T => {  const cache: Record<string, string> = Object.create(null)  return ((str: string) => {    const hit = cache[str]    return hit || (cache[str] = fn(str))  }) as T}

Vue2cached相同,用于缓存字符串;

camelize

const camelizeRE = /-(\w)/gexport const camelize = cacheStringFunction((str: string): string => {  return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''))})

-连接的字符串转换为驼峰式,同Vue2camelize相同;

capitalize

const hyphenateRE = /\B([A-Z])/gexport const hyphenate = cacheStringFunction((str: string) =>  str.replace(hyphenateRE, '-$1').toLowerCase())

将驼峰式字符串转换为-连接的字符串,同Vue2hyphenate相同;

capitalize

export const capitalize = cacheStringFunction(  (str: string) => str.charAt(0).toUpperCase() + str.slice(1))

将字符串首字母大写,同Vue2capitalize相同;

toHandlerKey

export const toHandlerKey = cacheStringFunction((str: string) =>  str ? `on${capitalize(str)}` : ``)

将字符串首字母大写并在前面加上on

hasChanged

// compare whether a value has changed, accounting for NaN.export const hasChanged = (value: any, oldValue: any): boolean =>  !Object.is(value, oldValue)

Vue2相比,移除了polyfill,直接使用Object.is

invokeArrayFns

export const invokeArrayFns = (fns: Function[], arg?: any) => {  for (let i = 0; i < fns.length; i++) {    fns[i](arg)  }}

批量调用传递过来的函数列表,如果有参数,会将参数传递给每个函数;

def

export const def = (obj: object, key: string | symbol, value: any) => {  Object.defineProperty(obj, key, {    configurable: true,    enumerable: false,    value  })}

使用Object.defineProperty定义一个属性,并使这个属性不可枚举;

looseToNumber

export const looseToNumber = (val: any): any => {  const n = parseFloat(val)  return isNaN(n) ? val : n}

将字符串转换为数字,如果转换失败,返回原字符串;

通过注释知道主要用于v-model.number修饰符;

toNumber

export const toNumber = (val: any): any => {  const n = isString(val) ? Number(val) : NaN  return isNaN(n) ? val : n}

将字符串转换为数字,如果转换失败,返回原数据;

getGlobalThis

let _globalThis: anyexport const getGlobalThis = (): any => {  return (    _globalThis ||    (_globalThis =      typeof globalThis !== 'undefined'        ? globalThis        : typeof self !== 'undefined'        ? self        : typeof window !== 'undefined'        ? window        : typeof global !== 'undefined'        ? global        : {})  )}

获取全局对象,根据环境不同返回的对象也不同;

genPropsAccessExp

const identRE = /^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/export function genPropsAccessExp(name: string) {  return identRE.test(name)    ? `__props.${name}`    : `__props[${JSON.stringify(name)}]`}

生成props的访问表达式,如果name是合法的标识符,直接返回__props.name,否则返回通过JSON.stringify转换后的__props[name]。

到此,相信大家对“Vue3 shared模块下的工具函数有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Vue3 shared模块下的工具函数有哪些

本文链接: https://lsjlt.com/news/346913.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue3 shared模块下的工具函数有哪些
    本篇内容主要讲解“Vue3 shared模块下的工具函数有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3 shared模块下的工具函数有哪些”吧!Vue3的工具函数对比于Vue2的工...
    99+
    2023-07-04
  • 聊聊Vue3 shared模块下38个工具函数(源码阅读)
    Vue3的工具函数对比于Vue2的工具函数变化还是很大的,个人感觉主要还是体现在语法上,已经全面拥抱es6了;【相关推荐:vuejs视频教程、web前端开发】对比于工具类的功能变化并没有多少,大多数基本上都是一样的,只是语法上和实现上有略微...
    99+
    2023-05-14
    shared模块 vue3 Vue
  • JavaScript工具函数有哪些
    小编给大家分享一下JavaScript工具函数有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为元素添加on方法Elemen...
    99+
    2024-04-02
  • tf.keras.layers模块中的函数有哪些
    本文小编为大家详细介绍“tf.keras.layers模块中的函数有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“tf.keras.layers模块中的函数有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-05
  • Vue3可视化工具有哪些
    本篇内容介绍了“Vue3可视化工具有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、PdfvuerDF 查看器,使用 Mozilla ...
    99+
    2023-07-04
  • JavaScript模块化方案和工具都有哪些
    这篇文章给大家介绍JavaScript模块化方案和工具都有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。模块化是大型前端项目的必备要素。JavaScript 从诞生至今,出现过各种...
    99+
    2024-04-02
  • Vue3实用开发工具有哪些
    这篇文章主要介绍了Vue3实用开发工具有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue3实用开发工具有哪些文章都会有所收获,下面我们一起来看看吧。1、unplugin-vue-componentsan...
    99+
    2023-07-04
  • python常用函数模块有哪些
    python中常用的函数模块有以下几种Urllib3Urllib3是一个Python的HTTP客户端,具有线程安全、连接池、客户端 SSL/TLS 验证等功能。SixSix是一个是Python2和Python3的兼容性库,旨在支持可同时运行...
    99+
    2024-04-02
  • Python中有哪些json模块函数
    这篇文章将为大家详细讲解有关Python中有哪些json模块函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研...
    99+
    2023-06-14
  • jQuery中必知的工具函数有哪些
    这期内容当中小编将会给大家带来有关jQuery中必知的工具函数有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。jQuery也能提高我们操作对象和数组的效率. 并且可以...
    99+
    2024-04-02
  • JavaScript中实用工具函数有哪些
    这篇文章主要讲解了“JavaScript中实用工具函数有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中实用工具函数有哪些”吧! ...
    99+
    2024-04-02
  • Linux下常用的工具有哪些
    这篇文章给大家分享的是有关Linux下常用的工具有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.w对,你没看错,就是 w 命令。使用该命令我们可以查看到当前登录系统的用户是谁,以及执行了哪些命令。2.nm...
    99+
    2023-06-27
  • MySQL数据库的建模工具都有哪些
    这篇文章将为大家详细讲解有关MySQL数据库的建模工具都有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。数据库建模和设计是软件开发过程中必不可少的步骤,一个良好的建模工具可以帮助我们简单...
    99+
    2023-06-19
  • Python之shutil模块常用的函数有哪些
    这篇文章主要讲解了“Python之shutil模块常用的函数有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python之shutil模块常用的函数有哪些”吧!shutil 是 Pyth...
    99+
    2023-06-16
  • Golang 函数测试的常用工具有哪些?
    在 go 中进行函数测试,可以使用:标准库中的 testing 包:提供基本断言函数。第三方工具,如:testify/assert:提供更丰富的断言方法。gomock:创建 mock 对...
    99+
    2024-04-16
    单元测试 集成测试 git golang 标准库
  • PHP 函数的性能分析工具有哪些?
    php 函数性能分析工具有助于识别瓶颈并改进代码。本文介绍了 xhprof(采样剖析)、tideways(商业平台)和 blackfire.io(saas 服务);实战案例展示了使用 x...
    99+
    2024-04-18
    php 性能分析工具
  • 聊聊Node.js path模块中的常用工具函数
    本篇文章带大家聊聊Node中的path模块,介绍一下path的常见使用场景、执行机制,以及常用工具函数,希望对大家有所帮助!在开发过程中,会经常用到 Node.js  ,它利用 V8 提供的能力,拓展了 JS 的能力。而在 Nod...
    99+
    2022-06-09
    path Node 执行机制
  • DOS下有哪些必备工具
    本篇内容介绍了“DOS下有哪些必备工具”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!当安装了操作系统后,首先要使整个电脑的硬件发挥出各自的功...
    99+
    2023-06-09
  • Oracle中检查数据块损坏的工具有哪些
    本篇内容主要讲解“Oracle中检查数据块损坏的工具有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle中检查数据块损坏的工具有哪些”吧!1.1DB...
    99+
    2024-04-02
  • python中有哪些vim模块函数接口
    python中有哪些vim模块函数接口?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作