资讯专栏INFORMATION COLUMN

Vue学习笔记(未完待续)

LuDongWei / 3159人阅读

摘要:但是正则表达式需要特殊处理当匹配到第一个非封闭的符号时,要校验它之前的第一个非空字符。采用正则表达式来匹配这一规则匹配任意

代码细节 缓存代理函数

</>复制代码

  1. export function cached (fn: F): F {
  2. const cache = Object.create(null)
  3. return (function cachedFn (str: string) {
  4. const hit = cache[str]
  5. return hit || (cache[str] = fn(str))
  6. }: any)
  7. }

vue源码里面大量使用的一个缓存代理函数。缓存参数执行结果,如果下次是同一个参数来调用函数,将返回上次产生的结果,而不是再次调用函数。

获取元素的outHTML

</>复制代码

  1. /**
  2. * Get outerHTML of elements, taking care
  3. * of SVG elements in IE as well.
  4. */
  5. function getOuterHTML (el: Element): string {
  6. if (el.outerHTML) {
  7. return el.outerHTML
  8. } else {
  9. const container = document.createElement("div")
  10. container.appendChild(el.cloneNode(true))
  11. return container.innerHTML
  12. }
  13. }

考虑ie下面的svg无法获取outHTML(undefined),转为获取innerHTML

过滤器模板解析函数

</>复制代码

  1. const validDivisionCharRE = /[w).+-_$]]/
  2. export function parseFilters (exp: string): string {
  3. let inSingle = false
  4. let inDouble = false
  5. let inTemplateString = false
  6. let inRegex = false
  7. let curly = 0
  8. let square = 0
  9. let paren = 0
  10. let lastFilterIndex = 0
  11. let c, prev, i, expression, filters
  12. for (i = 0; i < exp.length; i++) {
  13. prev = c
  14. c = exp.charCodeAt(i)
  15. // 0x5C =>
  16. if (inSingle) {
  17. if (c === 0x27 && prev !== 0x5C) inSingle = false
  18. } else if (inDouble) {
  19. if (c === 0x22 && prev !== 0x5C) inDouble = false
  20. } else if (inTemplateString) {
  21. if (c === 0x60 && prev !== 0x5C) inTemplateString = false
  22. } else if (inRegex) {
  23. if (c === 0x2f && prev !== 0x5C) inRegex = false
  24. } else if (
  25. c === 0x7C && // |
  26. exp.charCodeAt(i + 1) !== 0x7C &&
  27. exp.charCodeAt(i - 1) !== 0x7C &&
  28. !curly && !square && !paren
  29. ) {
  30. if (expression === undefined) {
  31. // first filter, end of expression
  32. lastFilterIndex = i + 1
  33. expression = exp.slice(0, i).trim()
  34. } else {
  35. pushFilter()
  36. }
  37. } else {
  38. switch (c) {
  39. case 0x22: inDouble = true; break // "
  40. case 0x27: inSingle = true; break // "
  41. case 0x60: inTemplateString = true; break // `
  42. case 0x28: paren++; break // (
  43. case 0x29: paren--; break // )
  44. case 0x5B: square++; break // [
  45. case 0x5D: square--; break // ]
  46. case 0x7B: curly++; break // {
  47. case 0x7D: curly--; break // }
  48. }
  49. if (c === 0x2f) { // /
  50. let j = i - 1
  51. let p
  52. // find first non-whitespace prev char
  53. for (; j >= 0; j--) {
  54. p = exp.charAt(j)
  55. if (p !== " ") break
  56. }
  57. if (!p || !validDivisionCharRE.test(p)) {
  58. inRegex = true
  59. }
  60. }
  61. }
  62. }
  63. if (expression === undefined) {
  64. expression = exp.slice(0, i).trim()
  65. } else if (lastFilterIndex !== 0) {
  66. pushFilter()
  67. }
  68. function pushFilter () {
  69. (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim())
  70. lastFilterIndex = i + 1
  71. }
  72. if (filters) {
  73. for (i = 0; i < filters.length; i++) {
  74. expression = wrapFilter(expression, filters[i])
  75. }
  76. }
  77. return expression
  78. }
  79. function wrapFilter (exp: string, filter: string): string {
  80. const i = filter.indexOf("(")
  81. if (i < 0) {
  82. // _f: resolveFilter
  83. return `_f("${filter}")(${exp})`
  84. } else {
  85. const name = filter.slice(0, i)
  86. const args = filter.slice(i + 1)
  87. return `_f("${name}")(${exp}${args !== ")" ? "," + args : args}`
  88. }
  89. }

