摘要:原文地址項(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)格式,在這里
上一篇遺留的 filter原文地址
項(xiàng)目地址
作為 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
JSONjson: { 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文檔
currencyconst 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)值得一看
工具類 utilexport * 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
摘要:它被當(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 * @...
摘要:所以整個(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 最開始的骨...
摘要:中文官網(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...
摘要:特意對(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ì)不定期更...
摘要:因?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 面...
閱讀 711·2021-11-18 10:02
閱讀 3592·2021-09-02 10:21
閱讀 1750·2021-08-27 16:16
閱讀 2063·2019-08-30 15:56
閱讀 2390·2019-08-29 16:53
閱讀 1376·2019-08-29 11:18
閱讀 2960·2019-08-26 10:33
閱讀 2647·2019-08-23 18:34