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

資訊專欄INFORMATION COLUMN

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

adam1q84 / 1862人閱讀

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

原文地址
項(xiàng)目地址

上一篇遺留的 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 類實(shí)現(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 方法的實(shí)現(xiàn)其實(shí)是對(duì) js 的 JSON 對(duì)象的方法做了一層封裝, 有意思的是發(fā)現(xiàn) JSON.stringify(value, null, Number(indent) || 2), 發(fā)現(xiàn) stringify 方法的第二參數(shù)和第三個(gè)參數(shù),查了mdn 才知道后兩個(gè)參數(shù)分別代表要提取的屬性以及縮進(jìn)格式,在這里是提取所有屬性并以兩個(gè)空格作為縮進(jìn),而且有趣的是這個(gè)方法會(huì)忽略值為 undefined 或者 function 的屬性,如果值為數(shù)組且數(shù)組里面有 undefined 或者 function,則轉(zhuǎn)換為 null,更多特性請(qǐng)參考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ù)字格式化, 實(shí)現(xiàn)亮點(diǎn)在于 digitsRE 這個(gè)正則表達(dá)式,它使用了 ?=(正向預(yù)查)來匹配連續(xù)三個(gè)數(shù)字且后續(xù)一個(gè)字符還是數(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 功能的實(shí)現(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 實(shí)現(xiàn)了很多工具類的方法供 vue 使用,屬于底層且非業(yè)務(wù)邏輯的代碼實(shí)現(xiàn),因此應(yīng)該是比較好理解的一個(gè)模塊

util/lang.js set 方法

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

export function set (obj, key, val) {
  if (hasOwn(obj, key)) { // 如果存在這個(gè)屬性,直接更新該值并返回
    obj[key] = val
    return
  }
  if (obj._isVue) { // 如果是 vue 對(duì)象,則更新 obj 為 obj._data
    set(obj._data, key, val)
    return
  }
  var ob = obj.__ob__  // 不存在該屬性時(shí),獲取 obj 的 __ob__ 屬性值
  if (!ob) { // 不存在時(shí)直接更新返回
    obj[key] = val
    return
  }
  ob.convert(key, val) // 存在的話調(diào)用 convert 函數(shù)
  ob.dep.notify() // 這里應(yīng)該就是觸發(fā)更新通知吧
  if (ob.vms) { // vms 暫時(shí)不知道是什么
    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 用來檢測(cè)對(duì)象是否含有某個(gè)屬性,不包括繼承的,為了避免 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)
}

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

_toString

_toString 函數(shù)確保值為 null 或?yàn)?undefinded 輸出為空字符串, 這里利用的模糊等號(hào) "==" 來匹配 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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85092.html

相關(guān)文章

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

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

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

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

    ad6623 評(píng)論0 收藏0
  • Vue.js資源分享

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

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

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

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

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

    NikoManiac 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<