成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

VueJS源碼學(xué)習(xí)——工具類函數(shù)實現(xiàn)

adam1q84 / 1865人閱讀

摘要:原文地址項目地址上一篇遺留的作為版本頻繁使用的,在構(gòu)造函數(shù)里以引入類實現(xiàn)了多種過濾方法包括方法的實現(xiàn)其實是對的對象的方法做了一層封裝,有意思的是發(fā)現(xiàn)發(fā)現(xiàn)方法的第二參數(shù)和第三個參數(shù),查了才知道后兩個參數(shù)分別代表要提取的屬性以及縮進(jìn)格式,在這里

原文地址
項目地址

上一篇遺留的 filter

作為 1.0 版本頻繁使用的 filter,在 構(gòu)造函數(shù)里以 Vue.Options.filters 引入:

...
import filters from "./filters/index"
...

Vue.version = "1.0.8"
...
Vue.options = {
  directives,
  elementDirectives,
  filters,
  transitions: {},
  components: {},
  partials: {},
  replace: true
}

export default Vue

...

filter 類實現(xiàn)了多種過濾方法,包括

orderBy

filterBy

limitBy

json

capitalize

uppercase

lowercase

currency

pluralize

debounce

JSON
  json: {
    read: function (value, indent) {
      return typeof value === "string"
        ? value
        : JSON.stringify(value, null, Number(indent) || 2)
    },
    write: function (value) {
      try {
        return JSON.parse(value)
      } catch (e) {
        return value
      }
    }
  },

json 方法的實現(xiàn)其實是對 js 的 JSON 對象的方法做了一層封裝, 有意思的是發(fā)現(xiàn) JSON.stringify(value, null, Number(indent) || 2), 發(fā)現(xiàn) stringify 方法的第二參數(shù)和第三個參數(shù),查了mdn 才知道后兩個參數(shù)分別代表要提取的屬性以及縮進(jìn)格式,在這里是提取所有屬性并以兩個空格作為縮進(jìn),而且有趣的是這個方法會忽略值為 undefined 或者 function 的屬性,如果值為數(shù)組且數(shù)組里面有 undefined 或者 function,則轉(zhuǎn)換為 null,更多特性請參考MDN文檔

currency
  const digitsRE = /(d{3})(?=d)/g
  /**
   * 12345 => $12,345.00
   *
   * @param {String} sign
   */

  currency (value, currency) {
    value = parseFloat(value)
    if (!isFinite(value) || (!value && value !== 0)) return ""
    currency = currency != null ? currency : "$"
    var stringified = Math.abs(value).toFixed(2)
    var _int = stringified.slice(0, -3)
    var i = _int.length % 3
    var head = i > 0
      ? (_int.slice(0, i) + (_int.length > 3 ? "," : ""))
      : ""
    var _float = stringified.slice(-3)
    var sign = value < 0 ? "-" : ""
    return currency + sign + head +
      _int.slice(i).replace(digitsRE, "$1,") +
      _float
  }

currency用于數(shù)字格式化, 實現(xiàn)亮點在于 digitsRE 這個正則表達(dá)式,它使用了 ?=(正向預(yù)查)來匹配連續(xù)三個數(shù)字且后續(xù)一個字符還是數(shù)字的情況

export function filterBy (arr, search, delimiter) {
  arr = convertArray(arr)
  if (search == null) {
    return arr
  }
  if (typeof search === "function") {
    return arr.filter(search)
  }
  // cast to lowercase string
  search = ("" + search).toLowerCase()
  // allow optional `in` delimiter
  // because why not
  var n = delimiter === "in" ? 3 : 2
  // extract and flatten keys
  var keys = toArray(arguments, n).reduce(function (prev, cur) {
    return prev.concat(cur)
  }, [])
  var res = []
  var item, key, val, j
  for (var i = 0, l = arr.length; i < l; i++) {
    item = arr[i]
    val = (item && item.$value) || item
    j = keys.length
    if (j) {
      while (j--) {
        key = keys[j]
        if ((key === "$key" && contains(item.$key, search)) ||
            contains(getPath(val, key), search)) {
          res.push(item)
          break
        }
      }
    } else if (contains(item, search)) {
      res.push(item)
    }
  }
  return res
}

filterBy 功能的實現(xiàn)值得一看

工具類 util
export * from "./lang"
export * from "./env"
export * from "./dom"
export * from "./options"
export * from "./component"
export * from "./debug"
export { defineReactive } from "../observer/index"

util 實現(xiàn)了很多工具類的方法供 vue 使用,屬于底層且非業(yè)務(wù)邏輯的代碼實現(xiàn),因此應(yīng)該是比較好理解的一個模塊

util/lang.js set 方法

lang 實現(xiàn)的第一個方法是 set(obj, key, val), 不過和理解的不同,工具類方法的實現(xiàn)是可能包含業(yè)務(wù)邏輯的,set 會為 object 的某個屬性設(shè)置新的值,并且如果屬性不存在,會觸發(fā)通知

export function set (obj, key, val) {
  if (hasOwn(obj, key)) { // 如果存在這個屬性,直接更新該值并返回
    obj[key] = val
    return
  }
  if (obj._isVue) { // 如果是 vue 對象,則更新 obj 為 obj._data
    set(obj._data, key, val)
    return
  }
  var ob = obj.__ob__  // 不存在該屬性時,獲取 obj 的 __ob__ 屬性值
  if (!ob) { // 不存在時直接更新返回
    obj[key] = val
    return
  }
  ob.convert(key, val) // 存在的話調(diào)用 convert 函數(shù)
  ob.dep.notify() // 這里應(yīng)該就是觸發(fā)更新通知吧
  if (ob.vms) { // vms 暫時不知道是什么
    var i = ob.vms.length
    while (i--) {
      var vm = ob.vms[i]
      vm._proxy(key)
      vm._digest()
    }
  }
}

