国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

VueJS源碼學習——工具類函數實現

adam1q84 / 1860人閱讀

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

原文地址
項目地址

上一篇遺留的 filter

作為 1.0 版本頻繁使用的 filter,在 構造函數里以 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 類實現了多種過濾方法,包括

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 方法的實現其實是對 js 的 JSON 對象的方法做了一層封裝, 有意思的是發現 JSON.stringify(value, null, Number(indent) || 2), 發現 stringify 方法的第二參數和第三個參數,查了mdn 才知道后兩個參數分別代表要提取的屬性以及縮進格式,在這里是提取所有屬性并以兩個空格作為縮進,而且有趣的是這個方法會忽略值為 undefined 或者 function 的屬性,如果值為數組且數組里面有 undefined 或者 function,則轉換為 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用于數字格式化, 實現亮點在于 digitsRE 這個正則表達式,它使用了 ?=(正向預查)來匹配連續三個數字且后續一個字符還是數字的情況

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 功能的實現值得一看

工具類 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 實現了很多工具類的方法供 vue 使用,屬于底層且非業務邏輯的代碼實現,因此應該是比較好理解的一個模塊

util/lang.js set 方法

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

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) // 存在的話調用 convert 函數
  ob.dep.notify() // 這里應該就是觸發更新通知吧
  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) 的方式來調用

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

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)
}

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

_toString

_toString 函數確保值為 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)
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85092.html

相關文章

  • VueJS源碼學習——工具函數實現(二)

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

    fish 評論0 收藏0
  • VueJS源碼學習——項目結構&目錄

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

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

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

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

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

    princekin 評論0 收藏0
  • 架構師之路

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

    NikoManiac 評論0 收藏0

發表評論

0條評論

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