前端面試之Vue相關總結

Vue2中檢測數組變化的限制和解決方法

vue2用下標設置數組沒效果

  1. arr = [1,2] arr[0] = 0,頁面上顯示的arr并沒有修改(如果對應下標是原始值;若是引用值)
  2. 解決1:Vue.Set
  3. 解決2:arr.splice (Vue會劫持splice方法) Vue2對對象是循環defineProperty(遞歸、深度)set時通知dep.notify();對于數組則是重寫數組7個方法(push、pop、shift、unshift、splice、sort、reverse)時通知dep.notify();
    <div id="app">{{ arr[0].a }}{{ arr[1].a }}</div><script>var app = new Vue({el: '#app',data: {arr: [{ a: 2 }, { a: 600 }]},mounted() {setTimeout(() => {this.arr[1] = [{ a: 400 }] // 這樣看不到400this.arr[1].a  = 800  // 這樣能看到變成800}, 3000)}})</script>

vue2設置數組長度沒效果

  1. arr.length-- ,頁面上顯示的arr并沒有修改
  2. 解決1:Vue.Delete
  3. 解決2:arr.splice

Vue nextTick

Vue渲染是異步渲染,添加元素時不會馬上渲染,而是到下一個tick才渲染。 nextTick的回調會在dom異步渲染完畢后執行(vue是組件級的,若一有數據就更新性能肯定不好)。并且vue是批量做渲染的 在外部添加3個 在nextTick里獲取個數 只會打印一次
在這里插入圖片描述

nextTick的實現

  • 如果支持promise,將回調放在then方法里
  • 若不,若支持MutationObserver,就xxx也是異步執行的
  • 若不,若支持setImmediate
  • 再不,setTimeout

computed method watch區別

  • method用在視圖上,每次都去執行,開銷大,而computed是具備緩存的,若依賴的屬性無變化,不計算

Vue Plugin

  • 全局方法 Vue.xx訪問
  • 全局指令
  • mixin
  • 原型上綁定方法 Vue實例this訪問
  • 導出插件,在main.js里use
    在這里插入圖片描述

Vue組件data返回函數

  • Vue組件可能存在多個實例,如果使用對象形式定義data,會導致他們共用一個data對象,那么狀態變更將會影響所有組件實例;采用函數形式定義,在initData時會將其作為工廠函數返回全新的data對象,有效規避多實例之間狀態污染問題。而Vue根實例只能有一個,不會有次問題。
    在這里插入圖片描述

加key 高效更新dom

  1. key的作用主要是為了高效更新虛擬DOM,其原理是vue在patch(打補丁)過程中通過key可以精準判斷兩個節點是都是同一個,從而避免頻繁更新不同元素,是patch過程更高效,減少dom操作量,提高性能
  2. 若不設置key還可能在列表更新時引發一些隱蔽的bug
  3. vue中在使用相同標簽名元素的過渡切換時,也會使用到key屬性,目的是為了讓vue可以區分他們,否則vue只會替換其內部屬性而不會觸發過渡效果

在這里插入圖片描述

  • 不使用key,更新時不知道每個元素的位置,所以在A更新A,B更新B,C更新為F,以此類推,實際更新了3次,從F開始FCD + 創建插入E (源碼中,每次循環認為這5對是sameVnode,只能每次都去更新。而加了key能精準判斷是否是相同節點)
    在這里插入圖片描述
  • 使用key,只做了一次創建F并插入到C前面的操作(比較時,比較首位元素是否相同)

源碼
在這里插入圖片描述

  • 沒有設置key時,key的值是undefined,兩個未設置key的標簽值被判斷為相同

  • diff算法不是最優,增加key優化了diff,降低復雜度

  • 加key

index作為key

  • 在數據會增減時可能會產生問題,在頭部插入,在中間刪除(數量變化,index是在變的)
  • random作為key,隨機數還是有可能是一樣的

vue-router的原理

  • vue-router通過hash與History interface兩種方式實現前端路由,更新視圖但不重新請求頁面”是前端路由原理的核心
  • history模式則會將URL修改得就和正常請求后端的URL一樣,如后端沒有配置對應/user/id的路由處理,則會返回404錯誤
  • 它提供mode參數
  • hash帶# new HashHistory 是基于location.hash來實現的。Location.hash的值就是URL中#后面的內容。當hash改變時,頁面不會因此刷新,瀏覽器也不會請求服務器。
  • history更像url new HTML5History

update beforeUpdate

總結:

  • 不能籠統地說能修改或不能修改數據
  • 修改的數據未渲染到視圖不會觸發這2個鉤子
  • this.msg = this.msg + 1是有可能引起死循環的操作
  • beforeUpdate修改視圖數據不會再次觸發beforeUpdate 即使++也沒關系
  • updated修改視圖數據為常量,會再觸發一輪beforeUpdate → update;因此,若在此生命周期++會死循環

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

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

相關文章

JS和安卓 IOS的交互 例子式記錄

(function () { var u navigator.userAgent; var isAndroid u.indexOf(Android) > -1 || u.indexOf(Adr) > -1; //android終端 var isiOS !!u.match(/\(i[^;];( U;)? CPU.Mac OS X/); if(isAndroid){ (function(){ function android_i…

vue --- ref屬性獲取dom元素和子組件的方法

說明: // 假設login的組件定義如下: Vue.component(login, {template:<h1>登錄</h1>,data(){return {msg:son msg,}},methods(){show(){console.log(調用子組件的方法);}} }) // 在父元素中使用 <div id"app"><login ref"myLogin"&g…

【工程師綜合項目二】React + Koa2打造『JS++官網管理后臺』

Redis認知、安裝與操作 MongoDB&#xff1a;動態數據庫&#xff0c;如游戲中需要頻繁地保存人物的坐標 Oracle&#xff1a;收費&#xff0c;企業級 mac要安裝homebrew&#xff08;包管理工具&#xff09; window安裝Redis程序運行教程 命令行Redis操作 啟動&#xff1a; redis-…

webpack --- html-webpack-plugin

安裝 cnpm i html-webpack-plugin -D配置 (webpack.config.js) // webpack 是基于node構建的,webpack的配置文件中,任何合法的Node代碼都是支持的 var path require(path)// 在內存中生成src下的index.html,同時自動將打包好的bundle.js 導入到頁面中 var htmlWebpackPlugin…

nyoj164——卡特蘭數(待填坑)

題意&#xff1a;將1~2n個數按照順時針排列好&#xff0c;用一條線將兩個數字連接起來要求&#xff1a;線之間不能有交點&#xff0c;同一個點只允許被連一次。 最后問給出一個n&#xff0c;有多少種方式滿足條件。 卡特蘭數&#xff08;列&#xff09;&#xff1a; 令h(0)1,h(…

git 使用

1. 先進入項目文件夾&#xff0c;通過命令 git init 把這個目錄變成git可以管理的倉庫 git init 2. 把文件添加到版本庫中&#xff0c;使用命令 git add .添加到暫存區里面去&#xff0c;不要忘記后面的小數點“.”&#xff0c;意為添加文件夾下的所有文件 git add . 3. 用命令…

webpack --- 使用vue

// webpack中如何使用 vue: // 1. 安裝vue 的包: cnpm i vue -S // 2. 由于在 webpack 中,推薦使用 . vue 這個組件模板文件定義組件, 所以需要安裝能解析這種文件的loader cnpm i vue-loader vue-template-compiler -D // 3. 在main.js 中導入 vue的包, import Vue from vue…

ES6雜碎

1、let聲明的變量沒有變量提升&#xff1b; 2、const聲明的變量&#xff1a;塊級作用域內有效&#xff0c;存在暫時性死區&#xff0c;變量指向的那個內存地址不得改動&#xff1b; 3、...tail解構出來的是數組或空數組 let [head, ...tail] [1, 2, 3, 4]; head //1 tail //[2…

koa --- 自制簡易的koa-router

打算自己寫一個簡單的Router類,來實現koa-router這個中間件的(部分)神奇功能 確定需求 1.首先導入需要在app.js里面導入自己寫的Router類 2.然后是使用的方式和掛載router的方式 // 導入Router類 const Router require(./components/router.js);// 使用方式,(暫時只對get請…

MariaDB 腳本

研究MariaDB&#xff0c; 需要mock up一些假數據&#xff1a; 生成n個長度整型數的函數rand_num&#xff1a; CREATE DEFINERrootlocalhost FUNCTION rand_num(n INT) RETURNS int(5) begin DECLARE i INT DEFAULT 0; DECLARE result INT DEFAULT 0; WHILE i < n DOSET re…

Promise的基本使用

利用Promise是解決JS異步執行時候回調函數嵌套回調函數的問題&#xff0c; 更簡潔地控制函數執行流程&#xff1b; 通過new實例化Promise&#xff0c; 構造函數需要兩個參數&#xff0c; 第一個參數為函數執行成功以后執行的函數resolve&#xff0c; 第二個函數為函數執行失敗…

軟工作業PSP與單元測試訓練

一、實現模塊判斷傳入的身份證號碼的正確性&#xff1b; 二、針對所實現的模塊編寫對應的單元測試代碼&#xff1b; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.u…

koa --- nunjucks

安裝: npm install koa-nunjucks-2 --save目錄結構 |--- controller/ | |--- home.js |--- service/ | |--- home.js |--- views/ |--- app.js |--- router.jsapp.js // (部分) const nunjucks require(koa-nunjucks-2); app.use(nunjucks({ext: html,path: path.joi…

DNN模型訓練詞向量原理

轉自&#xff1a;https://blog.csdn.net/fendouaini/article/details/79821852 1 詞向量 在NLP里&#xff0c;最細的粒度是詞語&#xff0c;由詞語再組成句子&#xff0c;段落&#xff0c;文章。所以處理NLP問題時&#xff0c;怎么合理的表示詞語就成了NLP領域中最先需要解決的…

天平稱重【遞歸解法】

用天平稱重時&#xff0c;我們希望用盡可能少的砝碼組合稱出盡可能多的重量。如果只有5個砝碼&#xff0c;重量分別是1&#xff0c;3&#xff0c;9&#xff0c;27&#xff0c;81則它們可以組合稱出1到121之間任意整數重量&#xff08;砝碼允許放在左右兩個盤中&#xff09;。 本…

算法 --- reduce的使用.

描述: 難點: 將[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]輸出為[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 關鍵代碼描述: 1.假設我們已經根據輸入的數字得到了 rawArr [[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]] 2. 下一步將rawArr[0…

SpringBoot、mysql配置PageHelper插件

一&#xff1a;https://blog.csdn.net/h985161183/article/details/79800737 主要異常&#xff1a;org.springframework.beans.factory.BeanCreationException: Error creating bean with name com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration: pageHelper.…

字符串的拆分以及分隔符所在不同位置的刪除

try { //根據imComuserGroupMng獲取這個數據庫的所有ImComuserGroup數據 List<ImComuserGroup> list imComuserGroupMng.findAllComuserGroup(); //便利實體數據list為數據的集合 …

算法 --- 遞歸生成括號

問題描述 思路: 1.首先生成n個括號 2.左括號數量(記為l)不超過n 3.右括號數量(記為r)不超過n,且優先生成左括號(即 l < r) 4.需要設計一個遞歸式h(str,l,r) // 一開始,str , l 0, r 0 // 第一步進去,添加左括號, str(, l 1, r 0 // 然后因為 l < n . r < l 所以…

使用 TypeScript 改造構建工具及測試用例

最近的一段時間一直在搞TypeScript&#xff0c;一個巨硬出品、賦予JavaScript語言靜態類型和編譯的語言。 第一個完全使用TypeScript重構的純Node.js項目已經上線并穩定運行了。 第二個前后端的項目目前也在重構中&#xff0c;關于前端基于webpack的TypeScript套路之前也有提到…