如何在vue中使用jsx語法
為什麼需要在vue中使用jsx
幾年前面試的時候,被問過這個問題,當時我一臉懵,這兩個東西為啥要混用呢?
直到後來,我遇到瞭這種場景。
tab切換展示組件,大部分組件展示表格,除瞭2個tab需要展示不同,這個不同,怎麼處理呢?
-
當然可以直接改封裝的tab組件,v-if條件渲染嘛
-
那如果後面再有其他需求,tab組件繼續寫if麼
-
這個時候,組件就過於冗餘啦
-
那怎麼讓組件統一處理呢?當然可以用render函數來抽象組件啦
-
render函數寫法有多惡心,想必大傢都知道 => 不知道的看段簡單的ul,li佈局
with(this){ // this 就是 vm return _c( 'div', { attrs:{"id":"app"} }, [ _c( 'div', [ _c( 'input', { directives:[ { name:"model", rawName:"v-model", value:(title), expression:"title" } ], domProps:{ "value":(title) }, on:{ "input":function($event){ if($event.target.composing)return; title=$event.target.value } } } ), _v(" "), (!title) ? _c( 'button', { on:{ "click":add } }, [_v("submit")] ): _e() ] ), _v(" "), // 空字符串節點 _c('div', [ _c( 'ul', _l((list),function(item){return _c('li',[_v(_s(item))])}) ) ] ) ] ) }
-
這…日子沒法過瞭
-
於是我們就發現瞭jsx的好用,同樣上述代碼,可讀性更高,更加精簡
在vue中如何使用jsx
主要是依賴babel插件
- 安裝babel依賴,
npm install babel-plugin-transform-vue-jsx babel-helper-vue-jsx-merge-props
- 配置.babelrc文件
"plugins": [ [ "transform-vue-jsx" ] ]
- 子組件是函數式組件
// content.js export default { name: 'content', functional: true, props: { render: Function, column: { type: Object, default: null }, params: { type: Object, default: () => {} } }, render: (h, ctx) => { const params = ctx.props.params return ctx.props.render && ctx.props.render(h, params) } }
- 父組件引入
<el-tabs v-model="activeName"> <el-tab-pane v-for="item in tabList" :key="item.code" :label="item.label"> <span v-if="item.render"> <content :params="item.params" :render="item.render" ></content> </span> </el-tab-pane> </el-tabs> <script> import Content from './content' components: { Content }, </script>
template轉jsx的語法轉換
v-model
,v-if
,v-for
,v-html
,v-text
,vue中的指令
- jsx語法是不會有對應的指令的,所以我們就要實現這些指令的功能,對於
v-model
// 在vue中 <el-input v-model="searchParams.searchVal"> </el-input> // 對應jsx語法 function _input (value) { this.searchParams.searchVal = value }, item.render = (h, params) => { // 這裡也可以從params傳入參數 return ( <el-input value={this.searchParams.searchVal} onInput={_input}> </el-input> ) }
v-if
其實就是判斷語句,用&&或三元表達式
// 在vue中 <el-button v-if="show"></el-button> // 對應jsx語法 item.render = (h, params) => { return ( this.show && <el-button></el-button> ) }
v-for
其實就是循環語句,用map
// 在vue中 <ul> <li v-for="item in list">{{item.label}}</li> </ul> // jsx語法 item.render = (h, params) => { return ( <ul> { list.map((item, index) => ( <li>{item.label}</li> ) } </ul> ) }
v-html
item.render = (h, params) { return ( <div> <div domPropsInnerHTML={htmlStr}></div> </div> ) }
vue中el-input
組件上觸發原生enter事件,@keyup.enter.native
對應nativeOnKeyup
// 在vue中 <el-input @keyup.enter.native="onSearch" ></el-input> // 在jsx中 item.render = (h, params) => { function _keyup (e) { if (e.keyCode === 13) { // 13為enter鍵的鍵盤碼 this.onSearch() } } return ( <el-input nativeOnKeyup={e => _keyup(e)}> </el-input> ) }
vue中的插槽,在jsx中用scopedSlots
// 在vue中 <el-table :data="tableData"> <el-table-column v-for="column in columnData" :key="column.value" :prop="column.value" :label="column.value" sortable :sort-change="change"> <template slot-scope="scope"> <span>{{scope.row[column.value]}}</span> </template> </el-table-column> </el-table> // 在jsx中 item.render = (h, params) => { return ( <el-table data={tableData}> { columnData.map((column, index) => ( <el-table-column prop={column.value} label={column.label} sortable onSort-change={(...args) => sortChange(...args)} scopedSlots={{ default: (scope) => <span>{scope.row[column.value]}</span> }}> </el-table-column> )) } </el-table> ) }
組件用-
分隔的事件,在jsx中在第一段on後大寫即可觸發
比如el-table
的sort-change
,在jsx中是onSort-change
,第一段在on後大寫即可,見上個例子
到此這篇關於如何在vue中使用jsx語法的文章就介紹到這瞭,更多相關vue使用jsx語法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 關於el-table表格組件中插槽scope.row的使用方式
- vue+elementui實現動態添加行/可編輯的table
- vue中實現可編輯table及其中加入下拉選項
- vue中的slot-scope及scope.row用法
- 如何巧用Vue.extend繼承組件實現el-table雙擊可編輯(不使用v-if、v-else)