zoukankan      html  css  js  c++  java
  • vue.js 源代码学习笔记 ----- helpers.js

    /* @flow */
    
    import { parseFilters } from './parser/filter-parser'
    
    export function baseWarn (msg: string) {
      console.error(`[Vue parser]: ${msg}`)
    }
    
    export function pluckModuleFunction (
      modules: ?Array<Object>,
      key: string
    ): Array<Function> {
      return modules
        ? modules.map(m => m[key]).filter(_ => _)
        : []
    }
    
    export function addProp (el: ASTElement, name: string, value: string) {
      (el.props || (el.props = [])).push({ name, value })
    }
    
    export function addAttr (el: ASTElement, name: string, value: string) {
      (el.attrs || (el.attrs = [])).push({ name, value })
    }
    
    export function addDirective (
      el: ASTElement,
      name: string,
      rawName: string,
      value: string,
      arg: ?string,
      modifiers: ?ASTModifiers
    ) {
      (el.directives || (el.directives = [])).push({ name, rawName, value, arg, modifiers })
    }
    
    export function addHandler (
      el: ASTElement,
      name: string,
      value: string,
      modifiers: ?ASTModifiers,
      important: ?boolean
    ) {
      // check capture modifier
      if (modifiers && modifiers.capture) {
        delete modifiers.capture
        name = '!' + name // mark the event as captured
      }
      let events
      if (modifiers && modifiers.native) {
        delete modifiers.native
        events = el.nativeEvents || (el.nativeEvents = {})
      } else {
        events = el.events || (el.events = {})
      }
      const newHandler = { value, modifiers }
      const handlers = events[name]
      /* istanbul ignore if */
      if (Array.isArray(handlers)) {
        important ? handlers.unshift(newHandler) : handlers.push(newHandler)
      } else if (handlers) {
        events[name] = important ? [newHandler, handlers] : [handlers, newHandler]
      } else {
        events[name] = newHandler
      }
    }
    
    export function getBindingAttr (
      el: ASTElement,
      name: string,
      getStatic?: boolean
    ): ?string {
      const dynamicValue =
        getAndRemoveAttr(el, ':' + name) ||
        getAndRemoveAttr(el, 'v-bind:' + name)
      if (dynamicValue != null) {
        return parseFilters(dynamicValue)
      } else if (getStatic !== false) {
        const staticValue = getAndRemoveAttr(el, name)
        if (staticValue != null) {
          return JSON.stringify(staticValue)
        }
      }
    }
    
    export function getAndRemoveAttr (el: ASTElement, name: string): ?string {
      let val
      if ((val = el.attrsMap[name]) != null) {
        const list = el.attrsList
        for (let i = 0, l = list.length; i < l; i++) {
          if (list[i].name === name) {
            list.splice(i, 1)
            break
          }
        }
      }
      return val
    }
    
    let len, str, chr, index, expressionPos, expressionEndPos
    
    /**
     * parse directive model to do the array update transform. a[idx] = val => $$a.splice($$idx, 1, val)
     *
     * for loop possible cases:
     *
     * - test
     * - test[idx]
     * - test[test1[idx]]
     * - test["a"][idx]
     * - xxx.test[a[a].test1[idx]]
     * - test.xxx.a["asa"][test1[idx]]
     *
     */
    
    export function parseModel (val: string): Object {
      str = val
      len = str.length
      index = expressionPos = expressionEndPos = 0
    
      if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {
        return {
          exp: val,
          idx: null
        }
      }
    
      while (!eof()) {
        chr = next()
        /* istanbul ignore if */
        if (isStringStart(chr)) {
          parseString(chr)
        } else if (chr === 0x5B) {
          parseBracket(chr)
        }
      }
    
      return {
        exp: val.substring(0, expressionPos),
        idx: val.substring(expressionPos + 1, expressionEndPos)
      }
    }
    
    function next (): number {
      return str.charCodeAt(++index)
    }
    
    function eof (): boolean {
      return index >= len
    }
    
    function isStringStart (chr: number): boolean {
      return chr === 0x22 || chr === 0x27
    }
    
    function parseBracket (chr: number): void {
      let inBracket = 1
      expressionPos = index
      while (!eof()) {
        chr = next()
        if (isStringStart(chr)) {
          parseString(chr)
          continue
        }
        if (chr === 0x5B) inBracket++
        if (chr === 0x5D) inBracket--
        if (inBracket === 0) {
          expressionEndPos = index
          break
        }
      }
    }
    
    function parseString (chr: number): void {
      const stringQuote = chr
      while (!eof()) {
        chr = next()
        if (chr === stringQuote) {
          break
        }
      }
    }
  • 相关阅读:
    【Windows核心编程】重载类成员函数new / new[] / delete / delete[]
    【数据结构和算法】 O(1)时间取得栈中的最大 / 最小元素值
    路由器与交换机做链路聚合
    怎么样判断两个IP地址是否在同一个网段
    sqlite常用的命令-增删改查
    5G时代的智慧灯杆需要哪种网关?
    什么是边缘计算网关?
    5G/4G工业智能网关在工业物联网的必要性
    基于5G/4G网关的冷冻设备远程监测及故障预警系统
    工业5G网关配置POE技术的优势
  • 原文地址:https://www.cnblogs.com/dhsz/p/7245896.html
Copyright © 2011-2022 走看看