最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue打印錯(cuò)誤日志問題

 更新時(shí)間:2022年10月19日 10:39:15   作者:包達(dá)叔  
這篇文章主要介紹了Vue打印錯(cuò)誤日志問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Vue3全局方法和靜態(tài)配置文件的最佳實(shí)踐

Vue3中打印錯(cuò)誤日志的最佳實(shí)踐: 推薦引入全局自定義方法clog,任何地方打印任何類型

在Vue3.0中全局的方法一般有下面兩個(gè)

  • 方式一 使用 app.config.globalProperties
  • 方式二 通過依賴和注入(provide 和 inject)來完成

但是這兩種方法使用起來都非常的不方便

推薦如下方案

Vue3全局方法最佳方案

1.添加一個(gè)工具類,例如utils.ts

import moment from "moment";
// 判斷對象,數(shù)組,字符串是否為空,例如:  undefined , null , '' , '   ' , {}  , [] 全部判斷為空
export function isNull(obj: any): boolean {
	if (obj === null || obj === undefined) {
		return true
	}
	if (typeof obj === 'object') {
		let json = JSON.stringify(obj)
		if (json === '{}') {
			return true
		}
		if (json === '[]') {
			return true
		}
		return false
	}
	let str = String(obj)
	if (str === 'undefined' || str === 'null' || str === '' || !str || !/[^\s]/.test(str)) {
		return true
	}
	return false
}
// 控制臺(tái)日志,支持傳一個(gè)參數(shù)(對象/字符串), 也支持傳兩個(gè)參數(shù)(標(biāo)志,日志消息<可以是對象,可以是字符串>)
export function clog(flag, value: any = 'xxxxxxxxxxxxxxxxxxx=Default-value_override+xxxxxxxxxxxxxxxxx'): string {
	try {
		let tmp = ""
		// 如果value為默認(rèn)值,則沒有傳遞第二個(gè)參數(shù),只處理第一個(gè)參數(shù)
		if (value === `xxxxxxxxxxxxxxxxxxx=Default-value_override+xxxxxxxxxxxxxxxxx`) {
			tmp = JSON.stringify(flag);
			console.log(tmp)
		} else if (isNull(value)) {
			tmp = JSON.stringify(flag);
			console.log(tmp + ":")
		} else if (isNull(flag)) {
			tmp = JSON.stringify(value);
			console.log(":" + tmp)
		} else {
			tmp = JSON.stringify(value);
			console.log(flag + ":" + tmp)
		}
		return tmp
	} catch (err) {
		console.log("log", err)
		return " 空對象或者空字符串 "
	}
}
// 日期格式化
export function dateFormatter(str, isDate = false) {
	if (isNull(str)) return undefined
	if (isDate === true) {
		return moment(str).format(
			'YYYY-MM-DD'
		)
	} else {
		return moment(str).format(
			'YYYY-MM-DD HH:mm:ss'
		)
	}
}
//把日期字符串轉(zhuǎn)換為純數(shù)字,例如20191231235959
export function dateFormatterNumber(str, hasTime = true, hasSecond = true): string {
	let d = new Date(str);
	if (isNull(str)) {
		let d = new Date();
	}
	let year = d.getFullYear();
	let month = (d.getMonth() + 1) < 10 ? '0' + (d.getMonth() + 1) : (d.getMonth() + 1);
	let day = d.getDate() < 10 ? '0' + d.getDate() : d.getDate();
	if (hasTime) {
		let hour = d.getHours() < 10 ? '0' + d.getHours() : d.getHours();
		let minute = d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes();
		let second = d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds();
		console.log(year, month, day, year + "" + month + "" + day + "" + hour + "" + minute + "" + (hasSecond === true ? second : ""))
		return year + "" + month + "" + day + "" + hour + "" + minute + "" + (hasSecond === true ? second : "");
	} else {
		return year + "" + month + "" + day;
	}
}
//表單校驗(yàn)
export async function validate(ref: any) {
  if (ref == null) {
    return true
  }
  let isValidate = true
  await ref.validate((valid, fields) => {
    if (valid) {
    } else {
      isValidate = false
      console.log('validate false!', fields)
    }
  })
  return isValidate
}
// 節(jié)流
export function throttle(this: any, fn: Function, interval = 500) {
	let last = 0;
	return (...args) => {
		let now = +new Date();
		// 還沒到時(shí)間
		if (now - last < interval) return;
		last = now;
		fn.apply(this, args);
	};
}
export function html2Escape(sHtml: string) {
	const dict = { '<': '&lt;', '>': '&gt;', '&': '&amp;', '"': '&quot;' };
	return sHtml.replace(/[<>&"]/g, (c: string) => {
		return dict[c];
	});
}
//防抖動(dòng)
let timestamp, timeout
export function debounce(func, wait, immediate) {
	let args, context, result
	const later = () => {
		// 距離上一次觸發(fā)的時(shí)間間隔
		const last = (timestamp === undefined ? 0 : +new Date() - timestamp)
		// 上次被包裝函數(shù)被調(diào)用時(shí)間間隔last小于設(shè)定時(shí)間間隔wait
		if (last < wait && last > 0) {
			//是否等待時(shí)間間隔達(dá)到后調(diào)用防抖 加上條件判斷防止時(shí)間間隔內(nèi)連續(xù)觸發(fā)多個(gè)定時(shí)任務(wù)
			if (timeout == null) timeout = setTimeout(later, wait - last)
		} else {
			timeout = null
			// 如果設(shè)定為immediate===true,因?yàn)殚_始邊界已經(jīng)調(diào)用過了此處無需調(diào)用
			if (!immediate) {
				timestamp = +new Date()
				result = func.apply(context, args)
				if (!timeout) context = args = null
			}
		}
	}
	return later()
}
/**
 * 對象數(shù)組深拷貝
 * @param {Array,Object} source 需要深拷貝的對象數(shù)組
 * @param {Array} noClone 不需要深拷貝的屬性集合
 */
