Ⅰ 家譜樹前端特效怎麼實現
首先確定點到點的向量范圍
然後做枝葉的隨機,將最終節點設置為LEAF
我只給出結構,剩下的LZ自己來吧
function Node(){
this.nodeCount=0;子節點數量
this.isLeaf=false;
this.LChild=[];左枝葉
this.RChild=[];右枝葉
}
結構請按照二叉樹的生成來
Ⅱ 自學web前端開發,請問從何入手呢
學習前端,要從學習HTML和CSS開始著手。關於這部分的學習,網上可選擇的資料就太多了,這里不一一列舉,題主網路搜索欄搜索HTML 教程,或者css 教程,就可找到相關資料。
接著是學習前端的一個難點、也是重點,就是JavaScript。
首先,初學一門語言,要秉承一個原則:「能動手的,盡量別吵吵」
另外,你需要一個能夠從簡到難的知識體系,一步一步跟下來。
下面是干貨。
體系:上圖。
(四)、工作流(跟JS原生關系不大,不詳細展開了)
webpack
gulp
上面的內容結束後,就可以進入前端框架的海洋中暢遊了。
Ⅲ antv G6 分層樹怎麼將圖片插入作為樹節點
你看下這個代碼能不能套用 不是完全復制哈
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ComponentModel;
usingKingdee.BOS;
usingKingdee.BOS.Util;
usingKingdee.BOS.Core;
usingKingdee.BOS.Core.DynamicForm;
usingKingdee.BOS.Core.DynamicForm.PlugIn;
usingKingdee.BOS.Core.DynamicForm.PlugIn.Args;
usingKingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
usingKingdee.BOS.Core.Metadata;
namespaceJDSample.FormPlugIn.DynamicForm
{
///<summary>
///分批分層載入樹節點
///</summary>
///<remarks>
///案例背景:
///界面上使用樹控制項,需顯示大量的節點;
///如果一次性載入到客戶端,顯示渲染會非常慢;
///因此,需要分層、分批下載
///
///案例說明:
///新增一個動態表單,掛上本插件,並在界面有一個樹控制項F_JD_TreeView;
///界面初始化時,僅載入第一層節點;
///用戶點擊節點時,才載入其包含的子節點,而且每次最多載入10個;
///單層超過10個節點,通過"點擊載入更多..."節點,分批下載
///</remarks>
[Description("分批分層載入樹節點")]
publicclassS160107TreeEdit:AbstractDynamicFormPlugIn
{
///<summary>
///本地變數,存儲需載入到前端的所有節點信息,以及其是否已經載入標志
///</summary>
privateDictionary<string,NodeInfo>_dctNodes=newDictionary<string,NodeInfo>();
///<summary>
///本地變數,存儲已經被載入過的父節點Id,避免重復搜索其子節點,浪費時間
///</summary>
privateHashSet<string>_loadedNodeIds=newHashSet<string>();
///<summary>
///界面初始化結束,觸發此事件,通知插件開始載入樹節點:在此事件,載入第一層節點
///</summary>
///<paramname="e"></param>
publicoverrideList<TreeNode>GetTreeViewData(TreeNodeArgse)
{
if(e.Key.EqualsIgnoreCase("F_JD_TreeView")==false)
{
//需載入是其他樹控制項的節點,略過
returnnewList<TreeNode>();
}
//載入全部節點信息到內存
this.LoadNodes();
//記錄已經載入過根節點
this._loadedNodeIds.Add("0");
//展開樹控制項節點
TreeViewtv=this.View.GetControl<TreeView>("F_JD_TreeView");
tv.SetExpanded(true);
//構造根目錄下的第一層節點並返回
List<TreeNode>nodes=this.BuildTreeNodes("0");
returnnodes;
}
///<summary>
///用戶點擊節點時觸發此事件:載入更多子節點
///</summary>
///<paramname="e"></param>
(TreeNodeArgse)
{
if(e.Key.EqualsIgnoreCase("F_JD_TreeView")==false)
{
//點擊的是其他樹控制項,略過
return;
}
//判斷是否已經載入過此節點的子節點,如果載入過,則不再載入
if(this._loadedNodeIds.Contains(e.NodeId))
{
return;
}
this._loadedNodeIds.Add(e.NodeId);
TreeViewtv=this.View.GetControl<TreeView>("F_JD_TreeView");
stringparentId=e.NodeId;
if(parentId.StartsWith("more"))
{//當前點擊的節點,是"點擊載入更多..."
string[]keys=parentId.Split('|');
parentId=keys[1];//第2部分為父節點部分
//"點擊載入更多..."節點已經被點擊過,不再需要了,移除之
tv.RemoveNode(e.NodeId);
}
//開始載入更多的子節點
List<TreeNode>childNodes=this.BuildTreeNodes(parentId);
if(childNodes.Count>0)
{
tv.AddNodes(parentId,childNodes);
}
}
///<summary>
///構建樹控制項所需要的節點對象
///</summary>
///<paramname="parentId">父節點Id,為0表示第一層節點</param>
///<returns></returns>
privateList<TreeNode>BuildTreeNodes(stringparentId)
{
List<TreeNode>nodes=newList<TreeNode>();
//遍歷全部節點,找指定節點中,未載入的子節點的子節點
intcount=0;
intindex=0;
foreach(varitemin_dctNodes)
{
NodeInfonodeInfo=item.Value;
if(nodeInfo.Loaded==false
&&nodeInfo.ParentId==parentId)
{
nodeInfo.Loaded=true;
count++;
TreeNodenode=newTreeNode()
{
id=nodeInfo.Id,
text=nodeInfo.Caption,
parentid=nodeInfo.ParentId,
};
nodes.Add(node);
}
if(count>=10)
{//本次載入超過了10個
//生成一個特殊的節點(載入更多...),並停止本批載入更多子節點
TreeNodenode=newTreeNode()
{
//需要基於如下需求,生成一個特殊的節點Id
//1.需要與其他普通節點進行區分:以more為前綴
//2.需要能夠提取出父節點Id:包含父節點Id
//3.每次產生的特殊節點Id不能重復:需包含當前節點索引
id=string.Format("more|{0}|{1}",parentId,index),
text="點擊載入更多...",
parentid=parentId,
};
nodes.Add(node);
break;
}
index++;
}
returnnodes;
}
///<summary>
///到資料庫載入全部節點信息:本示例直接手工構建一批有層次的節點信息
///</summary>
privatevoidLoadNodes()
{
//節點名稱,包含其子節點的數量,以提示用戶,可以展開查看子節點
//第一層節點
_dctNodes.Add("1",newNodeInfo(){Id="1",ParentId="0",Caption="江西(100)"});
_dctNodes.Add("2",newNodeInfo(){Id="2",ParentId="0",Caption="廣東(3)"});
//循環添加100個第一層節點
for(inti=3;i<=100;i++)
{
_dctNodes.Add(i.ToString(),newNodeInfo()
{Id=i.ToString(),ParentId="0",Caption=string.Format("省份{0}(0)",i)});
}
//第二層節點:
_dctNodes.Add("1.1",newNodeInfo(){Id="1.1",ParentId="1",Caption="南昌(0)"});
_dctNodes.Add("1.2",newNodeInfo(){Id="1.2",ParentId="1",Caption="九江(0)"});
_dctNodes.Add("1.3",newNodeInfo(){Id="1.3",ParentId="1",Caption="贛州(0)"});
//循環添加100個第二層節點
for(inti=4;i<=100;i++)
{
_dctNodes.Add(string.Format("1.{0}",i),
newNodeInfo()
{
Id=string.Format("1.{0}",i),
ParentId="1",
Caption=string.Format("城市{0}(0)",i)
});
}
_dctNodes.Add("0201",newNodeInfo(){Id="0201",ParentId="02",Caption="廣州(0)"});
_dctNodes.Add("0202",newNodeInfo(){Id="0202",ParentId="02",Caption="深圳(2)"});
_dctNodes.Add("0203",newNodeInfo(){Id="0203",ParentId="02",Caption="惠州(0)"});
//第三層節點:
_dctNodes.Add("020201",newNodeInfo(){Id="020201",ParentId="0202",Caption="南山區"});
_dctNodes.Add("020202",newNodeInfo(){Id="020202",ParentId="0202",Caption="寶安區"});
}
}
///<summary>
///節點信息對象
///</summary>
classNodeInfo
{
///<summary>
///本節點Id
///</summary>
publicstringId{get;set;}
///<summary>
///父節點Id
///</summary>
publicstringParentId{get;set;}
///<summary>
///本節點標題
///</summary>
publicstringCaption{get;set;}
///<summary>
///是否已經載入標志:默認為false,未載入到前端
///</summary>
publicboolLoaded{get;set;}
}
}
Ⅳ 組件分享之前端組件——bootstrap-treeview 簡單的tree樹組件
近期正在探索前端、後端、系統端各類常用組件與工具,對其一些常見的組件進行再次整理一下,形成標准化組件專題,後續該專題將包含各類語言中的一些常用組件。歡迎大家進行持續關注。
本次分享的組件是用於前端開發使用的tree樹組件。
下面是其開源庫中的描述內容:
需要的支持文件:
使用說明:
1、在頁面中引用對應css和js文件
2、創建一個容器,作為生成的樹存儲位置
3、進行啟動載入,具體data格式可以參考上面的開源庫地址中的README。
雖然前端現在已經被vue、react等占據,但仍然有一些小夥伴們仍在使用一體化開發,jsp開發等,這類前端組件文章主要就用於這類場景下的快速使用,有需要的可以持續關注。
Ⅳ 整理涵蓋很全很廣的前端知識點
HTML、CSS相關
html5新特性、語義化
瀏覽器渲染機制、重繪、重排
網頁生成過程:
重排(也稱迴流): 當 DOM 的變化影響了元素的幾何信息( DOM 對象的位置和尺寸大小),瀏覽器需要重新計算元素的幾何屬性,將其安放在界面中的正確位置,這個過程叫做重排。 觸發:
重繪: 當一個元素的外觀發生改變,但沒有改變布局,重新把元素外觀繪制出來的過程,叫做重繪。 觸發:
重排優化建議:
transform 不重繪,不迴流 是因為 transform 屬於合成屬性,對合成屬性進行 transition/animate 動畫時,將會創建一個合成層。這使得動畫元素在一個獨立的層中進行渲染。當元素的內容沒有發生改變,就沒有必要進行重繪。瀏覽器會通過重新復合來創建動畫幀。
css盒子模型
所有 HTML 元素可以看作盒子,在CSS中, "box model" 這一術語是用來設計和布局時使用。 CSS 盒模型本質上是一個盒子,封裝周圍的 HTML 元素,它包括:邊距,邊框,填充,和實際內容。 盒模型允許我們在其它元素和周圍元素邊框之間的空間放置元素。
css樣式優先順序
!important>style>id>class
什麼是BFC?BFC的布局規則是什麼?如何創建BFC?BFC應用?
BFC 是 Block Formatting Context 的縮寫,即塊格式化上下文。 BFC 是CSS布局的一個概念,是一個環境,裡面的元素不會影響外面的元素。 布局規則:Box是CSS布局的對象和基本單位,頁面是由若干個Box組成的。元素的類型和display屬性,決定了這個Box的類型。不同類型的Box會參與不同的 Formatting Context 。 創建:浮動元素 display:inline-block position:absolute 應用: 1.分屬於不同的 BFC 時,可以防止 margin 重疊 2.清除內部浮動 3.自適應多欄布局
DOM、BOM對象
BOM(Browser Object Model) 是指瀏覽器對象模型,可以對瀏覽器窗口進行訪問和操作。使用 BOM,開發者可以移動窗口、改變狀態欄中的文本以及執行其他與頁面內容不直接相關的動作。 使 JavaScript 有能力與瀏覽器"對話"。 DOM (Document Object Model) 是指文檔對象模型,通過它,可以訪問 HTML 文檔的所有元素。 DOM 是 W3C (萬維網聯盟)的標准。 DOM 定義了訪問 HTML 和 XML 文檔的標准: "W3C 文檔對象模型(DOM)是中立於平台和語言的介面,它允許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。" W3C DOM 標准被分為 3 個不同的部分:
什麼是 XML DOM ? XML DOM 定義了所有 XML 元素的對象和屬性,以及訪問它們的方法。 什麼是 HTML DOM? HTML DOM 定義了所有 HTML 元素的對象和屬性,以及訪問它們的方法。
JS相關
js數據類型、typeof、instanceof、類型轉換
閉包(高頻)
閉包是指有權訪問另一個函數作用域中的變數的函數 ——《JavaScript高級程序設計》
當函數可以記住並訪問所在的詞法作用域時,就產生了閉包,
即使函數是在當前詞法作用域之外執行 ——《你不知道的JavaScript》
原型、原型鏈(高頻)
原型: 對象中固有的 __proto__ 屬性,該屬性指向對象的 prototype 原型屬性。
原型鏈: 當我們訪問一個對象的屬性時,如果這個對象內部不存在這個屬性,那麼它就會去它的原型對象里找這個屬性,這個原型對象又會有自己的原型,於是就這樣一直找下去,也就是原型鏈的概念。原型鏈的盡頭一般來說都是 Object.prototype 所以這就是我們新建的對象為什麼能夠使用 toString() 等方法的原因。
特點: JavaScript 對象是通過引用來傳遞的,我們創建的每個新對象實體中並沒有一份屬於自己的原型副本。當我們修改原型時,與之相關的對象也會繼承這一改變。
this指向、new關鍵字
this 對象是是執行上下文中的一個屬性,它指向最後一次調用這個方法的對象,在全局函數中, this 等於 window ,而當函數被作為某個對象調用時,this等於那個對象。 在實際開發中, this 的指向可以通過四種調用模式來判斷。
new
作用域、作用域鏈、變數提升
繼承(含es6)、多種繼承方式
(1)第一種是以 原型鏈的方式來實現繼承 ,但是這種實現方式存在的缺點是,在包含有引用類型的數據時,會被所有的實例對象所共享,容易造成修改的混亂。還有就是在創建子類型的時候不能向超類型傳遞參數。
(2)第二種方式是使用 借用構造函數 的方式,這種方式是通過在子類型的函數中調用超類型的構造函數來實現的,這一種方法解決了不能向超類型傳遞參數的缺點,但是它存在的一個問題就是無法實現函數方法的復用,並且超類型原型定義的方法子類型也沒有辦法訪問到。
(3)第三種方式是 組合繼承 ,組合繼承是將原型鏈和借用構造函數組合起來使用的一種方式。通過借用構造函數的方式來實現類型的屬性的繼承,通過將子類型的原型設置為超類型的實例來實現方法的繼承。這種方式解決了上面的兩種模式單獨使用時的問題,但是由於我們是以超類型的實例來作為子類型的原型,所以調用了兩次超類的構造函數,造成了子類型的原型中多了很多不必要的屬性。
(4)第四種方式是 原型式繼承 ,原型式繼承的主要思路就是基於已有的對象來創建新的對象,實現的原理是,向函數中傳入一個對象,然後返回一個以這個對象為原型的對象。這種繼承的思路主要不是為了實現創造一種新的類型,只是對某個對象實現一種簡單繼承,ES5 中定義的 Object.create() 方法就是原型式繼承的實現。缺點與原型鏈方式相同。
(5)第五種方式是 寄生式繼承 ,寄生式繼承的思路是創建一個用於封裝繼承過程的函數,通過傳入一個對象,然後復制一個對象的副本,然後對象進行擴展,最後返回這個對象。這個擴展的過程就可以理解是一種繼承。這種繼承的優點就是對一個簡單對象實現繼承,如果這個對象不是我們的自定義類型時。缺點是沒有辦法實現函數的復用。
(6)第六種方式是 寄生式組合繼承 ,組合繼承的缺點就是使用超類型的實例做為子類型的原型,導致添加了不必要的原型屬性。寄生式組合繼承的方式是使用超類型的原型的副本來作為子類型的原型,這樣就避免了創建不必要的屬性。
EventLoop
JS 是單線程的,為了防止一個函數執行時間過長阻塞後面的代碼,所以會先將同步代碼壓入執行棧中,依次執行,將非同步代碼推入非同步隊列,非同步隊列又分為宏任務隊列和微任務隊列,因為宏任務隊列的執行時間較長,所以微任務隊列要優先於宏任務隊列。微任務隊列的代表就是, Promise.then , MutationObserver ,宏任務的話就是 setImmediate setTimeout setInterval
原生ajax
ajax 是一種非同步通信的方法,從服務端獲取數據,達到局部刷新頁面的效果。 過程:
事件冒泡、捕獲(委託)
event.stopPropagation() 或者 ie下的方法 event.cancelBubble = true; //阻止事件冒泡
ES6
Vue
簡述MVVM
MVVM 是 Model-View-ViewModel 縮寫,也就是把 MVC 中的 Controller 演變成 ViewModel。Model 層代表數據模型, View 代表UI組件, ViewModel 是 View 和 Model 層的橋梁,數據會綁定到 viewModel 層並自動將數據渲染到頁面中,視圖變化的時候會通知 viewModel 層更新數據。
談談對vue生命周期的理解?
每個 Vue 實例在創建時都會經過一系列的初始化過程, vue 的生命周期鉤子,就是說在達到某一階段或條件時去觸發的函數,目的就是為了完成一些動作或者事件
computed與watch
watch 屬性監聽 是一個對象,鍵是需要觀察的屬性,值是對應回調函數,主要用來監聽某些特定數據的變化,從而進行某些具體的業務邏輯操作,監聽屬性的變化,需要在數據變化時執行非同步或開銷較大的操作時使用
computed 計算屬性 屬性的結果會被緩存,當 computed 中的函數所依賴的屬性沒有發生改變的時候,那麼調用當前函數的時候結果會從緩存中讀取。除非依賴的響應式屬性變化時才會重新計算,主要當做屬性來使用 computed 中的函數必須用 return 返回最終的結果 computed 更高效,優先使用
使用場景 computed :當一個屬性受多個屬性影響的時候使用,例:購物車商品結算功能 watch :當一條數據影響多條數據的時候使用,例:搜索數據
v-for中key的作用
vue組件的通信方式
父子組件通信
父->子 props ,子->父 $on、$emit` 獲取父子組件實例 parent、 parent 、children Ref 獲取實例的方式調用組件的屬性或者方法 Provide、inject` 官方不推薦使用,但是寫組件庫時很常用
兄弟組件通信
Event Bus 實現跨組件通信 Vue.prototype.$bus = new Vue() Vuex
跨級組件通信
$attrs、$listeners Provide、inject
常用指令
雙向綁定實現原理
當一個 Vue 實例創建時,Vue會遍歷data選項的屬性,用 Object.defineProperty 將它們轉為 getter/setter並且在內部追蹤相關依賴,在屬性被訪問和修改時通知變化。每個組件實例都有相應的 watcher 程序實例,它會在組件渲染的過程中把屬性記錄為依賴,之後當依賴項的 setter 被調用時,會通知 watcher重新計算,從而致使它關聯的組件得以更新。
v-model的實現以及它的實現原理嗎?
nextTick的實現
vnode的理解,compiler和patch的過程
new Vue後整個的流程
思考:為什麼先注入再提供呢??
答:1、首先來自祖輩的數據要和當前實例的data,等判重,相結合,所以注入數據的initInjections一定要在 InitState 的上面。2. 從上面注入進來的東西在當前組件中轉了一下又提供給後代了,所以注入數據也一定要在上面。
vm.[Math Processing Error]mount(vm.mount(vm.options.el) :掛載實例。
keep-alive的實現
作用:實現組件緩存
鉤子函數:
原理: Vue.js 內部將 DOM 節點抽象成了一個個的 VNode 節點, keep-alive 組件的緩存也是基於 VNode 節點的而不是直接存儲 DOM 結構。它將滿足條件 (pruneCache與pruneCache) 的組件在 cache 對象中緩存起來,在需要重新渲染的時候再將 vnode 節點從 cache 對象中取出並渲染。
配置屬性:
include 字元串或正則表達式。只有名稱匹配的組件會被緩存
exclude 字元串或正則表達式。任何名稱匹配的組件都不會被緩存
max 數字、最多可以緩存多少組件實例
vuex、vue-router實現原理
vuex 是一個專門為vue.js應用程序開發的狀態管理庫。 核心概念:
你怎麼理解Vue中的diff演算法?
在js中,渲染真實 DOM 的開銷是非常大的, 比如我們修改了某個數據,如果直接渲染到真實 DOM , 會引起整個 dom 樹的重繪和重排。那麼有沒有可能實現只更新我們修改的那一小塊dom而不要更新整個 dom 呢?此時我們就需要先根據真實 dom 生成虛擬 dom , 當虛擬 dom 某個節點的數據改變後會生成有一個新的 Vnode , 然後新的 Vnode 和舊的 Vnode 作比較,發現有不一樣的地方就直接修改在真實DOM上,然後使舊的 Vnode 的值為新的 Vnode 。
diff 的過程就是調用 patch 函數,比較新舊節點,一邊比較一邊給真實的 DOM 打補丁。在採取 diff 演算法比較新舊節點的時候,比較只會在同層級進行。 在 patch 方法中,首先進行樹級別的比較 new Vnode 不存在就刪除 old Vnode old Vnode 不存在就增加新的 Vnode 都存在就執行diff更新 當確定需要執行diff演算法時,比較兩個 Vnode ,包括三種類型操作:屬性更新,文本更新,子節點更新 新老節點均有子節點,則對子節點進行 diff 操作,調用 updatechidren 如果老節點沒有子節點而新節點有子節點,先清空老節點的文本內容,然後為其新增子節點 如果新節點沒有子節點,而老節點有子節點的時候,則移除該節點的所有子節點 老新老節點都沒有子節點的時候,進行文本的替換
updateChildren 將 Vnode 的子節點Vch和oldVnode的子節點oldCh提取出來。 oldCh和vCh 各有兩個頭尾的變數 StartIdx和EndIdx ,它們的2個變數相互比較,一共有4種比較方式。如果4種比較都沒匹配,如果設置了 key ,就會用 key 進行比較,在比較的過程中,變數會往中間靠,一旦 StartIdx>EndIdx 表明 oldCh和vCh 至少有一個已經遍歷完了,就會結束比較。
你都做過哪些Vue的性能優化?
你知道Vue3有哪些新特性嗎?它們會帶來什麼影響?
更小巧、更快速 支持自定義渲染器 支持搖樹優化:一種在打包時去除無用代碼的優化手段 支持Fragments和跨組件渲染
模板語法99%保持不變 原生支持基於class的組件,並且無需藉助任何編譯及各種stage階段的特性 在設計時也考慮TypeScript的類型推斷特性 重寫虛擬DOM 可以期待更多的編譯時提示來減少運行時的開銷 優化插槽生成 可以單獨渲染父組件和子組件 靜態樹提升 降低渲染成本 基於Proxy的觀察者機制 節省內存開銷
檢測機制 更加全面、精準、高效,更具可調試式的響應跟蹤
實現雙向綁定 Proxy 與 Object.defineProperty 相比優劣如何?
React
1、react中key的作用,有key沒key有什麼區別,比較同一層級節點什麼意思?
2、你對虛擬dom和diff演算法的理解,實現render函數
虛擬DOM 本質上是 JavaScript 對象,是對 真實DOM 的抽象表現。 狀態變更時,記錄新樹和舊樹的差異 最後把差異更新到真正的 dom 中 render函數:
3、React組件之間通信方式?
Context 提供了一個無需為每層組件手動添加 props ,就能在組件樹間進行數據傳遞的方法.如果你只是想避免層層傳遞一些屬性,組件組合( component composition )有時候是一個比 context 更好的解決方案。 5. 組件組合缺點:會使高層組件變得復雜
4、如何解析jsx
5、生命周期都有哪幾種,分別是在什麼階段做哪些事情?為什麼要廢棄一些生命周期?
componentWillMount、componentWillReceiveProps、componentWillUpdate在16版本被廢棄,在17版本將被刪除,需要使用UNSAVE_前綴使用,目的是向下兼容。
6、關於react的優化方法
使用return null而不是CSS的display:none來控制節點的顯示隱藏。保證同一時間頁面的DOM節點盡可能的少。
不要使用數組下標作為key 利用 shouldComponentUpdate 和 PureComponent 避免過多 render function ; render 裡面盡量減少新建變數和bind函數,傳遞參數是盡量減少傳遞參數的數量。 盡量將 props 和 state 扁平化,只傳遞 component 需要的 props (傳得太多,或者層次傳得太深,都會加重 shouldComponentUpdate 裡面的數據比較負擔),慎將 component 當作 props 傳入
使用 babel-plugin-import 優化業務組件的引入,實現按需載入 使用 SplitChunksPlugin 拆分公共代碼 使用動態 import ,懶載入 React 組件
7、綁定this的幾種方式
8、對fiber的理解
9、setState是同步還是非同步的
10、Rex、React-Rex
Rex的實現流程
用戶頁面行為觸發一個 Action ,然後 Store 調用 Recer ,並且傳入兩個參數:當前 State 和收到的 Action 。 Recer 會返回新的 State 。每當 state 更新之後, view 會根據 state 觸發重新渲染。
React-Rex:
Provider :從最外部封裝了整個應用,並向 connect 模塊傳遞 store 。 Connect :
11、對高階組件的理解
高階組件是參數為組件,返回值為新組件的函數。 HOC 是純函數,沒有副作用。 HOC 在 React 的第三方庫中很常見,例如 Rex 的 connect 組件。
高階組件的作用:
12、可以用哪些方式創建 React 組件?
React.createClass()、ES6 class 和無狀態函數
13、 React 元素與組件的區別?
組件是由元素構成的。元素數據結構是普通對象,而組件數據結構是類或純函數。
Vue與React對比?
數據流:
react 主張函數式編程,所以推崇純組件,數據不可變,單向數據流,
vue 的思想是響應式的,也就是基於是數據可變的,通過對每一個屬性建立Watcher來監聽,當屬性變化的時候,響應式的更新對應的虛擬dom。
監聽數據變化實現原理 :
組件通信的區別:jsx和.vue模板。
性能優化
vuex 和 rex 之間的區別?
從實現原理上來說,最大的區別是兩點:
Rex 使用的是不可變數據,而 Vuex 的數據是可變的。 Rex 每次都是用新的 state 替換舊的 state ,而 Vuex 是直接修改
Rex 在檢測數據變化的時候,是通過 diff 的方式比較差異的,而 Vuex 其實和Vue的原理一樣,是通過 getter/setter 來比較的(如果看 Vuex 源碼會知道,其實他內部直接創建一個 Vue 實例用來跟蹤數據變化)
瀏覽器從輸入url到渲染頁面,發生了什麼?
網路安全、HTTP協議
TCP UDP 區別
Http和Https區別(高頻)
GET和POST區別(高頻)
理解xss,csrf,ddos攻擊原理以及避免方式
XSS ( Cross-Site Scripting , 跨站腳本攻擊 )是一種代碼注入攻擊。攻擊者在目標網站上注入惡意代碼,當被攻擊者登陸網站時就會執行這些惡意代碼,這些腳本可以讀取 cookie,session tokens ,或者其它敏感的網站信息,對用戶進行釣魚欺詐,甚至發起蠕蟲攻擊等。
CSRF ( Cross-site request forgery ) 跨站請求偽造 :攻擊者誘導受害者進入第三方網站,在第三方網站中,向被攻擊網站發送跨站請求。利用受害者在被攻擊網站已經獲取的注冊憑證,繞過後台的用戶驗證,達到冒充用戶對被攻擊的網站執行某項操作的目的。
XSS避免方式:
CSRF 避免方式:
DDoS 又叫分布式拒絕服務,全稱 Distributed Denial of Service ,其原理就是利用大量的請求造成資源過載,導致服務不可用。
Ⅵ Web前端面試題第六道—鏈接標記target與Dom,Bom
(1)鏈接標記target屬性的_self、_top、_parent、_blank、main、left、top各有何用處?
target屬性的_self、_top、_parent都是針對框架的。比如你寫了這樣一個網頁page,網頁page分成frame1、frame2,frame1又分成frame1-1、frame1-2,frame1-1又分成frame1-1-1,frame1-1-2。
假如你在frame1-1-1中放了一個鏈接。
如果這個鏈接的target="_self",那麼鏈接會在frame1-1-1中打開。
如果target="_parent",那麼鏈接會在frame1-1中打開。
如果target="_top",那麼鏈接會在page中打開。
如果target="_blank",瀏覽器會另開一個新窗口顯示page文檔。
未經驗證,根據說法應該是這個意思。
(2)鏈接標記target屬性的main、left、top各有何用處?
main、left、top是由Adobe Dreamweaver生成的主、左、上框架集的框架默認名。
(3)什麼是Bom什麼是Dom?你如何理解Dom?
DOM和BOM是JS的三大組成部分之一,下面講解BOM與DOM以及兩者的關系
DOM講解
DOM即文檔對象模型,通過創建節點樹來表示文檔,是HTML和XML的應用程序介面(API),描述了處理網頁內容的方法和介面,從而使開發者對文檔的內容和結構具有空前的控制力,用DOM API可以輕松地刪除、添加和替換節點以及設置文檔中標簽的屬性。將一個html文檔用DOM樹表示如下圖所示 。
HTML的DOM樹節點包括:
1. 元素節點:上圖中<html>、<body>、<p>都是元素節點即標簽
2. 文本節點:向用戶展示的內容,如<li>...</li>中的javascript、Dom、CSS等文本。
3. 屬性節點:元素屬性,如<a>標簽的鏈接屬性
BOM講解
BOM是browser object model的縮寫,簡稱瀏覽器對象模型。簡單說即是javascript訪問,操作瀏覽器的一個中介。
BOM主要用於管理瀏覽器窗口之間的通訊,由一系列相關的對象構成,並且每個對象都提供了很多方法與屬性。通過BOM我們可以學到與瀏覽器窗口交互的一些對象,可以移動,調整瀏覽器大小的window對象,可以用於導航的location對象與history對象,可以獲取瀏覽器,操作系統與用戶屏幕信息的navigator與screen對象,可以使用document作為訪問HTML文檔的入口,管理框架的frames對象等。因此它的核心對象是window。
Window對象是BOM中所有對象的核心,是BOM中所有對象的父對象。所以,盡管frame ,history……都是window的子對象,我們只要知道BOM操作的是對象是瀏覽器窗口(window),那麼這些對象就可以直接使用,無需通過「window.」來訪問
BOM和DOM的關系
要想操作網頁,需要DOM來進行訪問,但是僅僅只是網頁內容。瀏覽器除了有顯示的內容,還有一個重要的部分就是一個載體,它承載我們看到的內容。好比是一個框架,而操作這個載體的對象我們把它叫做BOM。所以這樣的結構,使得BOM,DOM各司其職,BOM負責跟瀏覽器框架打交道,DOM負責瀏覽器內容Document打交道。從上圖中能更好的理解兩者的關系。