var hasOwnProperty = Object.prototype.hasOwnProperty
/**
 * Check whether the object has the property.
 *
 * @param {Object} obj
 * @param {String} key
 * @return {Boolean}
 */
export function hasOwn (obj, key) {
  return hasOwnProperty.call(obj, key)
}

hasOwnProperty 用來檢測對象是否含有某個屬性,不包括繼承的,為了避免 hasOwnProperty 被重寫,最好使用 Object.prototype.hasOwnProperty.call(obj, key) 的方式來調(diào)用

del(obj,key) 用來刪除相關(guān)的屬性也是類似的操作

isLiteral
/**
 * Check if an expression is a literal value.
 *
 * @param {String} exp
 * @return {Boolean}
 */

var literalValueRE = /^s?(true|false|[d.]+|"[^"]*"|"[^"]*")s?$/
export function isLiteral (exp) {
  return literalValueRE.test(exp)
}

暫時不知道是用在哪里,從正則表達(dá)式看來是匹配一段文本字符串

_toString

_toString 函數(shù)確保值為 null 或為 undefinded 輸出為空字符串, 這里利用的模糊等號 "==" 來匹配 null 和 undefined:

export function _toString (value) {
  return value == null
    ? ""
    : value.toString()
}
camelize(駝峰) 和 hyphenate(連字符)
var camelizeRE = /-(w)/g
export function camelize (str) {
  return str.replace(camelizeRE, toUpper)
}

function toUpper (_, c) {
  console.log(arguments);
  return c ? c.toUpperCase() : ""
}

var hyphenateRE = /([a-zd])([A-Z])/g
export function hyphenate (str) {
  return str
    .replace(hyphenateRE, "$1-$2")
    .toLowerCase()
}
/**
 * Converts hyphen/underscore/slash delimitered names into
 * camelized classNames.
 *
 * e.g. my-component => MyComponent
 *      some_else    => SomeElse
 *      some/comp    => SomeComp
 *
 * @param {String} str
 * @return {String}
 */

var classifyRE = /(?:^|[-_/])(w)/g // 使用了非獲取匹配
export function classify (str) {
  return str.replace(classifyRE, toUpper)
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85092.html

相關(guān)文章

  • VueJS源碼學(xué)習(xí)——工具函數(shù)實現(xiàn)(二)

    摘要:它被當(dāng)做一個輕量版本的使用,用于存儲已排好版的或尚未打理好格式的片段。最大的區(qū)別是因為不是真實樹的其中一部分,它的變化不會引起樹的重新渲染的操作,或者導(dǎo)致性能影響的問題出現(xiàn)。 原文地址項目地址 工具類 /** * Simple bind, faster than native * * @param {Function} fn * @param {Object} ctx * @...

    fish 評論0 收藏0
  • VueJS源碼學(xué)習(xí)——項目結(jié)構(gòu)&目錄

    摘要:所以整個的核心,就是如何實現(xiàn)這三樣?xùn)|西以上摘自囧克斯博客的一篇文章從版本開始這個時候的項目結(jié)構(gòu)如下源碼在里面,為打包編譯的代碼,為打包后代碼放置的位置,為測試代碼目錄。節(jié)點類型摘自資源另一位作者關(guān)于源碼解析 本項目的源碼學(xué)習(xí)筆記是基于 Vue 1.0.9 版本的也就是最早的 tag 版本,之所以選擇這個版本,是因為這個是最原始沒有太多功能拓展的版本,有利于更好的看到 Vue 最開始的骨...

    ad6623 評論0 收藏0
  • Vue.js資源分享

    摘要:中文官網(wǎng)英文官網(wǎng)組織發(fā)出一個問題之后,不要暫時的離開電腦,如果沒有把握先不要提問。珍惜每一次提問,感恩每一次反饋,每個人工作還是業(yè)余之外抽出的時間有限,充分準(zhǔn)備好應(yīng)有的資源之后再發(fā)問,有利于問題能夠高效質(zhì)量地得到解決。 Vue.js資源分享 更多資源請Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/maid...

    vpants 評論0 收藏0
  • 前端資源系列(4)-前端學(xué)習(xí)資源分享&前端面試資源匯總

    摘要:特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對前端學(xué)習(xí)資源做一個匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會及時更新,平時業(yè)務(wù)工作時也會不定期更...

    princekin 評論0 收藏0
  • 架構(gòu)師之路

    摘要:因為用戶不用在第一次進(jìn)入應(yīng)用時下載所有代碼,用戶能更快的看到頁面并與之交互。譯高階函數(shù)利用和來編寫更易維護(hù)的代碼高階函數(shù)可以幫助你增強(qiáng)你的,讓你的代碼更具有聲明性。知道什么時候和怎樣使用高階函數(shù)是至關(guān)重要的。 Vue 折騰記 - (10) 給axios做個挺靠譜的封裝(報錯,鑒權(quán),跳轉(zhuǎn),攔截,提示) 稍微改改都能直接拿來用~~~喲吼吼,喲吼吼..... 如何無痛降低 if else 面...

    NikoManiac 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<