export function deepClone(source: any, noClone: string[] = []): any {
	if (!source && typeof source !== 'object') {
		throw new Error('error arguments deepClone')
	}
	const targetObj: any = source.constructor === Array ? [] : {}
	Object.keys(source).forEach((keys: string) => {
		if (source[keys] && typeof source[keys] === 'object' && noClone.indexOf(keys) === -1) {
			targetObj[keys] = deepClone(source[keys], noClone)
		} else {
			targetObj[keys] = source[keys]
		}
	})
	return targetObj
}

2.這么用

import { clog, isNull } from '@/utils'
clog(jsonObj)

Vue3引入靜態(tài)配置文件最佳方案

1. 在public目錄下面添加一個(gè)配置文件config.js

2. 在html.index文件中引入此文件

3. 在vue文件中直接訪問就行

config.js

const config = {
  BaseApiUrl: 'http://localhost:44311/',
  Version: '2.0.20220506',
}

html.index

<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <title>Vue3Vite</title>
    <script type="text/javascript" src="tools.js"></script>
    <script type="text/javascript" src="config.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

使用舉例

import axios from 'axios'
// 創(chuàng)建axios對象,設(shè)置baseURL
const service = axios.create({
  baseURL: config.BaseApiUrl + '/', // 直接訪問config對象即可
  timeout: 30000,
})
export default service

Vue3全局方法方案二

1.先吧全局方法寫到tools.js文件中

tools.js

//動(dòng)態(tài)創(chuàng)建vue對象
const mountPrintData = function (printData, vhtmlDivId = 'print') {
  clog('mountPrintData')
  clog(printData)
  const App = {
    data() {
      return {
        data: printData,
      }
    },
  }
  const app = Vue.createApp(App)
  app.mount('#' + vhtmlDivId)
}
// 控制臺(tái)日志,支持傳一個(gè)參數(shù)(對象/字符串), 也支持傳兩個(gè)參數(shù)(標(biāo)志,日志消息<可以是對象,可以是字符串>)
const clog = function (flag, value = 'xxxxxxxxxxxxxxxxxxx=Default-value_override+xxxxxxxxxxxxxxxxx') {
  try {
    let tmp = ''
    // 如果value為默認(rèn)值,則沒有傳遞第二個(gè)參數(shù),只處理第一個(gè)參數(shù)
    if (value === `xxxxxxxxxxxxxxxxxxx=Default-value_override+xxxxxxxxxxxxxxxxx`) {
      tmp = JSON.stringify(flag)
      console.log(tmp)
    } else if (isNull(value)) {
      tmp = JSON.stringify(flag)
      console.log(tmp + ':')
    } else if (isNull(flag)) {
      tmp = JSON.stringify(value)
      console.log(':' + tmp)
    } else {
      tmp = JSON.stringify(value)
      console.log(flag + ':' + tmp)
    }
    return tmp
  } catch (err) {
    console.log('log', err)
    return ' 空對象或者空字符串 '
  }
}
// 判斷對象,數(shù)組,字符串是否為空,例如:  'undefined' , 'null' , '' , '   ' , {}  , [] 全部判斷為空
const isNull = function (obj) {
  if (typeof obj === 'object') {
    let json = JSON.stringify(obj)
    if (json === '{}') {
      return true
    }
    if (json === '[]') {
      return true
    }
    return false
  }
  let str = String(obj)
  if (str === 'undefined' || str === 'null' || str === '' || !str || !/[^\s]/.test(str)) {
    return true
  }
  return false
}

