【Vue】日常錯誤總結(持續更新)

日常遇到的小問題匯總, 內容小篇幅少的就全放這里了, 內容多的會在Vue專欄單獨分享~

目錄

【Q】 el-form-item值為 null 或 undefined顯示““

【Q】dialog內組件數據刷新總是延遲慢一拍

問題背景描述

解決方案

代碼簡單模擬

JS

【Q】el-input 不能輸入的解決辦法

方法1:標簽嵌套太深

方法2:使用了 template 作為 el-input 的父標簽

方法3:v-model

【Q】npm ERR A complete log of this run can be found in: npm ERR

【Q】el-tabs表格右下角按鈕被遮擋

【Q】this.$refs.xxx 報錯undefined解決辦法

【Q】this.$refs[‘form’].resetFields()

【Q】this.defParams = {...this.params}

【Q】Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value

【Q】數據還沒獲取就已渲染頁面

【Q】頁面跳轉后沒有重新請求接口

a、updated刷新組件內的方法更新數據

b、監聽路由去請求方法更新數據

【Q】調用子組件提示this.$refs["xxxRef"].xx()? underfined

a、首次渲染不調用

b、加載完數據再請求

【Q】Error in callback for watcher "$route": "TypeError: this.$refs.xxxRef is undefined"


【Q】 el-form-item值為 null 或 undefined顯示““

可以在 `el-form-item` 中使用表達式,使用 `v-if` 指令判斷當前表單項的值是否為 null 或 undefined,如果為 null 或 undefined,就顯示空字符串。

例如:

<template><el-form ref="form" :model="formData" :rules="formRules" label-position="left"><el-form-item label="姓名" :label-width="labelWidth"><el-input v-model="formData.name" clearable v-if="formData.name !== null && formData.name !== undefined"></el-input><span v-else>&nbsp;</span></el-form-item><el-form-item label="性別" :label-width="labelWidth"><el-select v-model="formData.gender" clearable v-if="formData.gender !== null && formData.gender !== undefined"><el-option label="男" value="male"></el-option><el-option label="女" value="female"></el-option></el-select><span v-else>&nbsp;</span></el-form-item><el-form-item label="年齡" :label-width="labelWidth"><el-input type="number" v-model.number="formData.age" clearable v-if="formData.age !== null && formData.age !== undefined"></el-input><span v-else>&nbsp;</span></el-form-item></el-form>
</template><script>
export default {data() {return {formData: {name: null,gender: null,age: null},formRules: {name: [{ required: true, message: '請輸入姓名', trigger: 'blur' }],gender: [{ required: true, message: '請選擇性別', trigger: 'change' }],age: [{ required: true, message: '請輸入年齡', trigger: 'blur' },{validator: (rule, value, callback) => {if (value < 0) {callback(new Error('年齡不能小于0歲'));} else {callback();}},trigger: 'blur'}]},labelWidth: '120px'};}
};
</script>

在上面的代碼中,我們在每個表單項中使用 `v-if` 判斷當前表單項的值是否為 null 或 undefined,如果為 null 或 undefined,則將當前表單項的值設置為空字符串。這樣就可以將值為 null 或 undefined 的表單項顯示為空。我們使用 `&nbsp;` 來占位,使表單外觀更美觀。

注意:如果在 `el-form-item` 的 `label` 屬性和 `v-if` 判斷條件中都使用了表達式,那么應該將所有表達式放在一對花括號中。例如:

<el-form-item :label="'年齡:' + labelSuffix" :label-width="labelWidth" v-if="formData.age !== null && formData.age !== undefined"><el-input type="number" v-model.number="formData.age" clearable></el-input>
</el-form-item>
<span v-else>&nbsp;</span>

在上面的代碼中,我們在 `el-form-item` 的 `label` 屬性和 `v-if` 判斷條件中都使用了表達式,因此應該將它們放在一對花括號中。

【Q】dialog內組件數據刷新總是延遲慢一拍

問題背景描述

用dialog做了一個一個新增功能,有個多層復選框,關聯一個文本域。
選中復選框時,文本域刷新,但是總是慢一拍。
:destroy-on-close="true", v-if, $nextTick,用個遍了,都不好使。
同樣的功能在編輯頁面就是正常的,區別僅僅是因為新增是dialog子頁面,
由此入手排查問題,發現竟然是...

解決方案

代碼簡單模擬

源碼不便展出,湊合看解決問題就好~

<el-dialog :destroy-on-close="true"  title="國服李白" :visible.sync="dialogEdit"><span>這是一段信息</span><flow-chart :dialogNodes="dialogNodes" :key="timer0"></flow-chart><span slot="footer" class="dialog-footer"><el-button @click="dialogVisible = false">取 消</el-button><el-button type="primary" @click="dialogVisible = false">確 定</el-button></span>
</el-dialog>

