摘要:發明了,利用語法來創建虛擬。然而,對持久化實例的缺乏也意味著函數式組件不會出現在的組件樹里。這個很有用,當你在父組件給子組件綁定事件時就需要這個了。之前考慮過用動態組件來切換,但是放棄了,因為沒有直觀啊。另外推薦大家多用函數式組件提高性能。
什么是JSX?
JSX就是Javascript和XML結合的一種格式。React發明了JSX,利用HTML語法來創建虛擬DOM。當遇到<,JSX就當HTML解析,遇到{就當JavaScript解析.
我為什么要在vue中用JSX?想折騰一下唄,開玩笑.最開始是因為近期在學習react,在里面體驗了一把jsx語法,發現也并沒有別人說的很難受的感覺啊,于是就想嘗試在vue中也試下,廢話不多說,先來用代碼來看下兩者的區別吧.
ps:vue中大部分場景是不需要用render函數的,還是用模板更簡潔直觀.
## 使用template
// item.vue
item組件中就是接收父組件傳過來的id值來顯示不同的h標簽,v-if可以說用到了"極致",而且寫了很多個冗余的slot
## 使用render函數和jsx
// item.vue
再加上父組件來控制props的值。父組件不做對比還用傳統的template格式,
// list.vueHello World
運行后頁面就渲染出了h1 or h2 or h3標簽,同時slot也只有一個,點擊切換props的值,也會顯示不同的h標簽。第二種寫法雖然不是很直接,但是省去了很多冗余代碼,頁面一下清爽了很多。
## 沒了v-if,v-for,v-model怎么辦?
不要著急,這些指令只是黑魔法,用js很容易實現。
v-if
render(){ return ({this.show?"你帥":"你丑"}) }
寫三元表達式只能寫簡單的,那么復雜的還得用if/else
render(){ let ifText if(this.show){ ifText=你帥
}else{ ifText=你丑
} return ({ifText}) }
v-for
data(){ return{ show:false, list:[1,2,3,4] } }, render(){ return ({this.list.map((v)=>{ return) }{v}
})}
在jsx中{}中間是沒辦法寫if/for語句的只能寫表達式,所以就用map來當循環,用三元表達式來當判斷了
v-model
最近在幫公司面試招人發現v-model很多人都不知道語法糖是什么?然后有些人說我可以用原生js實現,但是他們竟然不知道在vue中怎么實現,好吧,兩個點:傳值和監聽事件改變值。
怎么用自定義組件?
很簡單,只需要導入進來,不用再在components屬性聲明了,直接寫在jsx中比如
事件,class,style,ref等等怎么綁定?來看下面的寫法
render (h) { return () }
上面有個地方需要注意,當給自定義組件綁定事件時用nativeOnClick,而模板格式是用
@click.native ,另外當用到給函數式組件綁定事件時就有點小坑了下面說。
函數式組件無狀態,無this實例,下面是vue文檔中提到的一段話:
因為函數式組件只是一個函數,所以渲染開銷也低很多。然而,對持久化實例的缺乏也意味著函數式組件不會出現在 Vue devtools 的組件樹里。
我個人理解因為沒了狀態(data),少了很多響應式的處理,還有生命周期等過程會提高速度和減少內存占用吧?
函數式組件也可以在模板格式中用只需要這樣
那jsx中的函數式組件呢?也很簡單只需增加配置functional: true就可以了
那函數式組件沒有了this 實例怎么綁定事件怎么獲取props呢?組件需要的一切都是通過上下文傳遞,包括:
props : 提供所有 prop 的對象
children: VNode 子節點的數組
slots: 返回所有插槽的對象的函數
data:傳遞給組件的數據對象,并將這個組件作為第二個參數傳入 createElement
上面我只列舉了部分屬性,這些是非函數式組件的東西,對于函數式組件
vue 增加了context對象,需要作為render(h,context) 第二個參數傳入,this.$slots.default更新為context.children props原本是直接掛在this上的,現在變為context.props掛在了context.props上。this.data變為了context.data需要注意的是對于函數式組件,沒有被定義為prop的特性不會自動添加到組件的根元素上,意思就是需要我們手動添加到組件根元素了,看個例子吧
//父組件 ...省略無關代碼 render(){ return (- ) } //Item.vue組件 export default { functional:true, name: "item", render(h,context){ return (
{context.props.data}) } }上面代碼期待的是.large類名傳入到了Item的根元素上,但是其實沒有。我們需要增加點東西
// Item.vue export default { functional:true, name: "item", render(h,context){ return ({context.props.data}) } }注意到,通過展開運算符把所有的屬性添加到了根元素上,這個context.data就是你在父組件給子組件增加的屬性,他會跟你在子元素根元素的屬性智能合并,現在.large類名就傳進來了。這個很有用,當你在父組件給子組件綁定事件時就需要這個了。下面說一個關于綁定事件的小坑
向 createElement 通過傳入 context.data 作為第二個參數,我們就把 my-functional-button 上面所有的特性和事件監聽器都傳遞下去了。事實上這是非常透明的,那些事件甚至并不要求 .native 修飾符上面是vue官網的一段話,然而我看了一遍就忽略了一句很重要的話,就是最后一句,他說不需要.native修飾符了?好先看代碼
// 父組件 methods:{ show(){ alert("你好") } }, render(){ return (- ) }
上面代碼乍一看沒毛病,自定義組件用onNativeClick嘛,結果就是不會彈窗。唉,最后讀了幾遍剛才vue文檔中的解釋,才發現原來函數式組件不需要.native修飾符,對于template格式肯定一下就反應過來了,但是jsx的話,好吧,把上面的onNativeClick重新改為onClick就好了。
現有項目哪些功能可以用jsx代替呢?這個其實跟最開始我例舉的例子很像。我在項目中用它來干掉了滿屏的v-if/v-else
由于我的業務是pad上的,需求是一套試卷有幾十道題目,要求一屏只顯示一道題目,點擊下一題顯示下一個題,思路也比較簡單:用一個num變量表示當前正在展示的題目索引
每次點擊下一題按鈕時num++
用v-if來判斷 num===1,num===2這樣來決定展示哪個。
這一寫,模板里面好多啊,由于我們的題目每道題的模板可能都不一樣,所以沒辦法循環,只能手寫全部。之前考慮過用動態組件來切換,但是放棄了,因為沒有if直觀啊。
下面看怎么用jsx優化一下
//父組件 export default { name: "list", data() { return { data:"我是函數式組件", id:1, tests:{ 1:第一道題, 2:, 3:第二道題 } } }, methods:{ next(){ ++this.id } }, render(){ return (第三道題
) } }上面每道題目的結構都不一致
//子組件,只接受數據展示,用函數式組件上面沒有用任何if/else判斷就完成了功能,這里用jsx我覺得比較合適,不知道各位大佬有什么其他思路?
最后本片文章首發于掘金社區掘金總結一下吧,我們平時開發還是多用temlate因為直觀簡潔,各種指令用著很方便,等你覺得用template寫出的代碼看著很冗余,或者想自己控制渲染邏輯比如循環,判斷等等時可以考慮用JSX。另外推薦大家多用函數式組件提高性能。
第一次寫文章,希望各位花時間看了的大佬覺得哪個說的不太嚴謹還需多多包涵,提出意見我都接受。
參考資料vue 渲染函數&jsx
babel-plugin-transform-vue-jsx
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95468.html
摘要:錯誤例子可以實現的語法如下使用邏輯運算符文件文件使用三元運算符文件使用函數綁定的數據對象也不必內聯定義在模板里可以定義一個函數,類似中的鉤子函數。 作者:羽徵 摘要:操作元素的 class 列表和內聯樣式是數據綁定的一個常見需求,頻繁操作dom元素會降低javascript性能,為了實現高性能js,動態綁定class和style是高素養程序員的必選。本文以React-JSX語法為基礎,...
摘要:錯誤例子可以實現的語法如下使用邏輯運算符文件文件使用三元運算符文件使用函數綁定的數據對象也不必內聯定義在模板里可以定義一個函數,類似中的鉤子函數。 作者:羽徵 摘要:操作元素的 class 列表和內聯樣式是數據綁定的一個常見需求,頻繁操作dom元素會降低javascript性能,為了實現高性能js,動態綁定class和style是高素養程序員的必選。本文以React-JSX語法為基礎,...
摘要:想要使用語法的話,配合,這個插件,體驗更佳,這個插件在語法中實現了。這種方式最接近的單文件組件的寫法,如果一個完善項目從改成,用這種方法很快,只要加上和一些必要的變量類型就好了,然后用包裹就好。不推薦混入用這種方式寫,無法實現多繼承。 最近嘗試了一下 TypeScript,試著把一個 Vue 項目改成了 TypeScript 的,感覺還不錯 目前 Vue 和 TypeScript 的配...
摘要:項目編碼規范化工具工具代碼校驗工具,讓代碼更一致和避免。在配置文件到項可對單條規則一一進行改寫。以下以項目需校驗文件為例參考鏈接一步一步,統一項目中的編碼規范 Web 項目編碼規范化工具 工具 ESLint The pluggable linting utility for JavaScript and JSX 代碼校驗工具(linting utility),讓代碼更一致和避免 bug...
閱讀 2587·2023-04-26 03:00
閱讀 1402·2021-10-12 10:12
閱讀 4198·2021-09-22 15:33
閱讀 2925·2021-09-22 15:06
閱讀 1537·2019-08-30 15:44
閱讀 2151·2019-08-30 13:59
閱讀 538·2019-08-30 11:24
閱讀 2418·2019-08-29 17:07