vue3?中使用?jsx?開發(fā)的詳細(xì)過程
安裝 JSX 插件
在 Vue2 中要想使用 jsx 開發(fā),需要安裝 @vue/babel-preset-jsx
等插件,之后在 babel 里指定即可,詳細(xì)可以參考下面的 Vue2 GitHub 文檔
最近在使用 Vue3,突然想用 jsx 進(jìn)行開發(fā)部分頁面,順便記錄一下,也可以參考下面的 Vue3 GitHub 文檔
構(gòu)建工具使用的是 vite,要想使用 jsx 開發(fā),需要安裝 @vitejs/plugin-vue-jsx
,之后配置 vite.config.js
里的 plugins 即可
// vite.config.js import vueJsx from '@vitejs/plugin-vue-jsx' import { defineConfig } from 'vite' export default defineConfig(() => { return { plugins: [vueJsx()] } })
接下來著重說一下在使用 .vue
文件和 .jsx
文件在使用語法上的差異
使用語法差異
模板
之前在 template 里寫的 html 代碼需要放到 render 函數(shù)或 setup 函數(shù)里,Vue3 在 setup 里寫會(huì)好一點(diǎn)
<!-- .vue --> <template> <div>Hello World</div> </template> <!-- .jsx --> <script> export default defineComponent({ setup() { return () => ( <div>Hello World</div> ) } }) </script>
指令
需要把雙引號(hào)改為單括號(hào)
v-if
、v-show
、v-html
等同理v-bind
也是一樣的,不過需要把動(dòng)態(tài)綁定需要去掉:
注意:
- 在
.vue
文件中,ref 在模板中會(huì)自動(dòng)進(jìn)行解包,所以不需要使用.value
- 但是在
.jsx
文件中,ref 在模板中不會(huì)自動(dòng)解包,所以需要使用.value
<!-- .vue --> <el-input v-model="queryParams.pageNumber" /> <el-form model="queryParams" :inline="true">...</el-form> <!-- .jsx --> <el-input v-model={queryParams.value.pageNumber} /> <el-form model={queryParams.value} inline={true}>...</el-form>
事件修飾符
- 想使用事件修飾符可以把
v-model
改為一個(gè)數(shù)組,事件修飾符需要以數(shù)組的形式傳遞 - 如果需要傳遞參數(shù),需要在數(shù)組第二個(gè)參數(shù)中以字符串形式傳遞
- 推薦:可以使用
_
來分割事件修飾符,GitHub 里沒有特殊聲明,但是Babel Plugin JSX for Vue 3.0
源碼里做了判斷,可以參考: parseDirectives.ts#L52-L61
<!-- .vue --> <el-input v-model.trim={ queryParams.name } /> <!-- .jsx --> <el-input v-model={ [queryParams.value.name, ['trim'] } /> <!-- 或 --> <el-input v-model_trim={ refVal.value } />
自定義指令
如下示例為:添加 .event
事件修飾符并傳遞 arg 參數(shù),直接打印 binding
效果如下:
<!-- .vue --> <el-button v-hasPermission:arg.event="['xxx:add']" type="primary" plain icon="Plus" @click="handleAdd" > 新增 </el-button> <!-- .jsx --> <el-button v-hasPermission={[['xxx:add'], 'arg', ['event']]} type='primary' plain icon="Plus" onClick={handleAdd} > 新增 </el-button>
v-for
v-for
無法直接使用,需要使用 map 去實(shí)現(xiàn)循環(huán)遍歷渲染
<!-- .vue --> <h1 v-for="item in list" :key="item">{{item}}</h1> <!-- .jsx --> <script> {list.value.map(item => ( <h1>{item}</h1> ))} </script>
注意:
- 如果遍歷時(shí)需要判斷每一項(xiàng)其是否顯示,不能使用
v-if
,需要使用三元運(yùn)算符 v-for
與v-if
不能一起使用
<!-- .vue --> <template v-for="col in columns"> <el-table-column v-if="col.visible" :key="col.key" :label="col.label" :prop="col.field" /> </template> <!-- .jsx --> {columns.value.map(col => col.visible ? ( <el-table-column key={col.id} label={col.label} prop={col.field} /> ) : null )}
v-on
v-on
無法直接使用,需要使用原生綁定事件的方式去實(shí)現(xiàn)(@ -> on
,之后進(jìn)行駝峰)
<!-- .vue --> <el-button @click="handleQuery">搜索</el-button> <!-- .jsx --> <el-button onClick={handleQuery}>搜索</el-button>
系統(tǒng)按鍵修飾符不能通過 .xxx
形式書寫,需要自己進(jìn)行判斷,比如如下示例是按回車時(shí)進(jìn)行搜索
這里順便說一下 style,由于里面是 :
形式表示,需要改為對(duì)象形式書寫
<!-- .vue --> <el-input v-model.trim="queryParams.number" clearable style="width: 180px" @keyup.enter="handleQuery" /> <!-- .jsx --> <el-input v-model_trim={queryParams.value.number} clearable style={{ width: '180px' }} onKeyup={e => e.code === 'Enter' && handleQuery()} />
插槽
在 jsx 中,應(yīng)該使用 v-slots
代替 v-slot
,且插槽需要是函數(shù)式組件
<!-- .vue --> <el-dialog v-model="configOpen" title="彈出框" append-to-body > <template #footer> <div class="dialog-footer"> <el-button @click="configOpen = false">取 消</el-button> </div> </template> </el-dialog> <!-- .jsx --> <el-dialog v-model={configOpen.value} title='彈出框' append-to-body v-slots={{ footer: () => ( <div class='dialog-footer'> <el-button onClick={() => { configOpen.value = false }} > 取 消 </el-button> </div> ) }} > <!-- ... --> </el-dialog>
到此這篇關(guān)于vue3中使用jsx開發(fā)的文章就介紹到這了,更多相關(guān)vue3使用jsx內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SyntaxError:?/xx.vue:?Unexpected?token,?expected?“,“錯(cuò)誤解
這篇文章主要為大家介紹了SyntaxError:?/xx.vue:?Unexpected?token,?expected?“,“錯(cuò)誤解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08vue?結(jié)合webpack的初級(jí)使用指南小白學(xué)習(xí)篇
這篇文章主要為大家介紹了vue?結(jié)合webpack的初級(jí)使用指南非常適合入門webpack的小白學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Vue動(dòng)態(tài)路由緩存不相互影響的解決辦法
這篇文章主要介紹了Vue動(dòng)態(tài)路由緩存不相互影響的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02element-ui中的clickoutside點(diǎn)擊空白隱藏元素
這篇文章主要為大家介紹了element-ui中的clickoutside點(diǎn)擊空白隱藏元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Vue自定義表單驗(yàn)證(rule,value,callback)使用詳解
這篇文章主要介紹了Vue自定義表單驗(yàn)證(rule,value,callback)使用詳解,今天我們講一講自定義驗(yàn)證規(guī)則具體使用場(chǎng)景和它的三個(gè)參數(shù)意思和使用,需要的朋友可以參考下2023-07-07vue使用$emit時(shí),父組件無法監(jiān)聽到子組件的事件實(shí)例
下面小編就為大家分享一篇vue使用$emit時(shí),父組件無法監(jiān)聽到子組件的事件實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02Vue.js獲取被選擇的option的value和text值方法
今天小編就為大家分享一篇Vue.js獲取被選擇的option的value和text值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08vue項(xiàng)目如何配置public靜態(tài)資源路徑訪問
這篇文章主要介紹了vue項(xiàng)目如何配置public靜態(tài)資源路徑訪問方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11