vue2 - 几个有趣的工具函数

ru shui 2021-07-31 Vue
  • Vue
  • Framework
About 1 min

# makeMap

export function makeMap(
  str: string,
  expectsLowerCase?: boolean,
): (key: string) => true | void {
  const map = 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]
}
1
2
3
4
5
6
7
8
9
10
11

创建一个 map,用于缓存常用的字符串。我们知道,vue 是基于 字符串进行模板解析的,为了优化性能,vue 尽可能地采用缓存机制。 makeMap 可以根据传入的字符串,缓存一个 map 并且返回一个函数, 该函数接收一个 key,判断该 key 是否在 map 中。

例如源码中,用 makeMap 创建一个函数用于判断 key 是否为内置组件/保留的属性。

/**
 * Check if a tag is a built-in tag.
 */
export const isBuiltInTag = makeMap('slot,component', true)

/**
 * Check if a attribute is a reserved attribute.
 */
export const isReservedAttribute = makeMap('key,ref,slot,slot-scope,is')
1
2
3
4
5
6
7
8
9

# remove

/**
 * Remove an item from an array
 */
export function remove(arr: Array<any>, item: any): Array<any> | void {
  if (arr.length) {
    const index = arr.indexOf(item)
    if (index > -1) {
      return arr.splice(index, 1)
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11

原地删除数组中的某一项,返回包含被删除元素的数组,失败无返回。

# cached

/**
 * Create a cached version of a pure function.
 */
export function cached<F: Function>(fn: F): F {
  const cache = Object.create(null)
  return (function cachedFn(str: string) {
    const hit = cache[str]
    return hit || (cache[str] = fn(str))
  }: any)
}
1
2
3
4
5
6
7
8
9
10

实现纯函数的缓存。

参考 cached 可以写出对于任意参数的 cache 函数。

# 命名管理函数

/**
 * Camelize a hyphen-delimited string.
 */
const camelizeRE = /-(\w)/g
export const camelize = cached((str: string): string => {
  return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''))
})

/**
 * Capitalize a string.
 */
export const capitalize = cached((str: string): string => {
  return str.charAt(0).toUpperCase() + str.slice(1)
})

/**
 * Hyphenate a camelCase string.
 */
const hyphenateRE = /\B([A-Z])/g
export const hyphenate = cached((str: string): string => {
  return str.replace(hyphenateRE, '-$1').toLowerCase()
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Last update: August 27, 2021 23:37
Contributors: Laishuxin