Table des matières
Introduction à JSX
在 Vue3 中使用 JSX
安装插件(@vitejs/plugin-vue-jsx)
新建 jsx 文件
语法
GitHub 源码
Maison interface Web Voir.js Explication détaillée de la façon d'utiliser JSX dans Vue3+Vite

Explication détaillée de la façon d'utiliser JSX dans Vue3+Vite

Dec 09, 2022 pm 08:27 PM
vue vue3 vite jsx

Comment utiliser JSX dans Vue+Vite ? L'article suivant vous présentera comment utiliser JSX dans Vue3+Vite. J'espère qu'il vous sera utile !

Explication détaillée de la façon d'utiliser JSX dans Vue3+Vite

【Recommandations associées : tutoriel vidéo vuejs, développement web front-end

Introduction à JSX

JSX (JavaScript et XML) est une extension de syntaxe de HTML-in-JavaScript, introduite pour la première fois dans Réagissez Entrée. JSX est un excellent moyen de décrire comment une interface utilisateur doit se comporter, essentiellement comment elle doit interagir. JSX est une extension de la syntaxe JavaScript, donc du code de type HTML peut coexister avec JS. Par exemple :

const button = <MyButton color="blue" shadowSize={2}>
  Click Me
</MyButton>
Copier après la connexion

La constante du bouton est appelée une expression JSX. Nous pouvons l'utiliser pour afficher la balise <MyButton> dans notre application. Les navigateurs ne peuvent pas lire et analyser JSX directement. L'expression JSX ressemble à ceci après avoir été compilée (avec des outils comme Babel ou Parcel) : <MyButton> 标签。浏览器是无法读取直接解析 JSX 的。JSX 表达式经过( Babel 或 Parcel 之类的工具)编译之后是这样的:

