vue3使用jsx的方法

550 阅读2分钟

vue3使用jsx的方法

在 Vue 3 中,除了使用模板语法(<template>)编写组件外,还可以使用 JSX 来编写组件。JSX 是一种 JavaScript 的语法扩展,允许在 JavaScript 代码中直接编写类似 HTML 的结构。以下是 Vue 3 中使用 JSX 的详细方法。

  1. 为什么使用 JSX?
  • 灵活性:JSX 允许在 JavaScript 中直接编写 UI 结构,适合复杂的逻辑和动态渲染。

  • 一致性:对于熟悉 React 的开发者,JSX 提供了类似的开发体验。

  • 工具支持:现代构建工具(如 Vite、Webpack)和编辑器(如 VSCode)对 JSX 有良好的支持。

  1. 配置环境

Vue 3 默认支持 JSX,但需要确保项目中安装了正确的依赖和配置。

(1) 使用 Vite

Vite 默认支持 JSX,无需额外配置。

(2) 使用 Vue CLI

如果使用 Vue CLI 创建项目,需要安装 @vue/babel-plugin-jsx 插件:

npm install @vue/babel-plugin-jsx -D

然后在 babel.config.js 中配置:

module.exports = {
  presets: ['@vue/cli-plugin-babel/preset'],
  plugins: ['@vue/babel-plugin-jsx'],
};
  1. 基本用法

(1) 编写 JSX 组件

在 Vue 3 中,可以直接在 .vue 文件的 <script> 标签中使用 JSX,或者将组件完全写成 JSX 文件(.jsx.tsx)。

.vue 文件中使用 JSX

<script>
export default {
  setup() {
    const message = 'Hello, Vue 3 with JSX!';

    return () => (
      <div>
        <h1>{message}</h1>
      </div>
    );
  },
};
</script>

纯 JSX 文件(.jsx

import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
    const message = 'Hello, Vue 3 with JSX!';

    return () => (
      <div>
        <h1>{message}</h1>
      </div>
    );
  },
});

(2) 使用 Vue 指令

在 JSX 中,Vue 的指令(如 v-ifv-for 等)需要替换为 JavaScript 表达式。

  • v-if:使用三元运算符或逻辑与(&&)。

  • v-for:使用 Array.map

  • v-bind:直接使用 JSX 的属性绑定。

  • v-on:使用 on 前缀的事件绑定。

import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const showMessage = ref(true);
    const items = ref(['Apple', 'Banana', 'Cherry']);

    return () => (
      <div>
        {/* v-if */}
        {showMessage.value && <h1>Hello, Vue 3 with JSX!</h1>}

        {/* v-for */}
        <ul>
          {items.value.map((item, index) => (
            <li key={index}>{item}</li>
          ))}
        </ul>

        {/* v-bind */}
        <input type="text" placeholder="Enter something" />

        {/* v-on */}
        <button onClick={() => alert('Button clicked!')}>Click Me</button>
      </div>
    );
  },
});
  1. 使用插槽

在 JSX 中,插槽通过 slots 对象访问。

import { defineComponent } from 'vue';

export default defineComponent({
  setup(props, { slots }) {
    return () => (
      <div>
        <header>{slots.header?.()}</header>
        <main>{slots.default?.()}</main>
        <footer>{slots.footer?.()}</footer>
      </div>
    );
  },
});
  1. 使用组件

在 JSX 中,可以直接使用导入的组件。

import { defineComponent } from 'vue';
import MyComponent from './MyComponent.vue';

export default defineComponent({
  setup() {
    return () => (
      <div>
        <MyComponent message="Hello from parent!" />
      </div>
    );
  },
});
  1. 使用 TypeScript

如果使用 TypeScript,可以将文件扩展名改为 .tsx,并在 setup 函数中定义类型。

import { defineComponent } from 'vue';

interface Props {
  message: string;
}

export default defineComponent({
  props: {
    message: {
      type: String,
      required: true,
    },
  },
  setup(props: Props) {
    return () => (
      <div>
        <h1>{props.message}</h1>
      </div>
    );
  },
});
  1. 注意事项

工具支持:确保编辑器(如 VSCode)和构建工具(如 Vite、Webpack)支持 JSX。

性能:JSX 和模板语法在性能上没有显著差异,选择取决于团队偏好。

学习成本:对于不熟悉 JSX 的开发者,可能需要一定的学习成本。

  1. 总结

Vue 3 中支持使用 JSX 编写组件,适合需要灵活性和动态渲染的场景。通过配置构建工具和编写 JSX 代码,可以充分发挥 Vue 3 和 JSX 的优势,提升开发效率和代码可维护性。

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github