2.在Index.html中引入

按如下引入后tools.js中的方法就可以在任何位置直接使用了

<script type="text/javascript" src="tools.js"></script>

3.在ts,js代碼中直接使用

<template>
 ...
</template>
<script lang="ts">
export default {
  setup() {
    clog(`test`)  //直接使用
  }
}
</script>

Vue2中打印日志的最佳實(shí)踐

在vue的單頁面應(yīng)用中建議在public目錄添加如下的tools.js全局js靜態(tài)方法

在index.html中這樣引用:

<script type="text/javascript" src="tools.js"></script>

如此,在任何地方打印控制臺(tái)日志就可以這么寫: clog(xxx) xxx可以是字符串,也可以是對象。

PS: 打印json對象簡單的方法: console.log(JSON.stringify(jsonObj))

tools.js

//判斷對象,數(shù)組,字符串等是否為空
function isNull(obj){
	let str = String(obj)
	if (str === 'undefined' || str === 'null' || str === '' || !str || !/[^\s]/.test(str)) {
		return true
	}
	if (typeof obj === 'object') {
		let json = JSON.stringify(obj)
		if (json === '{}') {
			return true
		}
		if (json === '[]') {
			return true
		}
		return false
	} else {
		return false
	}
}
// 控制臺(tái)日志,支持傳一個(gè)參數(shù)(對象/字符串), 也支持傳兩個(gè)參數(shù)(標(biāo)志,日志消息<可以是對象,可以是字符串>)
function clog(flag, value= 'xxxxxxxxxxxxxxxxxxx=Default-value_override+xxxxxxxxxxxxxxxxx') {
	try {
		// 如果value為默認(rèn)值,則沒有傳遞第二個(gè)參數(shù),只處理第一個(gè)參數(shù)
		if (value === `xxxxxxxxxxxxxxxxxxx=Default-value_override+xxxxxxxxxxxxxxxxx`) {
			let tmp = JSON.stringify(flag);
			console.log(tmp)
		} else if (isNull(value)) {
			let tmp = JSON.stringify(flag);
			console.log(tmp + ":")
		} else if (isNull(flag)) {
			let tmp = JSON.stringify(value);
			console.log(":" + tmp)
		} else {
			let tmp = JSON.stringify(value);
			console.log(flag + ":" + tmp)
		}
	} catch (err) {
		console.log("log", err)
	}
}
//深拷貝對象
function copySelf(obj) {
  var newobj = obj.constructor === Array ? [] : {};
  if (typeof obj !== "object") {
    return;
  }
  for (var i in obj) {
    newobj[i] = typeof obj[i] === "object" ? copySelf(obj[i]) : obj[i];
  }
  return newobj;
}
//批量導(dǎo)入局部組件 (批量導(dǎo)入全局組件參見vue官網(wǎng))
//使用方法 components: importComponents(require.context('./', false, /Yi.*\.vue$/)),  // 導(dǎo)入當(dāng)前目錄以"Yi" 開頭,以".vue"結(jié)尾的全部組件
//require.context('./components', false, /Yi.*\.vue$/) : webpack的方法, 第一個(gè)參數(shù)為文件路徑, 第二個(gè)參數(shù)為是否包含子文件夾, 第三個(gè)參數(shù)為正則
function importComponents(comps) {
  let res_components = {}
  comps.keys().forEach((fileName) => {
    let comp = comps(fileName)
    res_components[fileName.replace(/^\.\/(.*)\.\w+$/, '$1')] = comp.default
  })
  return res_components
}
//獲取當(dāng)前時(shí)間, 出參為格式化后的日期字符串
function timeNow() {
  var time = new Date();  // 程序計(jì)時(shí)的月從0開始取值后+1  
  var m = time.getMonth() + 1;
  var t = time.getFullYear() + "-" + m + "-" + time.getDate() + " " + time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();
  return t;
}
//一天的開始, 入?yún)镈ate類型, 出參為格式化后的日期字符串
function timeDayBegin(time) {
  var m = time.getMonth() + 1;
  var t = time.getFullYear() + "-" + m + "-" + time.getDate() + " 00:00:00";
  return t;
}
//一天的結(jié)束, 入?yún)镈ate類型, 出參為格式化后的日期字符串
function timeDayEnd(time) {
  var m = time.getMonth() + 1;
  var t = time.getFullYear() + "-" + m + "-" + time.getDate() + " 23:59:59";
  return t;
}
//字符串?dāng)?shù)組轉(zhuǎn)整型數(shù)字鍵
function strArr2IntArr(arrStr) {
  for (var i = 0; i < arrStr.length; i++) {
    arrStr[i] = parseFloat(arrStr[i])
  }
  return arrStr;
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue中的過濾器實(shí)例代碼詳解

    vue中的過濾器實(shí)例代碼詳解

    這篇文章主要介紹了vue中的過濾器,本文通過文字實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • vue實(shí)現(xiàn)錄音功能js-audio-recorder帶波浪圖效果的示例

    vue實(shí)現(xiàn)錄音功能js-audio-recorder帶波浪圖效果的示例

    這篇文章主要介紹了vue實(shí)現(xiàn)錄音功能js-audio-recorder帶波浪圖效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • vue3.0如何在全局掛載對象和方法

    vue3.0如何在全局掛載對象和方法

    這篇文章主要介紹了vue3.0如何在全局掛載對象和方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue+quasar使用遞歸實(shí)現(xiàn)動(dòng)態(tài)多級菜單

    vue+quasar使用遞歸實(shí)現(xiàn)動(dòng)態(tài)多級菜單

    這篇文章主要為大家詳細(xì)介紹了vue+quasar使用遞歸實(shí)現(xiàn)動(dòng)態(tài)多級菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • vue調(diào)用swiper插件步驟教程(最易理解且詳細(xì))

    vue調(diào)用swiper插件步驟教程(最易理解且詳細(xì))

    有時(shí)候我們需要在vue中使用輪播組件,如果是在vue組件中引入第三方組件的話,最好通過npm安裝,從而進(jìn)行統(tǒng)一安裝包管理,下面這篇文章主要給大家介紹了關(guān)于vue調(diào)用swiper插件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • vue3 Composition API使用示例教程

    vue3 Composition API使用示例教程

    Vue3新增了Composition API,我們只需將實(shí)現(xiàn)某一功能的相關(guān)代碼全部放進(jìn)一個(gè)函數(shù)中,然后return需要對外暴露的對象,這篇文章主要介紹了vue3 Composition API使用,需要的朋友可以參考下
    2022-12-12
  • vue相關(guān)配置文件詳解及多環(huán)境配置詳細(xì)步驟

    vue相關(guān)配置文件詳解及多環(huán)境配置詳細(xì)步驟

    這篇文章主要介紹了vue相關(guān)配置文件詳解及多環(huán)境配置的教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Vue3封裝全局Dialog組件的實(shí)現(xiàn)方法

    Vue3封裝全局Dialog組件的實(shí)現(xiàn)方法

    3封裝全局Dialog組件相信大家都不陌生,下面這篇文章主要給大家介紹了關(guān)于Vue3封裝全局Dialog組件的實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • vue element 表頭添加斜線的實(shí)現(xiàn)代碼

    vue element 表頭添加斜線的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue element 表頭添加斜線的實(shí)現(xiàn)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Vuerouter的beforeEach與afterEach鉤子函數(shù)的區(qū)別

    Vuerouter的beforeEach與afterEach鉤子函數(shù)的區(qū)別

    本文詳細(xì)的介紹了Vuerouter的beforeEach與afterEach鉤子函數(shù)的區(qū)別和使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論

商南县| 尚义县| 大名县| 黄平县| 翼城县| 巨鹿县| 左权县| 兴化市| 新建县| 新化县| 芦溪县| 庄河市| 景泰县| 油尖旺区| 通道| 龙里县| 兴国县| 佛学| 合作市| 吉水县| 津南区| 平远县| 内黄县| 奎屯市| 泰州市| 江津市| 长春市| 陆丰市| 阿拉尔市| 旬邑县| 渑池县| 周至县| 文登市| 通海县| 天镇县| 龙岩市| 新丰县| 西乡县| 和林格尔县| 海伦市| 金乡县|