【搬运】jsx在Vue中的使用(英文原版)

本文介绍了一个可配置的 Babel 预设,用于添加 Vue JSX 支持。包括安装方法、语法示例,如动态内容、指令、组件等,并展示了如何将箭头函数转换为功能性组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Babel Preset JSX

原文地址:github.com/vuejs/jsx/b…

Configurable Babel preset to add Vue JSX support. See the configuration options here.

Installation

Install the preset with:

npm install @vue/babel-preset-jsx @vue/babel-helper-vue-jsx-merge-props
复制代码

Then add the preset to .babelrc:

{
  "presets": ["@vue/babel-preset-jsx"]
}
复制代码

Syntax

Content

render() {
  return <p>hello</p>
}
复制代码

with dynamic content:

render() {
  return <p>hello { this.message }</p>
}
复制代码

when self-closing:

render() {
  return <input />
}
复制代码

with a component:

import MyComponent from './my-component'

export default {
  render() {
    return <MyComponent>hello</MyComponent>
  }
}
复制代码

Attributes/Props

render() {
  return <input type="email" />
}
复制代码

with a dynamic binding:

render() {
  return <input
    type="email"
    placeholder={this.placeholderText}
  />
}
复制代码

with the spread operator (object needs to be compatible with Vue Data Object):

render() {
  const inputAttrs = {
    type: 'email',
    placeholder: 'Enter your email'
  }

  return <input {...{ attrs: inputAttrs }} />
}
复制代码

Directives

<input vModel="newTodoText" />
复制代码

with a modifier:

<input vModel_trim="newTodoText" />
复制代码

with an argument:

<input vOn:click="newTodoText" />
复制代码

with an argument and modifiers:

<input vOn:click_stop_prevent="newTodoText" />
复制代码

Functional Components

Transpiles arrow functions that return JSX into functional components, when they are either default exports:

export default ({ props }) => <p>hello { props.message }</p>
复制代码

or PascalCase variable declarations:

const HelloWorld = ({ props }) => <p>hello { props.message }</p>
复制代码

Compatibility

This repo is only compatible with:

转载于:https://juejin.im/post/5c9b27e0e51d4566a5566ad7

<think>好的,我现在需要回答用户在Vue项目中使用JSX的场景和应用案例的问题。首先,我需要回忆一下VueJSX的基本概念。JSX是一种JavaScript的语法扩展,允许在JavaScript代码中编写类似HTML的结构。在Vue中,通常使用单文件组件(SFC)和模板语法,但JSX提供了更大的灵活性。 接下来,我要结合用户提供的引用内容来整理答案。用户提供的引用[1]提到create-vueVue CLI都支持JSX,需要配置Babel插件。引用[2]和[4]则涉及具体的配置方法,比如在vite.config.js中添加插件和在babel.config.js中配置预设。引用[3]展示了JSX中处理作用域插槽的例子。 首先,应用场景可能包括动态组件、复杂逻辑处理、高阶组件等。比如,当需要根据条件动态生成组件结构时,JSX比模板更灵活。案例方面,可以举动态渲染、作用域插槽、自定义组件等例子。 然后需要考虑用户可能的疑问,比如JSX和模板语法的选择标准。根据Vue官方文档,模板适合大多数场景,而JSX适合需要更强大JavaScript能力的情况。同时,需要提到配置JSX的方法,如安装Babel插件,这在引用[1]和[4]中有说明。 还要注意正确引用用户提供的资料,比如在讨论配置时引用[2]和[4],在处理插槽时引用[3]。确保每个引用都自然融入回答中,避免生硬。 最后,生成相关问题,可能涉及JSX的优势、配置方法、性能比较等。需要确保问题与用户的问题相关,并引导进一步学习。</think>在Vue项目中使用JSX的场景主要出现在需要更灵活的模板逻辑控制或复杂组件交互时。以下是具体应用场景和案例说明: ### 一、JSXVue中的核心应用场景 1. **动态组件结构** 当需要根据运行时条件动态生成复杂嵌套组件时,JSXJavaScript表达能力优于模板语法。例如: ```jsx render() { return ( <div> {this.showHeader ? <Header/> : null} {this.items.map(item => ( <Item key={item.id} data={item}/> ))} </div> ) } ``` 2. **高阶组件(HOC)开发** [^1] 通过JSX可以更方便地创建包裹组件: ```jsx const withLoading = (WrappedComponent) => { return { props: WrappedComponent.props, render() { return ( <div class="wrapper"> {this.isLoading ? <Spinner/> : <WrappedComponent {...this.$props}/>} </div> ) } } } ``` 3. **复杂作用域插槽** [^3] 在渲染函数中处理插槽内容更直观: ```jsx render() { return ( <div> {this.$scopedSlots.default({ isActive: this.internalState })} </div> ) } ``` ### 二、典型应用案例 1. **可视化编辑器** 动态生成表单配置界面时,JSX可以配合递归组件实现动态渲染: ```jsx renderField(field) { return ( <field-wrapper> {field.type === 'input' ? ( <input vModel={this.formData[field.name]}/> ) : field.type === 'select' ? ( <select options={field.options}/> ) : null} </field-wrapper> ) } ``` 2. **自定义渲染器** 需要创建自定义渲染逻辑时(如Canvas/SVG渲染),JSX提供结构化编写方式: ```jsx renderCanvas() { return ( <Canvas> {this.shapes.map(shape => ( <Shape type={shape.type} position={shape.pos}/> ))} </Canvas> ) } ``` ### 三、配置要点 1. **环境配置** [^2][^4] 在Vite项目中需安装`@vitejs/plugin-vue-jsx`: ```javascript // vite.config.js import jsx from '@vitejs/plugin-vue-jsx' export default defineConfig({ plugins: [vue(), jsx()] }) ``` 2. **Babel预设** [^1] ```javascript // babel.config.js module.exports = { presets: ['@vue/babel-preset-jsx'] } ``` ### 四、选择建议 - **优先模板语法**:简单展示型组件 - **推荐JSX**:存在复杂条件判断、循环嵌套、需要JavaScript完整表达能力的场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值