关于前端:在Vue2中JSX的使用集锦

30次阅读

共计 2673 个字符,预计需要花费 7 分钟才能阅读完成。

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 的应用差别

针对方向

变量绑定

变量绑定由 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 语法
留神:&dollar;slots 在 Vue2.6 版本起才反对,在之前应用的是 &dollar;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 语法

<base-layout>
    {{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>
    )
}

正文完
 0