博客 / 詳情

返回

在Vue2和Vue3中JSX的使用集錦

Vue2安裝JSX支持

有時候,我們使用渲染函數(render function)來抽象組件,而渲染函數使用Vue的h函數來編寫Dom元素相對template語法差別較大,體驗不佳,這個時候就派 JSX 上場了。然而在Vue3中默認是帶了JSX支持的,而在 Vue2 中使用 JSX,需要安裝並使用 Babel 插件:

  • @vue/babel-preset-jsx
  • @vue/babel-helper-vue-jsx-merge-props

安裝腳本

npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props

配置.babelrc文件

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset',
    ['@vue/babel-preset-jsx',
      {
        'injectH': false
      }]
  ]
}

template和JSX的使用差異

針對方向

vue2中template語法和jsx語法差異

變量綁定

變量綁定由data中的數據由 v-model="value"變為 v-model={this.value}

template語法

<el-input v-model="value" />

JSX語法

<el-input v-model={this.value} />

事件綁定

變量綁定由data中的數據由 @input="inputChange"或v-on:input="inputChange"變為 onInput={this.inputChange}或on-input={this.inputChange}

template語法

<el-input v-model="value" @input="inputChange" v-on:click="inputClick" />

JSX語法

<el-input v-model={this.value} onInput={this.inputChange} on-click={this.inputClick} />

條件渲染

條件渲染由 v-if變為插入JSX 語句段

template語法

<el-input v-model="value" v-if="show" @input="inputChange" v-on:click="inputClick" />

JSX語法

{
    if(this.show){
        return <el-input v-model={this.value} onInput={this.inputChange} on-click={this.inputClick} />
    }
}

列表渲染

變量綁定由data中的數據由 v-for變為插入JSX 語句段

template語法

<el-select v-model={this.form.formula} clearable>
    <el-option
        v-for="item in options"
       :key="item.value"
       :label="item.label"
       :value="item.label">
      </el-option>
</el-select>

JSX語法

<el-select v-model={this.form.formula} clearable>
    {
        this.options.map(item =>{
            return (
                <el-option
                 key={item.value}
                 label={item.label}
                 value={item.value}>
                </el-option>
            )
        }
    
    }
</el-select>

插槽的使用

命名插槽

組件名稱:BaseLayout
template語法

<div class="container">
  <header>
     <!-- 具名插槽  -->
    <slot name="header"></slot>
  </header>
  <main>
      <!-- 匿名插槽  -->
    <slot></slot>
    <!-- 作用域插槽  -->
    <slot :main="mainData"></slot>
  </main>
  
  <footer>
      <!-- 具名插槽  -->
    <slot name="footer"></slot>
  </footer>
</div>

JSX語法
注意:$slots在Vue2.6版本起才支持,在之前使用的是$slotScopeds

<div class="container">
  <header>
    {
        //具名插槽
        this.$slots.header
    }
  </header>
  <main>
    {
        //匿名插槽
        this.$slots.default
    }
    {
        //作用域插槽
       () => this.$slots.main(this.mainData)
    }
  </main>
  <footer>
    {
        //具名插槽
        this.$slots.footer
    }
  </footer>
</div>

使用插槽

template語法

<base-layout>
  <template #header>
      <div>我是頭部</div>
  </template>
  <template #default>
      <div>匿名插槽</div>
  </template>
  <!-- vue2.6之後使用方式 -->
  <template #main="mainData">
      <div>作用域插槽:{{mainData}}</div>
  </template>
  <!-- vue2.6之前使用 -->
  <template slot="main" slot-scope="mainData">
      <div>作用域插槽:{{mainData}}</div>
  </template>
  <template #footer>
      <div>具名插槽</div>
  </template>
</base-layout>

JSX語法

 <!-- vue2.6之後使用方式 -->
<base-layout>
    {{
      default: () => <div>匿名插槽</div>,
      header: () => <div>我是頭部</div>,
      main: (mainData) => <div>作用域插槽:{mainData}</div>,
      footer: () => <div>具名插槽</div>
    }}
</base-layout>
<!-- vue2.6之前使用方式 -->
<base-layout
    slotScoped={{
      default: () => <div>匿名插槽</div>,
      header: () => <div>我是頭部</div>,
      main: (mainData) => <div>作用域插槽:{mainData}</div>,
      footer: () => <div>具名插槽</div>
    }}>    
</base-layout>

JSX中el-form

el-form需要綁定通過props={{ model:this.form}}來綁定form對象,不能使用model={this.form} ,否則就會出現報錯Invalid handler for event “input“: got undefined

render(h){
    return (
        <el-form
            ref="elForm"
            class="rule-form"
            props={{ model:this.form}} >
        </el-form>
    )
}
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.