A. 怎麼把前端頁面的用戶名密碼封裝成對象
1、定義一個類。
2、類中增加一個方法。
3、body中定義一個dom節點。
4、腳本中把dom節點和類定義結合起來,實現特定的組件功能。
B. 利用father build 開發前端組件庫實戰
我們的目標是建立一個前端組建庫, 使用的技術棧是father+docz,同時要支持typescript, 在build出來的es目錄中要能夠生成「.d.ts」後綴的類型聲明文件,因為只有生成類型聲明文件,我們在使用自己開發的組件庫的時候才能獲得更好的開發體驗。
之所以寫下這篇文章,是因為自己在使用father-build建設內部組件庫的過程中,遇到了一些問題且難以找到相關文檔,將自己的經驗總結下來希望看到這篇文章的人能避開這些坑,更加順利地搭建好自己的前端組件庫。
package.json
其中,main指定了入口文件,mole對應es mole的輸出,types對應你的typings文件,這樣在組件在被使用的時候編輯器才能識別出你的組件類型聲明
.fatherrc.js 配置father build打包方式, 具體詳情可以參考 umijs/father
tsconfig.json typescript的配置文件,注意只有declaration設置為true才能生成.d.ts後綴的文件
接下來我們在components目錄創建第一個自己的組件,下面是一個button的例子:
樣式文件可以直接使用less編寫
然後在入口文件index.ts將其導出,暴漏給外部使用。
使用文檔的後綴名為".mdx", 語法與markdown類似,更多詳情參考 docz 的文檔
我們可以執行 yarn start ,來實時查看文檔的效果。
現在命令行執行 yarn build 即可對組件庫進行打包了,注意我們在.fatherrc中配置了esm和cjs兩種打包方式,對應會生成 es 和 lib兩個目錄,其中 esm對應的是 es目錄,cjs對應lib目錄。
正常情況下,在的es和lib目錄下應該已經為我們寫的ts源碼自動生成了「.d.ts」後綴的類型聲明文件,如果沒有生成,請仔細對比.fatherrc.js和tsconfig.json這兩個配置文件,另外還要注意的是,如果我們基於antd封裝業務組件庫的話,不要在組件庫中使用css mole,否則也會造成無法自動產生類型聲明文件的問題。
文章未能詳盡部分,可以參考這個demo的github源碼地址: https://github.com/xitengfei/xui-components , 有問題歡迎批評指正。
C. vue封裝樹形組件
最近在做一個vue的項目,獨立封裝樹形組件。
先說一下項目需求:
1.項目原型:
此樹形結構分為三級:根節點,一級節點,二級節點,每個節點都可以選中或取消選中,父級節點選中,下級的所有節點也可全部選中。二級節點中有不可選中的節點
2.後台返回的數據結構:
this.menuList = [{id:1,menuName:'首頁',type:1,parentId:0},
{id:2,menuName:'首頁1',type:0,parentId:1},
{id:3,menuName:'首頁2',type:0,parentId:1},
{id:5,menuName:'首頁3',type:1,parentId:1},
{id:6,menuName:'報告看板',type:1,parentId:0},
{id:7,menuName:'看板1',type:2,parentId:6},
{id:8,menuName:'看板2',type:2,parentId:6},
{id:9,menuName:'數據中心',type:1,parentId:0},
{id:10,menuName:'數據中心1',type:1,parentId:9},
{id:10,menuName:'數據中心2',type:2,parentId:9}];
其中parentId為0 的為父節點,1為可以選擇的子節點,2為已經選中的子節點
根節點為前端寫死的節點
3.html頁面
4.最終實現的效果
D. 前端面試問封裝過什麼組件
日期選擇、城市選擇、組織架構樹、表格樹、列表篩選、頭部導航條、菜單欄、提示彈層、確認彈層、上拉載入下拉刷新、圖表繪制、上傳圖片、下拉選擇等等,其實根據業務需求去封裝復用組件並不是很難的一件事,但就實踐經驗來看,要怎麼樣去封裝一個可用性強,復用性高的優質組件,考慮到盡可能多的可能性的同時又不讓組件用起來太麻煩,這還是需要思考和精進的一件事。
E. 如何 build一個前端組件庫
可以使用前段編程碼。理解不了你可以去後盾人視頻平台,那裡學習的視頻非常多。
F. 前端通用組件設計
調用組件庫的API相信很多人都會用,但是如何封裝一個高復用的組件並不是每個人都能做到,而這也是檢驗一個前端開發人員的一個標准。
說到開發組件,首先需要考慮一個問題,一個可復用的組件都需要具備哪些必要條件。
1. 細粒度考量
看過設計模式的朋友應該有了解過很多設計原則,其中一個就是 單一職責原則 ,這個原則放在開發組件中也同樣適用。在原則上一個組件就只負責一件事,這就是單一原則所帶來的好處也非常明顯,就是可以更大可能的復用組件。但如果職責過於單一,也會造成組件碎片化嚴重,過於抽象。
因此我們需要考慮,所謂的單一職責原則是建立在可復用的基礎上的。否則,可以做為獨立組件的內部組件進行使用。
2. 組件通用性考量
組件設計之初是為了當時的頁面設計進行封裝設計的,那麼之後的頁面設計極大可能是與之前不同的,那麼之前設計的組件就不能用了。
而一旦發生這樣的情況,就說明我們之前所設計的組件是不通用的,需要重新設計了。就像Antd組件庫那樣,預留了dropdownRender進行組件渲染。
通用性的設計就代表著將放棄對DOM的操作權,暴露給開發者進行操作,組件開發者本身只負責底層邏輯和基本的DOM結構。這也是開發通用型組件的秘訣之一。
3. 技術選型
css存在著許多的弊端,例如樣式易沖突(沒有作用域的概念)、書寫繁瑣(不支持嵌套)、缺少變數(不便於一件更換主題)等等。而解決這些問題的方案也是層出不窮,從最早的css預處理,到後來的Postcss,再到後來的styled-compontent,各種方式任君選擇。
4. 打包工具
產品的設計思想固然是核心,但是也需要一堆輔助工具來來幫助我們開發,例如編譯工具、測試工具、打包工具。
說到打包工具,就不得不提一下如今非常火爆的,需要配置工程師專門配置的webpack了。但是他也有一個強大的競爭對手 rollup。
rollup更適合用於組件庫的打包,優勢如下:
設計一個輪播圖組件
學以致用,學了就肯定要實踐一下。輪播圖是一個比較常見的組件,每個組件庫中都封裝的有,接下來我們也來介紹一下如何設計一個輪播圖組件。
1. 輪播圖原理
通常情況下我們使用輪播圖是這樣編寫的
那麼為什麼放入了四個div盒子卻只顯示一個呢,這是因為可視區域是固定的,只需要移動div盒子就可以顯示出後面的盒子,這樣就達到了輪播的效果。
為了是觀看效果更好,我們都會隱藏掉可視區域之外的內容,這樣就是大家經常看到的輪播圖了。組件就可以這樣設計:
可以通過transform: translateX()不斷改變SlideList的位置,就可以達到輪播的效果了。
2. 輪播圖的基礎實現
知道了基礎原理就可以進行組件的實現了,這里以移動端輪播圖為例。
首先,獲取移動端可視窗口的寬度。
------- 未完待續 --------
G. 如何通過 Vue+Webpack 來做通用的前端組件化架構設計
angular:
我覺得angularjs的學習上手周期比較長,可能遇到問題,都無法立刻解決,而且編碼的質量明顯的很差,如果團隊沒有制定規范,那寫出來的代碼就沒法看。對於一個選用angularjs的團隊來說,我認為編碼規范是很重要的,否則對編碼能力是沒有提升的。
avalon:
avalonjs文檔資料沒有那麼全,我感覺一些開源支持的力量不夠多。不過,如果有項目需求,需要去做IE瀏覽器的支持話,我建議選擇avalonjs
vue:
vuejs 文檔比較齊全,vue吸取了angularjs
的一些優點,規避了一些缺點,至少編碼規范上有了一個質的飛躍,學習上手的周期比較短。vue起初只是一個輕量級的類庫,用來做類似於react的事情,
同時vue也是可以拿來做前端架構設計的,比如:vueify + vue-router (spa框架)。
vue學習地址:http://cn.vuejs.org/
以上說了那麼多沒用的,下面就來點幹活了!
我的前端組件化架構設計,目錄如下:
項目架構用到的知識點,還是挺多的,知識清單如下:
[1]: gulp + webpack 構建打包工具, 使用了一系列的loader,比如:vue-loader, sass-loader, babel-loader , 以及 postcss,postcss-custom-properties,等等
[2] : postcss-custom-properties : 用來做樣式全局化, 只需要通過變數去維護,通過編譯變數既可以換膚。
[3] : vue-loader (vue文件組件化):用來去編譯處理 *.vue 的文件,一個vue 文件就是一個單獨的組件,vue組件開發具有高獨立且易維護。組件的劃分可大可小,一個頁面也可以看作成由多個vue 組件構成的,一個頁面也可以是一個vue組件, vue 文件結構如下:
[4] : babel-loader :實現對vue文件中 es6 語法的編譯解析
[5] : vue-router :用來做路由分發,而且文檔非常的齊全(學習地址:http://vuejs.github.io/vue-router/zh-cn/index.html)。
[6] : vue (插件式方式):vue本身提供了一個install 方式用來注入,我們可以注入一些全局的(屬性、方法、以及通用的ui組件)。
下面說說文件夾的含義:
common 文件夾: 是用來存一些通用的東西,比如樣式,以及全局的js等等
components 文件夾:用來放獨立的組件,我打算後期做細分,ui 組件,以及page 組件等等,這裡面就是團隊的心血,以後就能做成獨立的組件庫了。
filters 文件夾:用來放通用的過濾器操作。
plugins 文件夾:用來放 Vue.use 注入到Vue全局的插件庫,比如:請求載入、彈框、分頁、ui組件 等等。plugins 只是把 componets 組件暴露給 Vue全局。
views 文件夾: 用來存放頁面模塊
app.vue 文件:第一次啟動的主程序模塊
app.js 文件:啟動前的載入,注入,實例化
router.config.js 文件:路由模塊
目前該架構在前後台的SPA架構都適用,可能還是有很多不完善,不過我還很年輕,vue也還狠年輕,望各位道友多給我們年輕人一些機會。
H. Vue組件(30)封裝一下數據列表的控制項
好像前端喜歡叫 table,而後端喜歡叫grid。就是現實數據的列表。當然table還有其他的含義,UI庫的table也是有其他的功能的。
而數據列表控制項其實也沒啥好封裝的,各種功能UI庫都提供了,一般使用也是很方便的,只是為了我的那種想法還是需要小小的封裝一下。
所以這里可以直接返回選擇的id集合。
設置高度、鎖定行列等信息,還需要設置主鍵欄位的名稱,這樣便於獲取選擇的記錄的ID。
這幾個是依據 element-plus 的 table 的 el-table-column 的需求來設置的。設置表頭、綁定的欄位名稱和寬度。然後還應該加上對齊方式、格式化等功能。找了半天終於找到了 align,還有 formatter。
目前這個控制項只想實現這幾個功能,一般的列表需求大概可以滿足了。
其他功能會封裝成其他的控制項,比如批量修改控制項、n級分類控制項等。
然後就可以做綜合性的增刪改查了。
還是老規矩,屬性都可以做成json的形式,可以放在單獨的 json 文件裡面單獨載入,這樣增刪改查需要的幾個控制項的屬性就都弄到了json文件裡面,然後呢,猜猜可以實現什麼神奇的功能呢?
I. vue前端面試題有哪些呢
文章中給你列舉了部分的面試題,這些都是公司面試常遇到的,還有需要的還可以自己去查閱一下資料
1、active-class是哪個組件的屬性?嵌套路由怎麼定義?
答:vue-router模塊的router-link組件。
2、怎麼定義vue-router的動態路由?怎麼獲取傳過來的動態參數?
答:在router目錄下的index.js文件中,對path屬性加上/:id。 使用router對象的params.id
3、vue-router有哪幾種導航鉤子?
答:三種,一種是全局導航鉤子:router.beforeEach(to,from,next),作用:跳轉前進行判斷攔截。第二種:組件內的鉤子;第三種:單獨路由獨享組件
4、scss是什麼?安裝使用的步驟是?有哪幾大特性?
答:預處理css,把css當前函數編寫,定義變數,嵌套。 先裝css-loader、node-loader、sass-loader等載入器模塊,在webpack-base.config.js配置文件中加多一個拓展:extenstion,再加多一個模塊:mole裡面test、loader
4.1、scss是什麼?在vue.cli中的安裝使用步驟是?有哪幾大特性?
答:css的預編譯。
使用步驟:
第一步:用npm 下三個loader(sass-loader、css-loader、node-sass)
第二步:在build目錄找到webpack.base.config.js,在那個extends屬性中加一個拓展.scss
第三步:還是在同一個文件,配置一個mole屬性
第四步:然後在組件的style標簽加上lang屬性 ,例如:lang=」scss」
有哪幾大特性:
1、可以用變數,例如($變數名稱=值);
2、可以用混合器,例如()
3、可以嵌套
5、mint-ui是什麼?怎麼使用?說出至少三個組件使用方法?
答:基於vue的前端組件庫。npm安裝,然後import樣式和js,vue.use(mintUi)全局引入。在單個組件局部引入:import {Toast} from 『mint-ui』。組件一:Toast(『登錄成功』);組件二:mint-header;組件三:mint-swiper
6、v-model是什麼?怎麼使用? vue中標簽怎麼綁定事件?
答:可以實現雙向綁定,指令(v-class、v-for、v-if、v-show、v-on)。vue的model層的data屬性。綁定事件:<input @click=doLog() />
7、axios是什麼?怎麼使用?描述使用它實現登錄功能的流程?
答:請求後台資源的模塊。npm install axios -S裝好,然後發送的是跨域,需在配置文件中config/index.js進行設置。後台如果是Tp5則定義一個資源路由。js中使用import進來,然後.get或.post。返回在.then函數中如果成功,失敗則是在.catch函數中
8、axios+tp5進階中,調用axios.post(『api/user』)是進行的什麼操作?axios.put(『api/user/8′)呢?
答:跨域,添加用戶操作,更新操作。
9、什麼是RESTful API?怎麼使用?
答:是一個api的標准,無狀態請求。請求的路由地址是固定的,如果是tp5則先路由配置中把資源路由配置好。標准有:.post .put .delete
10、vuex是什麼?怎麼使用?哪種功能場景使用它?
答:vue框架中狀態管理。在main.js引入store,注入。新建了一個目錄store,….. export 。場景有:單頁應用中,組件之間的狀態。音樂播放、登錄狀態、加入購物車
11、mvvm框架是什麼?它和其它框架(jquery)的區別是什麼?哪些場景適合?
答:一個model+view+viewModel框架,數據模型model,viewModel連接兩個
區別:vue數據驅動,通過數據來顯示視圖層而不是節點操作。
場景:數據操作比較多的場景,更加便捷
12、自定義指令(v-check、v-focus)的方法有哪些?它有哪些鉤子函數?還有哪些鉤子函數參數?
答:全局定義指令:在vue對象的directive方法裡面有兩個參數,一個是指令名稱,另外一個是函數。組件內定義指令:directives
鉤子函數:bind(綁定事件觸發)、inserted(節點插入的時候觸發)、update(組件內相關更新)
鉤子函數參數:el、binding
13、說出至少4種vue當中的指令和它的用法?
答:v-if:判斷是否隱藏;v-for:數據循環出來;v-bind:class:綁定一個屬性;v-model:實現雙向綁定
14、vue-router是什麼?它有哪些組件?
答:vue用來寫路由一個插件。router-link、router-view
15、導航鉤子有哪些?它們有哪些參數?
答:導航鉤子有:a/全局鉤子和組件內獨享的鉤子。b/beforeRouteEnter、afterEnter、beforeRouterUpdate、beforeRouteLeave
參數:有to(去的那個路由)、from(離開的路由)、next(一定要用這個函數才能去到下一個路由,如果不用就攔截)最常用就這幾種
16、Vue的雙向數據綁定原理是什麼?
答:vue.js 是採用數據劫持結合發布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變動時發布消息給訂閱者,觸發相應的監聽回調。
具體步驟:
第一步:需要observe的數據對象進行遞歸遍歷,包括子屬性對象的屬性,都加上 setter和getter
這樣的話,給這個對象的某個值賦值,就會觸發setter,那麼就能監聽到了數據變化
第二步:compile解析模板指令,將模板中的變數替換成數據,然後初始化渲染頁面視圖,並將每個指令對應的節點綁定更新函數,添加監聽數據的訂閱者,一旦數據有變動,收到通知,更新視圖
第三步:Watcher訂閱者是Observer和Compile之間通信的橋梁,主要做的事情是:
1、在自身實例化時往屬性訂閱器(dep)裡面添加自己
2、自身必須有一個update()方法
3、待屬性變動dep.notice()通知時,能調用自身的update()方法,並觸發Compile中綁定的回調,則功成身退。
第四步:MVVM作為數據綁定的入口,整合Observer、Compile和Watcher三者,通過Observer來監聽自己的model數據變化,通過Compile來解析編譯模板指令,最終利用Watcher搭起Observer和Compile之間的通信橋梁,達到數據變化 -> 視圖更新;視圖交互變化(input) -> 數據model變更的雙向綁定效果。
ps:16題答案同樣適合」vue data是怎麼實現的?」此面試題。
17、請詳細說下你對vue生命周期的理解?
答:總共分為8個階段創建前/後,載入前/後,更新前/後,銷毀前/後。
創建前/後: 在beforeCreated階段,vue實例的掛載元素$el和數據對象data都為undefined,還未初始化。在created階段,vue實例的數據對象data有了,$el還沒有。
載入前/後:在beforeMount階段,vue實例的$el和data都初始化了,但還是掛載之前為虛擬的dom節點,data.message還未替換。在mounted階段,vue實例掛載完成,data.message成功渲染。
更新前/後:當data變化時,會觸發beforeUpdate和updated方法。
銷毀前/後:在執行destroy方法後,對data的改變不會再觸發周期函數,說明此時vue實例已經解除了事件監聽以及和dom的綁定,但是dom結構依然存在
18、請說下封裝 vue 組件的過程?
答:首先,組件可以提升整個項目的開發效率。能夠把頁面抽象成多個相對獨立的模塊,解決了我們傳統項目開發:效率低、難維護、復用性等問題。
然後,使用Vue.extend方法創建一個組件,然後使用Vue.component方法注冊組件。子組件需要數據,可以在props中接受定義。而子組件修改好數據後,想把數據傳遞給父組件。可以採用emit方法。
19、你是怎麼認識vuex的?
答:vuex可以理解為一種開發模式或框架。比如PHP有thinkphp,java有spring等。
通過狀態(數據源)集中管理驅動組件的變化(好比spring的IOC容器對bean進行集中管理)。
應用級的狀態集中放在store中; 改變狀態的方式是提交mutations,這是個同步的事物; 非同步邏輯應該封裝在action中。
20、vue-loader是什麼?使用它的用途有哪些?
答:解析.vue文件的一個載入器,跟template/js/style轉換成js模塊。
用途:js可以寫es6、style樣式可以scss或less、template可以加jade等
21、請說出vue.cli項目中src目錄每個文件夾和文件的用法?
答:assets文件夾是放靜態資源;components是放組件;router是定義路由相關的配置;view視圖;app.vue是一個應用主組件;main.js是入口文件
22、vue.cli中怎樣使用自定義的組件?有遇到過哪些問題嗎?
答:第一步:在components目錄新建你的組件文件(smithButton.vue),script一定要export default {
第二步:在需要用的頁面(組件)中導入:import smithButton from 『../components/smithButton.vue』
第三步:注入到vue的子組件的components屬性上面,components:{smithButton}
第四步:在template視圖view中使用,<smith-button> </smith-button>
問題有:smithButton命名,使用的時候則smith-button。
23、聊聊你對Vue.js的template編譯的理解?
答:簡而言之,就是先轉化成AST樹,再得到的render函數返回VNode(Vue的虛擬DOM節點)
詳情步驟:
首先,通過compile編譯器把template編譯成AST語法樹(abstract syntax tree 即 源代碼的抽象語法結構的樹狀表現形式),compile是createCompiler的返回值,createCompiler是用以創建編譯器的。另外compile還負責合並option。
然後,AST會經過generate(將AST語法樹轉化成render funtion字元串的過程)得到render函數,render的返回值是VNode,VNode是Vue的虛擬DOM節點,裡面有(標簽名、子節點、文本等等)
J. 什麼是封裝良好的前端交互組件,怎麼寫出封裝良好的前端交互組件
前景是很好的,互聯網應用開發的分工越來越細,真正專業的前端開發工程師是很使用JavaScript|ActionScript編寫封裝良好的前端交互組件。 2. 對Web項目的前端,AehvsQ