React.createElement(
  MyButton,
  {color: &#39;blue&#39;, shadowSize: 2},
  &#39;Click Me&#39;
)
Copier après la connexion

实际上,JSX 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖。可以使用 React.createElement() 自己编写 UI 来跳过编译步骤。但是,这样做会失去 JSX 的声明性优势,并且代码变得更难以阅读。编译是开发过程中的一个额外步骤,但是 React 社区中的许多开发人员都认为 JSX 的可读性值得。另外,流行的工具使 JSX-to-JavaScript 编译成为其设置过程的一部分。除非您愿意,否则不必自己配置编译。如果你想测试一些特定的 JSX 会转换成什么样的 JavaScript,你可以尝试使用 在线的 Babel 编译器

React 并不强制要求使用 JSX。当你不想在构建环境中配置有关 JSX 编译时,不在 React 中使用 JSX 会更加方便。例如,用 JSX 编写的代码:

class Hello extends React.Component {
  render() {
    return <div>Hello {this.props.toWhat}</div>;
  }
}

const root = ReactDOM.createRoot(document.getElementById(&#39;root&#39;));
root.render(<Hello toWhat="World" />);
Copier après la connexion

可以编写为不使用 JSX 的代码:

class Hello extends React.Component {
  render() {
    return React.createElement(&#39;div&#39;, null, `Hello ${this.props.toWhat}`);
  }
}

const root = ReactDOM.createRoot(document.getElementById(&#39;root&#39;));
root.render(React.createElement(Hello, {toWhat: &#39;World&#39;}, null));
Copier après la connexion

在 Vue3 中使用 JSX

Vue 使用单文件组件,把 template 模板、相关脚本和 CSS 一起整合放在 .vue 结尾的一个单文件中。这些文件最终会通过 JS 打包或构建工具(例如 Webpack、Vite)处理。

<template> 元素包含了所有的标记结构和组件的展示逻辑。template 可以包含任何合法的 HTML,以及 Vue 特定的语法。通过设置 <template> 标签的 lang 属性,例如可以通过设置 <template lang="pug"> 就可以在使用 Pug 模板来替代标准 HTML。

而 .vue 文件中的 <script> 标签包含组件中所有的非显示逻辑,并且需要默认导出一个 JS 对象。该对象是在本地注册组件、定义属性、处理本地状态、定义方法等的地方。在构建阶段这个包含了 template 模板的对象会被处理和转换成为一个有 render() 函数的 Vue 组件。

组件的 CSS 样式写在 <style> 标签里,如果添加了 scoped 属性,Vue 会把样式的范围限制到单文件组件的内容里。这是类似于 CSS-in-JS 的解决方案,只不过允许书写纯粹的 CSS。如果通过 CLI 创建项目时选择了 CSS 预处理器,则可以将 lang 属性添加到 <style>

npm i @vitejs/plugin-vue-jsx -D
Copier après la connexion
Copier après la connexion

En fait, JSX n'est que du sucre syntaxique pour la fonction React.createElement(component, props, ...children). Vous pouvez ignorer l'étape de compilation en écrivant vous-même l'interface utilisateur à l'aide de React.createElement(). Cependant, cela perd les avantages déclaratifs de JSX et le code devient plus difficile à lire. La compilation est une étape supplémentaire dans le processus de développement, mais de nombreux développeurs de la communauté React pensent que la lisibilité de JSX en vaut la peine. De plus, les outils populaires intègrent la compilation JSX vers JavaScript dans leur processus de configuration. Vous n'êtes pas obligé de configurer la compilation vous-même, sauf si vous le souhaitez. Si vous souhaitez tester dans quel type de JavaScript un JSX spécifique sera converti, vous pouvez essayer d'utiliser Compilateur Babel en ligne
.

React ne nécessite pas l'utilisation de JSX. Ne pas utiliser JSX dans React est plus pratique lorsque vous ne souhaitez pas configurer la compilation JSX dans votre environnement de build. Par exemple, le code écrit en JSX :

import vueJsx from "@vitejs/plugin-vue-jsx";

export default defineConfig({
  plugins: [
    vueJsx(),
  ]
})
Copier après la connexion
Copier après la connexion

peut être écrit sous forme de code sans JSX : 🎜
import HelloWorld from &#39;./HelloWorld.vue&#39;
export default {
  setup() {
    return () => <HelloWorld msg="11" />;
  },
};
Copier après la connexion
Copier après la connexion

🎜Utilisation de JSX dans Vue3🎜🎜🎜Vue utilise des composants de fichier unique, mettez le modèle le modèle, les scripts associés et le CSS sont intégrés dans un seul fichier se terminant par .vue. Ces fichiers sont finalement traités par des outils de packaging ou de build JS (par exemple Webpack, Vite). L'élément 🎜
🎜<template> contient toute la structure de balisage et la logique d'affichage des composants. Le modèle peut contenir n'importe quel HTML valide, ainsi qu'une syntaxe spécifique à Vue. En définissant l'attribut lang de la balise <template>, par exemple, vous pouvez l'utiliser en définissant <template lang="pug">< /code> Modèles Pug pour remplacer le HTML standard. 🎜🎜La balise <script> dans le fichier .vue contient toute la logique de non-affichage du composant et doit exporter un objet JS par défaut. Cet objet est l'endroit où les composants sont enregistrés localement, les propriétés sont définies, l'état local est géré, les méthodes sont définies, etc. Pendant la phase de construction, cet objet contenant le modèle sera traité et converti en un composant Vue avec une fonction render(). 🎜🎜Le style CSS du composant est écrit dans la balise <style> Si l'attribut scoped est ajouté, Vue limitera la portée du style au contenu. du composant mono-fichier. Il s'agit d'une solution similaire à CSS-in-JS, mais qui permet d'écrire du CSS pur. Si vous avez sélectionné le préprocesseur CSS lors de la création de votre projet via la CLI, vous pouvez ajouter l'attribut lang à la balise <style> afin que Webpack puisse traiter le contenu lors de la construction. temps. 🎜🎜🎜Bien que jsx ait été introduit pour la première fois par React, en fait, la syntaxe JSX ne définit pas la sémantique d'exécution et peut être compilée sous diverses formes de sortie. Si vous avez déjà utilisé la syntaxe JSX, veuillez noter que la méthode de compilation JSX de 🎜Vue est différente de la méthode de compilation JSX dans React🎜, vous ne pouvez donc pas utiliser la compilation JSX de React dans les applications Vue. Certaines différences notables par rapport à la syntaxe React JSX incluent : 🎜

Vue 的类型定义也提供了 TSX 语法的类型推导支持。当使用 TSX 语法时,确保在 tsconfig.json 中配置了 "jsx": "preserve",这样的 TypeScript 就能保证 Vue JSX 语法编译过程中的完整性。

安装插件(@vitejs/plugin-vue-jsx)

vite 官方提供了官方的插件来支持在 vue3 中使用 jsx/tsx,直接安装就行。

npm i @vitejs/plugin-vue-jsx -D
Copier après la connexion
Copier après la connexion

安装完之后在 vite.config.js 文件中的 plugins 字段中添加 jsx 支持:

import vueJsx from "@vitejs/plugin-vue-jsx";

export default defineConfig({
  plugins: [
    vueJsx(),
  ]
})
Copier après la connexion
Copier après la connexion

这样就可以在项目中使用 jsx/tsx 了。

新建 jsx 文件

在项目中新建 jsx 或 tsx 后缀的文件,语法和 js 文件类似,但是和 .vue 文件中的 <script> 标签一样需要默认导出一个 JS 对象。该对象是在本地注册组件、定义属性、处理本地状态、定义方法等的地方。

import HelloWorld from &#39;./HelloWorld.vue&#39;
export default {
  setup() {
    return () => <HelloWorld msg="11" />;
  },
};
Copier après la connexion
Copier après la connexion

语法

1、插值。与 vue 模板语法中的插值一样,但是双大括号 {{}} 变为了单大括号 {}。大括号内支持任何有效的 JavaScript 表达式,比如:2 + 2,user.firstName,formatName(user) 等。

// 模板语法
<span>{{ a + b }}</span>

// jsx/tsx
<span>{ a + b }</span>
Copier après la connexion

2、class 类名绑定。有两种方式,使用模板字符串或者使用数组。

// 模板字符串
<div className={ `header ${ isBg ? &#39;headerBg&#39; : &#39;&#39; }` }>header</div>
// 数组
<div class={ [ &#39;header&#39;, isBg && &#39;headerBg&#39; ] } >header</div>
Copier après la connexion

3、style 样式绑定。需要使用双大括号。

const color = &#39;red&#39;
const element = <sapn style={{ color, fontSize: &#39;16px&#39; }}>style</sapn>
Copier après la connexion

4、条件渲染。由于 jsx 本身具有 js 语法,所以不再需要使用 v-if 指令,使用 if/else 和三元表达式都可以实现。但是支持 v-show 指令。

const element = (name) => {
  if (name) {
    return <h1>Hello, { name }</h1>
  } else {
    return <h1>Hello, Stranger</h1>
  }
}

const element = icon ? <span class="icon"></span> : null;
// 以上代码等效于:
const element = icon && <span class="icon"></span>;
Copier après la connexion

5、列表渲染。同样,由于 jsx 本身具有 js 语法,所以不再需要使用 v-for 指令,使用 JS 数组的 map 方法即可。

const listData = [
   {name: &#39;Tom&#39;, age: 18},
   {name: &#39;Jim&#39;, age: 20},
   {name: &#39;Lucy&#39;, age: 16}
]
return () => (
   <div>
     <div class={&#39;box&#39;}>
       <span>姓名</span>
       <span>年龄</span>
     </div>
   {
   prop.listData.map(item => <div class={&#39;box&#39;}>
       <span>{item.name}</span>
       <span>{item.age}</span>
     </div>
     })
   </div>
)
Copier après la connexion

6、标签属性绑定。也是使用大括号包裹,不能使用 v-bind 指令。而 vue 组件中通过 <div v-bind="properties"></div> 批量绑定标签属性,在 JSX 中需要使用 <div {...properties}></div>

const href = &#39;https://cn.vuejs.org/&#39;
const element = <a href={href}>Vue3</a>
Copier après la connexion

7、事件绑定。使用的也是 单大括号 {},不过事件绑定不是以 @为前缀了,而是改成了 on,与原生相同。例如:click 事件是 onClick 或 onclick。

const confirm = () => {
  // 确认提交
}
<button onClick={confirm}>确定</button>
Copier après la connexion

如果要带参数,需要使用箭头函数进行包裹:

const confirm = (name) => {
  // 确认提交
}
<button onClick={() => confirm(&#39;Are you sure&#39;)}>确定</button>
Copier après la connexion

8、事件修饰符。需要使用 withModifiers 方法,接收两个参数,第一个参数是绑定的事件,第二个参数是需要使用的事件修饰符。

import { withModifiers, defineComponent, ref } from &#39;vue&#39;

const App = defineComponent({
  setup() {
    const count = ref(0);

    const inc = () => {
      count.value++;
    };

    return () => (
      <div onClick={ withModifiers(inc, [&#39;self&#39;]) }>{ count.value }</div>
    );
  },
})
export default App
Copier après la connexion

注意:Vue 模板中 ref 变量是可以直接解构的,但是在 jsx 中不行,需要添加 .value,比如上面的 { count.value }。

9、v-model 双向绑定。需要使用单大括号 {}。如果绑定属性则需要一个数组,第一个元素为绑定的值,第二个元素为绑定的属性。

// 绑定值
<input v-model="show" /> // vue
<input v-model={show.value} /> // jsx

// 绑定属性
<input v-model:prop="show" /> // vue
<input v-model={[show.value,&#39;prop&#39;]} /> // jsx

// 修饰符写法
<input v-model:prop.trim="show" /> // vue
<input v-model={[show.value,&#39;prop&#39;,[&#39;trim&#39;]]} /> // jsx
Copier après la connexion

10、slot 插槽。jsx/tsx 中无法使用 slot 标签,定义插槽方式一:通过 setup 函数的第一个参数 ctx 上下文对象的 slots 的属性,setup 函数默认接收两个参数:

  • props - 组件传入的参数对象。
  • ctx - 上下文对象,上下文对象暴露了其他一些在 setup 中可能会用到的值,包括:
    • attrs - 透传的 Attributes(非响应式的对象,等价于 $attrs)。
    • slots - 插槽(非响应式的对象,等价于 $slots)。
    • emit - 触发事件的函数(等价于 $emit)。
    • expose - 暴露公共属性的函数。

如果解构了 props 对象,解构出的变量将会丢失响应性,因此推荐通过 props.xxx 的形式来使用其中的 props。如果确实需要解构 props 对象,或者需要将某个 prop 传到一个外部函数中并保持响应性,可以使用 toRefs()toRef() 这两个工具函数:

import { toRefs, toRef } from &#39;vue&#39;

export default {
  setup(props) {
    // 将 `props` 转为一个其中全是 ref 的对象,然后解构
    const { title } = toRefs(props)
    // `title` 是一个追踪着 `props.title` 的 ref
    console.log(title.value)

    // 或者,将 `props` 的单个属性转为一个 ref
    const title = toRef(props, &#39;title&#39;)
  }
}
Copier après la connexion

ctx 上下文对象是非响应式的,可以安全地解构:

export default {
  setup(props, { attrs, slots, emit, expose }) {
    ...
  }
}
Copier après la connexion

attrs 和 slots 都是响应式(有状态)的对象,它们总是会随着组件自身的更新而更新。这意味着你应当避免解构它们,并始终通过 attrs.x 或 slots.x 的形式使用其中的属性。此外,和 props 不同,attrs 和 slots 的属性都不是响应式的。如果想要基于 attrs 或 slots 的改变来执行副作用,那么应该在 onBeforeUpdate 生命周期钩子中编写相关逻辑。

expose 函数用于显式地限制该组件暴露出的属性,当父组件通过模板引用访问该组件的实例时,将仅能访问 expose 函数暴露出的内容:

export default {
  setup(props, { expose }) {
    // 让组件实例处于 “关闭状态”
    // 即不向父组件暴露任何东西
    expose()

    const publicCount = ref(0)
    const privateCount = ref(0)
    // 有选择地暴露局部状态
    expose({ count: publicCount })
  }
}
Copier après la connexion

通过 ctx 上下文对象的 slots 的属性可以获取插槽对象后,就可以定义插槽了。

import { defineComponent } from &#39;vue&#39;

export default defineComponent({
  setup(props, { slots }) { // 逻辑
    return () => {
      return <p>
     <button>{ slots.test?.() }</button>
     <button>{ slots.default?.() }</button>
     </p>
    }
  },
})

// 在引用的组件中
<template #test>slot-test</template>
<template #>slot-default</template>
Copier après la connexion

定义插槽方式二:使用 renderSlot 函数。

import { renderSlot } from &#39;vue&#39;

<button>
  { renderSlot(slots, &#39;default&#39;) }
</button>
Copier après la connexion

而如果在 jsx 中使用插槽,可以直接通过标签属性 slot,或通过 v-slots 指令。

import HelloWorld from &#39;./HelloWorld&#39;  
export default defineComponent({  
    setup() {  
        return () => (  
            <div class={&#39;box&#39;}>  
                <HelloWorld v-slots={{  
                    title: () => {  
                        return <p>我是title插槽</p>  
                    },  
                    default: () => {  
                        return <p>我是default插槽</p>  
                    }  
                }} />  
            </div>  
        )  
    }  
})
Copier après la connexion

11、CSS Modules。引入局部样式,相当于 vue 组件中 <style> 标签的 scoped 属性。

import styles from &#39;./index.module.scss&#39;

<div class={styles.wrap}></div>
Copier après la connexion

GitHub 源码

(学习视频分享:vuejs入门教程编程基础视频

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment référencer le fichier JS avec Vue.js Comment référencer le fichier JS avec Vue.js Apr 07, 2025 pm 11:27 PM

Il existe trois façons de se référer aux fichiers JS dans Vue.js: spécifiez directement le chemin à l'aide du & lt; script & gt; étiqueter;; importation dynamique à l'aide du crochet de cycle de vie monté (); et l'importation via la bibliothèque de gestion de l'État Vuex.

Comment ajouter des fonctions aux boutons pour Vue Comment ajouter des fonctions aux boutons pour Vue Apr 08, 2025 am 08:51 AM

Vous pouvez ajouter une fonction au bouton VUE en liant le bouton dans le modèle HTML à une méthode. Définissez la logique de la fonction de méthode et d'écriture dans l'instance Vue.

Comment utiliser Watch in Vue Comment utiliser Watch in Vue Apr 07, 2025 pm 11:36 PM

L'option Watch dans Vue.js permet aux développeurs d'écouter des modifications de données spécifiques. Lorsque les données changent, regardez déclenche une fonction de rappel pour effectuer des vues de mise à jour ou d'autres tâches. Ses options de configuration incluent immédiatement, qui spécifie s'il faut exécuter un rappel immédiatement, et profond, ce qui spécifie s'il faut écouter récursivement les modifications des objets ou des tableaux.

Comment utiliser Bootstrap en Vue Comment utiliser Bootstrap en Vue Apr 07, 2025 pm 11:33 PM

L'utilisation de bootstrap dans vue.js est divisée en cinq étapes: installer bootstrap. Importer un bootstrap dans main.js. Utilisez le composant bootstrap directement dans le modèle. Facultatif: style personnalisé. Facultatif: utilisez des plug-ins.

Vue réalise l'effet de défilement de chapiteau / texte Vue réalise l'effet de défilement de chapiteau / texte Apr 07, 2025 pm 10:51 PM

Implémentez les effets de défilement marquee / texte dans VUE, en utilisant des animations CSS ou des bibliothèques tierces. Cet article présente comment utiliser l'animation CSS: créer du texte de défilement et envelopper du texte avec & lt; div & gt;. Définissez les animations CSS et défini: caché, largeur et animation. Définissez les images clés, Set Transforment: Translatex () au début et à la fin de l'animation. Ajustez les propriétés d'animation telles que la durée, la vitesse de défilement et la direction.

Comment revenir à la page précédente par Vue Comment revenir à la page précédente par Vue Apr 07, 2025 pm 11:30 PM

Vue.js dispose de quatre méthodes pour revenir à la page précédente: $ router.go (-1) $ router.back () utilise & lt; router-link to = & quot; / & quot; Composant Window.History.back (), et la sélection de la méthode dépend de la scène.

Comment interroger la version de Vue Comment interroger la version de Vue Apr 07, 2025 pm 11:24 PM

Vous pouvez interroger la version Vue en utilisant Vue Devtools pour afficher l'onglet Vue dans la console du navigateur. Utilisez NPM pour exécuter la commande "NPM List -g Vue". Recherchez l'élément VUE dans l'objet "dépendances" du fichier package.json. Pour les projets Vue CLI, exécutez la commande "Vue --version". Vérifiez les informations de la version dans le & lt; script & gt; Tag dans le fichier html qui fait référence au fichier VUE.

Comment utiliser Vue Traversal Comment utiliser Vue Traversal Apr 07, 2025 pm 11:48 PM

Il existe trois méthodes courantes pour que Vue.js traverse les tableaux et les objets: la directive V-FOR est utilisée pour traverser chaque élément et les modèles de rendu; La directive V-Bind peut être utilisée avec V-FOR pour définir dynamiquement les valeurs d'attribut pour chaque élément; et la méthode .map peut convertir les éléments du tableau en nouveaux tableaux.

See all articles