組件上添加 :key="timer1" data 中定義 timer0''
在獲取數據成功后 將 timer0 賦值為 this.timer1 = new Date().getTime()

JS
const res = await ApiUserManage.execDiagram(param)if (res.success){this.timer0 = new Date().getTime()this.dialogNodes = res.result.nodes

【Q】el-input 不能輸入的解決辦法

輸入框動態填充值,但是填充后不能編輯了,
就像是被禁止了一樣, 就很無語...查了下資料, v-model填寫了, 也沒有templete標簽嵌套最終方法一即可解決問題...

方法1:標簽嵌套太深

如果標簽嵌套太深,會導致無法獲取到 DOM,這是我們需要 $forceUpdate() 強制刷新,才可獲取<el-input type='text' v-model='value' @change='change()'></el-input>
data(){return {value:'',}
}
change(){this.$forceUpdate();  //強制刷新
}

方法2:使用了 template 作為 el-input 的父標簽

這種情況需要在 template 中添加 slot-scope 屬性,<template slot-scope="scope">

方法3:v-model

el-input 中沒有 v-model

【Q】npm ERR A complete log of this run can be found in: npm ERR

總是提示這個錯誤,以為是nodejs版本v16太高的問題,換成v12后,還是不行...

npm i后總是提示這個

nnpm ERR! Unexpected token '.'  npm ERR! A complete log of this run can be found in: npm ERR!     C:\Users\admin\AppData\Local\npm-cache\_logs\2022-08-29T15_07_28_136Z-debug-0.log

后來發現管理員打開VSCode就好了...

【Q】el-tabs表格右下角按鈕被遮擋

該列設置了?fixed="right",? 去掉?fixed="right"即可

常規方法:? 看下是否是下方組件margin設置過大

【Q】this.$refs.xxx 報錯undefined解決辦法

【Vue】this.$refs.xxx 報錯undefined解決辦法

【Q】this.$refs[‘form’].resetFields()

要想this.$refs[‘form’].resetFields()方法有效,必須配置el-form :model?屬性和el-form-item中的prop屬性才可以

this.$refs[‘form’].resetFields()這個做法其實是重置表單到初始值,不是清空表單,當表單第一次在頁面中渲染時所用的數據就是初始數據,

【Q】this.defParams = {...this.params}

this.params=this.defParam;初始化默認參數, vue2會把內存地址也復制過去,當params里面的值修改后, this.defParams也會相應改動,所以要先復制一份再賦值給this.params

this.defParams = {...this.params}, 

這樣它們之間的值才不會相互影響, 不過這在Vue3里面都已經解決了

【Q】Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value

改動了子組件中引用的父組件的變量,也就是props中的數據

中組件props中的數據只能單向流動,即只能從父組件通過組件的DOM屬性attribute傳遞props給子組件,子組件只能被動接收父組件傳遞過來的數據,并且在子組件中,不能修改由父組件傳來的props數據。

props:{cid:{type:String,},},methods: {//父組件刷新子組件數據1flush(cid){const params = {cid:cid};this.getData(params);},//父組件刷新子組件數據2, 這種情況就會出現上述問題flush(cid){this.cid= cid;const params = {cid:this.cid};this.getData(params);},

【Q】數據還沒獲取就已渲染頁面

簡單舉例...
v-if="loading"
...data(){return{loading:false,}
}created(){ this.init();
}, methods: {init() {this.getList();},getList() {queryListData(this.params).then((res) => {if(res.code==='200'){...this.loading = true;}}).finally(() => {...});},
}

【Q】頁面跳轉后沒有重新請求接口

aupdated刷新組件內的方法更新數據

簡單舉例...
ref="demoRef"
...created() {}, 
mounted() {},
updated() {this.init();
},methods: {init() {this.$refs["demoRef"].flush();}},
}

b監聽路由去請求方法更新數據

簡單舉例...
ref="demoRef"
...created() {}, 
mounted() {},
updated() {},watch: {$route(a, b) {if (a.path != b.path) {this.init();}},//-----或-----$route(-) {this.init();},
},methods: {init() {this.detail();...}},
}

【Q】調用子組件提示this.$refs["xxxRef"].xx()? underfined

a首次渲染不調用

b加載完數據再請求

簡單舉例...
ref="demoRef"
...data() {return {loadingData:false,},
}
created() {this.init();
}, 
mounted() {},
updated() {if(loadingData){this.$refs["demoRef"].flush();}
},methods: {init() {queryListData(this.params).then((res) => {...this.loadingData= true;});}},
}

【Q】Error in callback for watcher "$route": "TypeError: this.$refs.xxxRef is undefined"

父頁面監控路由變動時刷新子組件提示, 這里是同一個頁面路由參數改變,

Error in callback for watcher "$route": "TypeError: this.$refs.tableOneRef is undefined"