vue有一个api叫做filters,我们可以用它来格式化我们的变量,用法类似:

</>复制代码

  1. {{ message | capitalize }}

由“管道”符号分割,表达式为管道符最前面的一项,后面跟随若干过滤器函数。

</>复制代码

  1. {{input | filter1 | filter2 }} 解析为:_f("filter2")(_f("filter1")(input))

如何分割过滤器呢,从函数中可以看到,在任何封闭符号的表达式后面,如果出现管道符"|"则将之前的字符串视为一个过滤器或者表达式。封闭符号则包括引号、括号、模板符号以及正则表达式,除正则表达式之外的符号判断都很简单,直接匹配响应符号的Unicode就行。但是正则表达式需要特殊处理:当匹配到第一个非封闭的"/"符号时,要校验它之前的第一个非空字符。采用正则表达式来匹配这一规则:

</>复制代码

  1. /[w).+-_$]]/ // 匹配任意[A-Za-z0-9_] ) . + - _ $ ]

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

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

相关文章

  • 【半月刊 4】前端高频面试题及答案汇总

    摘要:引言半月刊第四期来啦,这段时间新增了道高频面试题,今天就把最近半月汇总的面试题和部分答案发给大家,帮助大家查漏补缺,欢迎加群互相学习。更多更全的面试题和答案汇总在下面的项目中,点击查看。引言 半月刊第四期来啦,这段时间 Daily-Interview-Question 新增了 14 道高频面试题,今天就把最近半月汇总的面试题和部分答案发给大家,帮助大家查漏补缺,欢迎 加群 互相学习。 更多更...

    hankkin 评论0 收藏0
  • Vue学习笔记(一)

    摘要:一介绍也称为,读音类似,错误读音,由华人尤雨溪开源并维护。隐藏四事件之前说了一些关于事件的指令,这里详细学习一下事件的相关知识。还有一些其他键盘事件,具体参考官方文档。模板就是,用来进行数据绑定,显示在页面中,也称为语法。 一、Vue.js介绍 Vue.js也称为Vue,读音类似view,错误读音v-u-e,由华人尤雨溪开源并维护。 Vue有以下特点: 是一个构建用户界面的框架 是一...

    baoxl 评论0 收藏0
  • Vue学习笔记(一)

    摘要:一介绍也称为,读音类似,错误读音,由华人尤雨溪开源并维护。隐藏四事件之前说了一些关于事件的指令,这里详细学习一下事件的相关知识。还有一些其他键盘事件,具体参考官方文档。模板就是,用来进行数据绑定,显示在页面中,也称为语法。 一、Vue.js介绍 Vue.js也称为Vue,读音类似view,错误读音v-u-e,由华人尤雨溪开源并维护。 Vue有以下特点: 是一个构建用户界面的框架 是一...

    liukai90 评论0 收藏0
  • Vue学习笔记(一)

    摘要:一介绍也称为,读音类似,错误读音,由华人尤雨溪开源并维护。隐藏四事件之前说了一些关于事件的指令,这里详细学习一下事件的相关知识。还有一些其他键盘事件,具体参考官方文档。模板就是,用来进行数据绑定,显示在页面中,也称为语法。 一、Vue.js介绍 Vue.js也称为Vue,读音类似view,错误读音v-u-e,由华人尤雨溪开源并维护。 Vue有以下特点: 是一个构建用户界面的框架 是一...

    rollback 评论0 收藏0

发表评论

0条评论

LuDongWei

|高级讲师

TA的文章

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