


Parlons des 38 fonctions de l'outil sous le module partagé Vue3 (lecture du code source)
Par rapport aux fonctions outils de Vue2
, les fonctions outils de Vue3
ont beaucoup changé Personnellement, j'ai l'impression que cela se reflète principalement dans la syntaxe. avoir pleinement adopté es6
; [Recommandations associées : Tutoriel vidéo vuejs, développement web front-end]Vue3
的工具函数对比于Vue2
的工具函数变化还是很大的,个人感觉主要还是体现在语法上,已经全面拥抱es6
了;【相关推荐:vuejs视频教程、web前端开发】
对比于工具类的功能变化并没有多少,大多数基本上都是一样的,只是语法上和实现上有略微的区别;
源码地址:
之前介绍了很多阅读方式,这次就直接跳过了,直接开始阅读源码;
所有工具函数
-
makeMap
: 生成一个类似于Set
的对象,用于判断是否存在某个值 -
EMPTY_OBJ
: 空对象 -
EMPTY_ARR
: 空数组 -
NOOP
: 空函数 -
NO
: 返回false
的函数 -
isOn
: 判断是否是on
开头的事件 -
isModelListener
: 判断onUpdate
开头的字符串 -
extend
: 合并对象 -
remove
: 移除数组中的某个值 -
hasOwn
: 判断对象是否有某个属性 -
isArray
: 判断是否是数组 -
isMap
: 判断是否是Map
-
isSet
: 判断是否是Set
-
isDate
: 判断是否是Date
-
isRegExp
: 判断是否是RegExp
-
isFunction
: 判断是否是函数 -
isString
: 判断是否是字符串 -
isSymbol
: 判断是否是Symbol
-
isObject
: 判断是否是对象 -
isPromise
: 判断是否是Promise
-
objectToString
:Object.prototype.toString
-
toTypeString
:Object.prototype.toString
的简写 -
toRawType
: 获取对象的类型 -
isPlainObject
: 判断是否是普通对象 -
isIntegerKey
: 判断是否是整数key
-
isReservedProp
: 判断是否是保留属性 -
isBuiltInDirective
: 判断是否是内置指令 -
camelize
: 将字符串转换为驼峰 -
hyphenate
: 将字符串转换为连字符 -
capitalize
: 将字符串首字母大写 -
toHandlerKey
: 将字符串转换为事件处理的key
-
hasChanged
: 判断两个值是否相等 -
invokeArrayFns
: 调用数组中的函数 -
def
: 定义对象的属性 -
looseToNumber
: 将字符串转换为数字 -
toNumber
: 将字符串转换为数字 -
getGlobalThis
: 获取全局对象 -
genPropsAccessExp
: 生成props
的访问表达式
这其中有大部分和Vue2
的工具函数是一样的,还有数据类型的判断,使用的是同一种方式,因为有了之前Vue2
的阅读经验,所以这次快速阅读;
如果想要详细的可以看我之前写的文章:【源码共读】Vue2源码 shared 模块中的36个实用工具函数分析;
而且这次是直接源码,ts
版本的,不再处理成js
,所以直接阅读ts
源码;
正式开始
makeMap
export function makeMap( str: string, expectsLowerCase?: boolean ): (key: string) => boolean { const map: Record<string, boolean> = Object.create(null) const list: Array<string> = str.split(',') for (let i = 0; i < list.length; i++) { map[list[i]] = true } return expectsLowerCase ? val => !!map[val.toLowerCase()] : val => !!map[val] }
makeMap
的源码在同级目录下的makeMap.ts
文件中,引入进来之后直接使用export
关键字导出,实现方式和Vue2
Fonction Tous les outils
makeMap
: Génère un objet similaire àSet
pour déterminer si une certaine valeur existeEMPTY_OBJ
: Objet videEMPTY_ARR
: Tableau videNOOP
: Fonction videNO
: Fonction qui renvoiefalse
isOn</code > : Détermine s'il s'agit de <code> Événements commençant par on
isModelListener
: Détermine la chaîne commençant paronUpdate
extend</li> code> : Fusionner des objets</li><li><code>remove
: Supprimer une certaine valeur dans le tableauhasOwn
: Détermine si l'objet a certains attributs de valeurisArray
: Détermine s'il s'agit d'un tableauisMap</code > : Détermine s'il s'agit d'un <code>Map
< /li>isSet
: Détermine s'il s'agit d'unSet
-
isDate
: Détermine s'il s'agit deDate< /code></li><li><code>isRegExp
: Détermine s'il s'agit deRegExp
< /li> isFunction
: Détermine s'il s'agit d'une fonctionisString
: Détermine s'il s'agit d'une chaîne-
isSymbol
: Déterminez s'il s'agit d'unSymbol
li> isObject
: Déterminez s'il s'agit d'un objet-
isPromise
: Déterminez s'il s'agit d'unePromesse
< li> toTypeString
:Object.prototype.toString</code >Abréviation</li><li><code>toRawType
: Obtient le type d'objetisPlainObject
: Détermine s'il s'agit d'un objet normalisIntegerKey
: Détermine s'il s'agit d'unkey< entier /code></li><li><code>isReservedProp
: Détermine s'il s'agit d'une propriété réservée-
isBuiltInDirective
: Détermine s'il s'agit d'une propriété intégrée instruction camelize
: Convertir la chaîne en casse chameauhyphenate</code > : Convertir la chaîne en traits d'union</li><li ><code>capitaliser
: Mettre en majuscule la première lettre de la chaînetoHandlerKey
: Convertir la chaîne en Converti enclé
< de traitement d'événements /li>hasChanged
: Déterminer si deux valeurssont égalesinvokeArrayFns
: Appeler la fonction dans le tableaudef
: Définir les propriétés de l'objetlooseToNumber
: Convertir une chaîne en nombre- li>
toNumber
: Convertir une chaîne en nombregetGlobalThis
: Récupérer l'objet globalgenPropsAccessExp < /code> : Générer des expressions d'accès pour les <code>props
objectToString
: Object.prototype.toString
Vue2
, et il y a les mêmes est utilisée pour déterminer le type de données. En raison de l'expérience de lecture précédente de Vue2
, je l'ai lu rapidement cette fois-ci 🎜🎜Si vous voulez plus de détails, vous pouvez lire l'article que j'ai écrit avant : < a href="https://www.php.cn/link/af4d96ada35c008ae94d257c86efb215" target="_blank" title="https://www.php.cn/link/af4d96ada35c008ae94d257c86efb215">[Lecture partagée du code source] Code source de Vue2 analyse des fonctions utilitaires du module partagé 36;🎜🎜Et cette fois c'est le code source direct, version ts
, qui n'est plus traité en js
, alors lisez directement< code>tsCode source ; 🎜Démarrage officiel
Le code source de makeMap
export const EMPTY_OBJ: { readonly [key: string]: any } = __DEV__ ? Object.freeze({}) : {} export const EMPTY_ARR = __DEV__ ? Object.freeze([]) : []
makeMap
se trouve dans le fichier makeMap.ts
dans le même répertoire. Après l'avoir importé, utilisez directement export< /code>Export de mots clés, la méthode d'implémentation est la même que celle de <code>Vue2
🎜 ;EMPTY_OBJ & EMPTY_ARR
export const EMPTY_OBJ: { readonly [key: string]: any } = __DEV__ ? Object.freeze({}) : {} export const EMPTY_ARR = __DEV__ ? Object.freeze([]) : []
EMPTY_OBJ
和EMPTY_ARR
的实现方式和Vue2
的emptyObject
相同,都是使用Object.freeze
冻结对象,防止对象被修改;
NOOP
export const NOOP = () => {}
和Vue2
的noop
实现方式相同,都是一个空函数,移除了入参;
NO
/** * Always return false. */ export const NO = () => false
和Vue2
的no
实现方式相同,都是一个返回false
的函数,移除了入参;
isOn
const onRE = /^on[^a-z]/ export const isOn = (key: string) => onRE.test(key)
判断是否是on
开头的事件,并且on
后面的第一个字符不是小写字母;
isModelListener
export const isModelListener = (key: string) => key.startsWith('onUpdate:')
判断是否是onUpdate:
开头的字符串;
参考:startWith
extend
export const extend = Object.assign
直接拥抱es6
的Object.assign
,Vue2
的实现方式是使用for in
循环;
remove
export const remove = <T>(arr: T[], el: T) => { const i = arr.indexOf(el) if (i > -1) { arr.splice(i, 1) } }
对比于Vue2
删除了一些代码,之前的快速删除最后一个元素的判断不见了;
猜测可能是因为有bug
,因为大家都知道Vue2
的数组响应式必须使用Array
的api
,那样操作可能会导致数组响应式失效;
hasOwn
const hasOwnProperty = Object.prototype.hasOwnProperty export const hasOwn = ( val: object, key: string | symbol ): key is keyof typeof val => hasOwnProperty.call(val, key)
使用的是Object.prototype.hasOwnProperty
,和Vue2
相同;
isArray
export const isArray = Array.isArray
使用的是Array.isArray
,和Vue2
相同;
isMap & isSet & isDate & isRegExp
export const isMap = (val: unknown): val is Map<any, any> => toTypeString(val) === '[object Map]' export const isSet = (val: unknown): val is Set<any> => toTypeString(val) === '[object Set]' export const isDate = (val: unknown): val is Date => toTypeString(val) === '[object Date]' export const isRegExp = (val: unknown): val is RegExp => toTypeString(val) === '[object RegExp]'
都是使用Object.toString
来判断类型,对比于Vue2
新增了isMap
和isSet
和isDate
,实现方式没变;
isFunction & isString & isSymbol & isObject
export const isFunction = (val: unknown): val is Function => typeof val === 'function' export const isString = (val: unknown): val is string => typeof val === 'string' export const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol' export const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object'
和Vue2
的实现方式相同,都是使用typeof
来判断类型,新增了isSymbol
;
isPromise
export const isPromise = <T = any>(val: unknown): val is Promise<T> => { return isObject(val) && isFunction(val.then) && isFunction(val.catch) }
和Vue2
对比修改了实现方式,但是判断逻辑没变;
objectToString
export const objectToString = Object.prototype.toString
直接是Object.prototype.toString
;
toTypeString
export const toTypeString = (value: unknown): string => objectToString.call(value)
对入参执行Object.prototype.toString
;
toRawType
export const toRawType = (value: unknown): string => { // extract "RawType" from strings like "[object RawType]" return toTypeString(value).slice(8, -1) }
和Vue2
的实现方式相同;
isPlainObject
export const isPlainObject = (val: unknown): val is object => toTypeString(val) === '[object Object]'
和Vue2
的实现方式相同;
isIntegerKey
export const isIntegerKey = (key: unknown) => isString(key) && key !== 'NaN' && key[0] !== '-' && '' + parseInt(key, 10) === key
判断一个字符串是不是由一个整数组成的;
isReservedProp
export const isReservedProp = /*#__PURE__*/ makeMap( // the leading comma is intentional so empty string "" is also included ',key,ref,ref_for,ref_key,' + 'onVnodeBeforeMount,onVnodeMounted,' + 'onVnodeBeforeUpdate,onVnodeUpdated,' + 'onVnodeBeforeUnmount,onVnodeUnmounted' )
使用makeMap
生成一个对象,用于判断入参是否是内部保留的属性;
isBuiltInDirective
export const isBuiltInDirective = /*#__PURE__*/ makeMap( 'bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo' )
使用makeMap
生成一个对象,用于判断入参是否是内置的指令;
cacheStringFunction
const cacheStringFunction = <T extends (str: string) => string>(fn: T): T => { const cache: Record<string, string> = Object.create(null) return ((str: string) => { const hit = cache[str] return hit || (cache[str] = fn(str)) }) as T }
同Vue2
的cached
相同,用于缓存字符串;
camelize
const camelizeRE = /-(\w)/g /** * @private */ export const camelize = cacheStringFunction((str: string): string => { return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : '')) })
将-
连接的字符串转换为驼峰式,同Vue2
的camelize
相同;
capitalize
const hyphenateRE = /\B([A-Z])/g /** * @private */ export const hyphenate = cacheStringFunction((str: string) => str.replace(hyphenateRE, '-$1').toLowerCase() )
将驼峰式字符串转换为-
连接的字符串,同Vue2
的hyphenate
相同;
capitalize
/** * @private */ export const capitalize = cacheStringFunction( (str: string) => str.charAt(0).toUpperCase() + str.slice(1) )
将字符串首字母大写,同Vue2
的capitalize
相同;
toHandlerKey
/** * @private */ export const toHandlerKey = cacheStringFunction((str: string) => str ? `on${capitalize(str)}` : `` )
将字符串首字母大写并在前面加上on
;
hasChanged
// compare whether a value has changed, accounting for NaN. export const hasChanged = (value: any, oldValue: any): boolean => !Object.is(value, oldValue)
和Vue2
相比,移除了polyfill
,直接使用Object.is
;
invokeArrayFns
export const invokeArrayFns = (fns: Function[], arg?: any) => { for (let i = 0; i < fns.length; i++) { fns[i](arg) } }
批量调用传递过来的函数列表,如果有参数,会将参数传递给每个函数;
def
export const def = (obj: object, key: string | symbol, value: any) => { Object.defineProperty(obj, key, { configurable: true, enumerable: false, value }) }
使用Object.defineProperty
定义一个属性,并使这个属性不可枚举;
looseToNumber
/** * "123-foo" will be parsed to 123 * This is used for the .number modifier in v-model */ export const looseToNumber = (val: any): any => { const n = parseFloat(val) return isNaN(n) ? val : n }
将字符串转换为数字,如果转换失败,返回原字符串;
通过注释知道主要用于v-model
的.number
修饰符;
toNumber
/** * Only conerces number-like strings * "123-foo" will be returned as-is */ export const toNumber = (val: any): any => { const n = isString(val) ? Number(val) : NaN return isNaN(n) ? val : n }
将字符串转换为数字,如果转换失败,返回原数据;
getGlobalThis
let _globalThis: any export const getGlobalThis = (): any => { return ( _globalThis || (_globalThis = typeof globalThis !== 'undefined' ? globalThis : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {}) ) }
获取全局对象,根据环境不同返回的对象也不同;
genPropsAccessExp
const identRE = /^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/ export function genPropsAccessExp(name: string) { return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]` }
生成props
的访问表达式,如果name
是合法的标识符,直接返回__props.name
,否则返回通过JSON.stringify
转换后的__props[name]
;
总结
通过这次的源码阅读,我们巩固了一些基础知识,通过对比Vue2
的工具函数,我们也了解了Vue3
的一些变化;
这些变化个人感觉主要集中在拥抱es6
,可以看到放弃ie
是多么自由而奔放;
话外题,不知道大家有没有发现MDN
上面的浏览器兼容性表格,已经没有了ie
的相关信息。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il existe trois façons de se référer aux fichiers JS dans Vue.js: spécifiez directement le chemin à l'aide du & lt; script & gt; étiqueter;; importation dynamique à l'aide du crochet de cycle de vie monté (); et l'importation via la bibliothèque de gestion de l'État Vuex.

L'option Watch dans Vue.js permet aux développeurs d'écouter des modifications de données spécifiques. Lorsque les données changent, regardez déclenche une fonction de rappel pour effectuer des vues de mise à jour ou d'autres tâches. Ses options de configuration incluent immédiatement, qui spécifie s'il faut exécuter un rappel immédiatement, et profond, ce qui spécifie s'il faut écouter récursivement les modifications des objets ou des tableaux.

Vous pouvez ajouter une fonction au bouton VUE en liant le bouton dans le modèle HTML à une méthode. Définissez la logique de la fonction de méthode et d'écriture dans l'instance Vue.

L'utilisation de bootstrap dans vue.js est divisée en cinq étapes: installer bootstrap. Importer un bootstrap dans main.js. Utilisez le composant bootstrap directement dans le modèle. Facultatif: style personnalisé. Facultatif: utilisez des plug-ins.

Vue.js dispose de quatre méthodes pour revenir à la page précédente: $ router.go (-1) $ router.back () utilise & lt; router-link to = & quot; / & quot; Composant Window.History.back (), et la sélection de la méthode dépend de la scène.

Implémentez les effets de défilement marquee / texte dans VUE, en utilisant des animations CSS ou des bibliothèques tierces. Cet article présente comment utiliser l'animation CSS: créer du texte de défilement et envelopper du texte avec & lt; div & gt;. Définissez les animations CSS et défini: caché, largeur et animation. Définissez les images clés, Set Transforment: Translatex () au début et à la fin de l'animation. Ajustez les propriétés d'animation telles que la durée, la vitesse de défilement et la direction.

Dans vue.js, le chargement paresseux permet de charger dynamiquement les composants ou les ressources, en réduisant le temps de chargement des pages initiales et en améliorant les performances. La méthode de mise en œuvre spécifique comprend l'utilisation de & lt; keep-alive & gt; et & lt; composant est & gt; composants. Il convient de noter que le chargement paresseux peut provoquer des problèmes de FOUC (écran d'éclat) et ne doit être utilisé que pour les composants qui nécessitent un chargement paresseux pour éviter les frais généraux de performances inutiles.

Vous pouvez interroger la version Vue en utilisant Vue Devtools pour afficher l'onglet Vue dans la console du navigateur. Utilisez NPM pour exécuter la commande "NPM List -g Vue". Recherchez l'élément VUE dans l'objet "dépendances" du fichier package.json. Pour les projets Vue CLI, exécutez la commande "Vue --version". Vérifiez les informations de la version dans le & lt; script & gt; Tag dans le fichier html qui fait référence au fichier VUE.