困擾許久, this.nextTick(){}等等都不好使, 原因是在Vue中,當路由發生變化時,組件的實例會被銷毀然后重新創建。因此,在路由切換后,組件的this上下文會發生改變。

當你監聽路由變化時,如果在回調函數中使用了this關鍵字,它將指向新創建的組件實例,而不是之前的組件實例。這意味著你無法直接訪問之前組件實例中的數據和方法。

為了解決這個問題,你可以在監聽路由變化時,將需要保留的數據和方法保存到其他變量中,或者使用Vue提供的beforeRouteUpdate導航守衛來處理組件的更新邏輯。

beforeRouteUpdate(to, from, next) {// 保存需要保留的數據和方法const preservedData = this.data;const preservedMethod = this.method;// 執行路由變化前的邏輯// ...// 調用next()繼續路由更新next();// 在路由更新后恢復數據和方法this.data = preservedData;this.method = preservedMethod;
}

依然不好使哈

這里說下最后的解決思路:

定義一個狀態isReloadChild:true

監控路由變化時, 先false,? 然后更改狀態為true, 需要控制的組件v-if控制

簡化代碼如下

      this.isReloadChild = false;setTimeout(() => {this.isReloadChild = true;}, 0);

有用請點贊,養成良好習慣!

疑問、交流、鼓勵請留言!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209969.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Educational Codeforces Round 156 (Rated for Div. 2)補題

Sum of Three 題目大意&#xff1a;將一個正整數n分成3個不同的正整數x,y,z,保證三個數都不能整除3&#xff0c;如果無法實現就輸出NO. 思路&#xff1a;這個題實際上特別簡單&#xff0c;我們可以發現當n比較大的時候&#xff0c;我們可以從中取1&#xff0c;然后第二個數也…

【Java】Java環境以及EditPlus編輯器安裝與配置流程

要安裝和配置Java環境以及EditPlus編輯器&#xff0c;請按照以下步驟操作&#xff1a; ### 安裝Java Development Kit (JDK) 1. 訪問Java官方網站下載最新版本的JDK。 2. 運行下載的JDK安裝程序&#xff0c;并按照提示完成安裝。 3. 安裝完成后&#xff0c;記下JDK的安裝路徑&a…

perf與火焰圖-性能分析工具

參考鏈接 perf性能分析工具使用分享 如何讀懂火焰圖&#xff1f;-阮一峰 perf基本用法-record,report-知乎 火焰圖抓取 準備&#xff1a; centos安裝perf工具 dnf install perf下載火焰圖解析代碼 git clone https://github.com/brendangregg/FlameGraph.git抓取指定進程…

Orcal數據庫Schema理解、表分區理解

目錄 1 Schema1.1 Orcal數據庫示例1.2 MySQL數據庫示例 2 Orcal表分區2.1 創建表分區2.2 查看表分區2.3 查看指定分區數據 此前未了解過Schema的概念&#xff0c;僅知道Orcal數據庫比較側重這個概念&#xff0c;搜遍全網都&#xff0c;都是啰哩吧嗦的搬抄定義&#xff0c;特此在…

LeetCode算法題解(單調棧)|LeetCode503. 下一個更大元素 II、LeetCode42. 接雨水

一、LeetCode503. 下一個更大元素 II 題目鏈接&#xff1a;503. 下一個更大元素 II 題目描述&#xff1a; 給定一個循環數組 nums &#xff08; nums[nums.length - 1] 的下一個元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每個元素的 下一個更大元素 。 數字 x 的…

LIMoE:使用MoE學習多個模態

文章鏈接&#xff1a;Multimodal Contrastive Learning with LIMoE: the Language-Image Mixture of Experts 發表期刊&#xff08;會議&#xff09;: NeurIPS 2022 目錄 1.背景介紹稀疏模型 2.內容摘要Sparse Mixture-of-Experts ModelsContrastive LearningExperiment Analy…

Kubernetes入門筆記 ——(3)理解pod對象

為什么需要pod 最為熟知的一句話&#xff1a;pod是k8s的最小調度單位。剛開始聽到這句話時會想&#xff0c;已經有容器了&#xff0c;k8s為什么還要搞個pod出來&#xff1f;容器和pod是什么關系&#xff1f;容器的本質是進程&#xff0c;而k8s本質上類似操作系統。 熟悉Linux的…

SpringBoot系列之啟動成功后執行業務的方法歸納

SpringBoot系列之啟動成功后執行業務邏輯。在Springboot項目中經常會遇到需要在項目啟動成功后&#xff0c;加一些業務邏輯的&#xff0c;比如緩存的預處理&#xff0c;配置參數的加載等等場景&#xff0c;下面給出一些常有的方法 實驗環境 JDK 1.8SpringBoot 2.2.1Maven 3.2…

python dataframe 列中 字符串( ‘2815512706605‘)過大 轉不了float 用Decimal

from decimal import Decimaldf["accFillSz"] df["accFillSz"].apply(lambda x: Decimal(x)) 2815512706605這個值超出了Python中float類型的最大表示范圍,無法直接轉換為浮點數。 Python中float類型使用IEEE 754標準的64位雙精度浮點數表示,最大值大約為…

歐拉回路歐拉路【詳解】

1.引入 2.概念 3.解決方法 4.例題 5.回顧 1.引入 經典的七橋問題 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含兩個島嶼及連接它們的七座橋&#xff0c;如下圖所示。 可否走過這樣的七座橋&#xff0c;而且每橋只走過一次&#xff1f; 你怎樣證明&#xff1f;…

【Linux top命令】

文章目錄 深入了解Linux top命令&#xff1a;實時監控系統性能1. 什么是top命令&#xff1f;2. 使用top命令3. top命令交互操作 深入了解Linux top命令&#xff1a;實時監控系統性能 1. 什么是top命令&#xff1f; top命令是一個用于實時監控系統性能的文本界面工具。它顯示當…

Linux上使用獨立顯卡Tesla T4(測試視頻壓縮)

背景 將視頻處理程序單獨部署至K8S之外&#xff0c;使用獨立GPU顯卡的一臺服務器上。 需事先對GPU性能做簡單測試。 已通過zabbix對Linux進行了系統資源監控。 已通過PrometheusGrafana對顯卡Tesla T4做了性能監控。 逐步補充&#xff0c;稍等 2023年12月6日 操作 查看當前…

鴻蒙Harmony開發初探

一、背景 9月25日華為秋季全場景新品發布會&#xff0c;余承東宣布鴻蒙HarmonyOS NEXT蓄勢待發&#xff0c;不再支持安卓應用。網易有道、同程旅行、美團、國航、阿里等公司先后宣布啟動鴻蒙原生應用開發工作。 二、鴻蒙Next介紹 HarmonyOS是一款面向萬物互聯&#xff0c;全…

[Linux] 基于LAMP架構安裝論壇

一、安裝Discuz論壇 1.1 創建數據庫&#xff0c;并進行授權 mysql -u root -p123CREATE DATABASE bbs; #創建一個數據庫GRANT all ON bbs.* TO bbsuser% IDENTIFIED BY admin123; #把bbs數據庫里面所有表的權限授予給bbsuser,并設置密碼admin123flush privileges; #刷新數據庫…

Java 中的抽象類與接口:深入理解與應用

文章目錄 什么是抽象類&#xff1f;什么是接口&#xff1f;抽象類和接口的使用場景抽象類和接口的區別結論 在 Java 編程語言中&#xff0c;抽象類和接口是兩種重要的機制&#xff0c;用于實現抽象化和多態性。這兩種機制都允許我們定義一種通用的類型&#xff0c;然后通過繼承…

數據結構——棧與棧排序

棧的特性 棧是一種遵循后進先出&#xff08;LIFO&#xff09;原則的數據結構。其基本操作包括&#xff1a; push&#xff1a;將元素添加到棧頂。pop&#xff1a;移除棧頂元素。peek&#xff1a;查看棧頂元素&#xff0c;但不移除。 棧排序的原理 棧排序的核心是使用兩個棧&…

[滲透測試學習] Devvortex - HackTheBox

文章目錄 信息搜集解題步驟提交flag 信息搜集 掃描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.242發現80端口有http服務&#xff0c;并且是nginx服務 嘗試訪問web界面&#xff0c;發現跳轉到http://devvortex.htb/無法訪問 我們用vim添加該域名即可 sudo vim /etc/…

J.408之數據結構

J-408之數據結構_北京信息科技大學第十五屆程序設計競賽&#xff08;同步賽&#xff09; (nowcoder.com) 思維好題&#xff0c;直接用兩個set存沒出現的數字就好了 // Problem: 408之數據結構 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/68572/J // Me…

ClickHouse安裝和部署

ClickHouse安裝過程&#xff1a; ClickHouse支持運行在主流64位CPU架構&#xff08;X86、AArch和PowerPC&#xff09;的Linux操作 系統之上&#xff0c;可以通過源碼編譯、預編譯壓縮包、Docker鏡像和RPM等多種方法進行安裝。由于篇幅有限&#xff0c;本節著重講解離線RPM的安…

RAW和YUV的區別

RAW是指未經過任何壓縮或處理的原始圖像數據。在攝像頭中&#xff0c;原始圖像數據可以是來自圖像傳感器的未經處理的像素值。這些原始數據通常以一種Bayer模式的形式存在&#xff0c;其中每個像素僅包含一種顏色信息&#xff08;紅色、綠色或藍色&#xff09;&#xff0c;需要…