So verwenden Sie jsx/tsx in Vue3
JSX So verwenden Sie
Hier nehmen wir das Vite-Projekt als Beispiel. Um JSX im Projekt zu verwenden, müssen wir ein Plug-in @vitejs/plugin-vue installieren -jsx
, dieses Plug-in ermöglicht uns die Verwendung von JSX/TSX im Projekt@vitejs/plugin-vue-jsx
,这个插件可以让我们在项目中使用 JSX/TSX
npm i @vitejs/plugin-vue-jsx -D
安装完成之后在vite.config.ts
进行一个配置即可
import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; import vueJsx from "@vitejs/plugin-vue-jsx"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue(), vueJsx()], });
接下来我们看一下如何使用 JXS?
首先第一种方式就是在.vue
文件中使用,需要将 script 中的 lang 设置为tsx
,在 setup 函数中返回模板
<script lang="tsx"> import { defineComponent } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { return () => <div>Hello World</div>; }, }); </script>
或者将.vue
改成.tsx
,注意:如果后缀为.tsx
,需要将引入到这个组件的路径后缀去掉
import { defineComponent } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { return () => <div>Hello World</div>; }, });
//main.ts中引入 import { createApp } from "vue"; import "./style.css"; import App from "./App"; createApp(App).mount("#app");
此时页面上就会展示一个Hello World
第二种方式是函数式组件,因为函数式组件里没有 this 引用,所以 Vue 把 props 当作第一个参数传入,第二个参数 ctx 包含三个属性:attrs、emit 和 slots。它们分别相当于组件实例的 attrs、attrs、attrs、emit 和 $slots 这几个属性。
//App.tsx export default (props, ctx) => <div>Hello World</div>;
到这里我们不难发现,TSX 相比于 SFC 有一个特点,那就是它可以在一个文件中定义多个组件模板,比如
const Component1 = () => <div>Component1</div>; const Component2 = () => <div>Component2</div>; export default () => ( <div> <Component1 /> <Component2 /> </div> );
此时页面中便出现了我们定义的两个组件
接下来我们来看一下 JSX 在 vue 中的具体用法
插值
在 SFC 中使用插值的时候我们可以使用{{}}
进行包裹,而在 JSX 中是使用{}
进行包裹,例如
import { defineComponent, ref } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { const text = ref("Hello World"); return () => <div>{text.value}</div>; }, });
这里需要注意的是在 SFC 模板中是不需要加.value
的,但是 JSX 模板中则需要加.value
条件渲染(v-if)
在 SFC 中我们可以使用v-if
进行条件渲染,如
<div> <div v-if="showyes">yes</div> <span v-else>no</span> </div>
而在 JSX 中则没有了v-if
,而是采用更接近原生的写法
import { defineComponent, ref } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { const showyes = ref(true); return () => <div>{showyes.value ? <div>yes</div> : <div>no</div>}</div>; }, });
除了v-if
,大家可能还会想到另一个条件渲染方式v-show
,JSX 中是支持使用v-show
的
import { defineComponent, ref } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { const showyes = ref(true); return () => ( <div> <div v-show={showyes.value}>yes</div> <div v-show={!showyes.value}>no</div> </div> ); }, });
列表循环(v-for)
在 SFC 中我们经常使用v-for
进行列表循环渲染,如
<ul> <li v-for="{ index, item } in list" :key="index">{{ item }}</li> </ul>
而在 JSX 中我们则需要改成使用 map 进行列表循环渲染
import { defineComponent, ref } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { const list = ref(["one", "two", "three"]); return () => ( <div> {list.value.map((item, index) => ( <div key={index}>{item}</div> ))} </div> ); }, });
注意,JSX 中列表循环也是要加 key 的
事件绑定
事件绑定其实 JSX 与 SFC 就是写法上的区别,以click
为例,在 SFC 中使用@click
或者v-on:click
进行事件绑定,在 JSX 中则使用onClick
进行事件绑定
import { defineComponent, ref } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { return () => ( <div onClick={() => { console.log("我被点击"); }} > 点击 </div> ); }, });
这里需要注意绑定的函数要使用箭头函数
事件修饰符
事件修饰符可以使用 vue 提供的withModifiers
进行设置,如.self
import { defineComponent, ref, withModifiers } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { return () => ( <div onClick={withModifiers(() => { console.log("我被点击"); }, ["self"])} > 点击 </div> ); }, });
但是对于 .passive、.capture 和 .once 事件修饰符,使用withModifiers
并不生效,这里可以采用链式驼峰的形式进行设置,不如.once
import { defineComponent } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { return () => ( <div onClickOnce={() => { console.log("我被点击"); }} > 点击 </div> ); }, });
v-model
v-model 在绑定modelValue
或者在input
标签中使用的时候其实和 SFC 差不多
import { defineComponent, ref } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { const num = ref(0); return () => <input type="text" v-model={num.value} />; }, });
当在组件中使用绑定自定义事件的时候和 SFC 就有了区别,比如绑定一个msg
,在 SFC 中直接v-model:msg
即可,而在 JSX 中则需要使用一个数组。我们直接看下面两个例子你就会明白,假如我们组件名叫ea_button
,这个组件发送了一个update:changeMsg
的方法,父组件的msg
变量需要接受update:changeMsg
函数传来的参数
SFC:
<ea-button v-model:changeMsg="msg"></ea-button>
JSX:
<ea-button v-model={[msg.value, 'changeMsg']}></ea-button>
插槽
先看下默认插槽,我们定义一个子组件 Child 接收一个默认插槽
import { defineComponent, ref } from "vue"; const Child = (props, { slots }) => { return <div>{slots.default()}</div>; }; export default defineComponent({ name: "app", setup(props, ctx) { const num = ref(0); return () => <Child>默认插槽</Child>; }, });
如果想使用具名插槽则需要在父组件中传入一个对象,对象的 key 值就是插槽的名字
import { defineComponent, ref } from "vue"; //@ts-ignore const Child = (props, { slots }) => { return ( <div> <div>{slots.slotOne()}</div> <div>{slots.slotTwo()}</div> <div>{slots.slotThree()}</div> </div> ); }; export default defineComponent({ name: "app", setup(props, ctx) { const num = ref(0); return () => ( <Child> {{ slotOne: () => <div>插槽1</div>, slotTwo: () => <div>插槽2</div>, slotThree: () => <div>插槽3</div>, }} </Child> ); }, });
如果我们想在父组件的插槽内容中获取到子组件中的变量,此时便涉及到了作用域插槽。在 JSX 中我们可以在子组件调用默认插槽或者某个具名插槽的时候传入参数,如下面的插槽一为例
import { defineComponent, ref } from "vue"; //@ts-ignore const Child = (props, { slots }) => { const prama1 = "插槽1"; return ( <div> <div>{slots.slotOne(prama1)}</div> <div>{slots.slotTwo()}</div> <div>{slots.slotThree()}</div> </div> ); }; export default defineComponent({ name: "app", setup(props, ctx) { return () => ( <Child> {{ slotOne: (pramas: string) => <div>{pramas}</div>, slotTwo: <div>插槽2</div>, slotThree: <div>插槽3</div>, }} </Child> ); }, });
我们可以看到prama1=插槽1
是子组件中的变量,我们通过slots.slotOne(prama1)
npm i @vitejs/plugin-vue-jsx -D#🎜🎜##🎜🎜#Nachdem die Installation abgeschlossen ist, nehmen Sie einfach eine Konfiguration in
vite.config.ts
vor. #🎜🎜#rrreee#🎜🎜#Als nächstes werfen wir einen Blick auf die Verwendung von JXS?#🎜🎜 ##🎜🎜#Zunächst einmal ist der erste Weg: Bei Verwendung in der Datei .vue
müssen Sie die Sprache im Skript auf tsx
setzen und die zurückgeben template #🎜🎜#rrreee#🎜🎜# in der Setup-Funktion oder ändern Sie .vue
in .tsx
. Hinweis: Wenn das Suffix ist. tsx
, das für diese Komponente eingeführte Pfadsuffix muss entfernt werden #🎜🎜#rrreeerrreee# 🎜🎜#Zu diesem Zeitpunkt wird ein Hello World
auf der Seite angezeigt#🎜🎜# #🎜🎜#Der zweite Weg sind funktionale Komponenten, da diese Referenz in funktionalen Komponenten nicht vorhanden ist, sodass Vue verwendet props Als erster Parameter übergeben, enthält der zweite Parameter ctx drei Attribute: attrs, emit und slots. Sie entsprechen jeweils den Attributen attrs, attrs, attrs, emit und $slots der Komponenteninstanz. #🎜🎜#rrreee#🎜🎜#An diesem Punkt ist es nicht schwer zu erkennen, dass TSX im Vergleich zu SFC über eine Funktion verfügt, das heißt, es kann mehrere Komponentenvorlagen in einer Datei definieren, wie z. B. #🎜🎜#rrreee#🎜🎜 #This Die beiden von uns definierten Komponenten erscheinen auf der Seite #🎜🎜##🎜🎜#
{{}}
zum Umbrechen verwenden, während wir in JSX {}
zum Umbrechen verwenden, z. B. #🎜🎜#rrreee# 🎜🎜 #Hier ist zu beachten, dass es nicht erforderlich ist, .value
in der SFC-Vorlage hinzuzufügen, Sie müssen jedoch .value
in der JSX-Vorlage hinzufügen#🎜🎜## 🎜🎜 #Bedingtes Rendern (v-if)#🎜🎜##🎜🎜#In SFC können wir v-if
für bedingtes Rendern verwenden, wie zum Beispiel #🎜🎜#rrreee#🎜🎜#Und in JSX Dann gibt es kein v-if
, sondern eine Schreibmethode, die näher am Original ist #🎜🎜#rrreee#🎜🎜#Zusätzlich zu v-if
, Sie Denken Sie vielleicht auch an eine andere bedingte Rendering-Methode v-show
, JSX unterstützt die Verwendung von v-show
#🎜🎜#rrreee#🎜🎜#List-Schleife (v-for )#🎜🎜# #🎜🎜#In SFC verwenden wir häufig v-for
für das Rendern von Listenschleifen, z. B. #🎜🎜#rrreee#🎜🎜#In JSX müssen wir ändern, um Map for zu verwenden Listenschleifen-Rendering #🎜🎜#rrreee#🎜🎜#Beachten Sie, dass die Listenschleife in JSX auch verschlüsselt werden muss#🎜🎜##🎜🎜#Ereignisbindung#🎜🎜##🎜🎜#Tatsächlich sind JSX und SFC geschrieben auf die gleiche Weise. Der Unterschied besteht darin, dass Sie als Beispiel click
verwenden. Verwenden Sie in SFC @click
oder v-on:click
für die Ereignisbindung , verwenden Sie in JSX onClick
für die Ereignisbindung#🎜🎜#rrreee#🎜🎜#Es ist zu beachten, dass die gebundene Funktion die Pfeilfunktion verwenden muss#🎜🎜##🎜🎜#Ereignismodifikator# 🎜🎜##🎜🎜 #Ereignismodifikatoren können mit den von vue bereitgestellten withModifiers
festgelegt werden, z. B. .self
#🎜🎜#rrreee#🎜🎜#Aber für .passive, .capture- und .once-Ereignismodifikatoren, die Verwendung von withModifiers
wird nicht wirksam. Sie können sie in Form einer verketteten Kamelschreibung festlegen. Dies ist nicht so gut wie .once
. 🎜🎜#rrreee#🎜🎜#v-model# 🎜🎜##🎜🎜#v-model ähnelt tatsächlich SFC, wenn modelValue
gebunden oder im input
verwendet wird tag#🎜🎜#rrreee#🎜🎜#Bei der Verwendung von benutzerdefinierten Ereignissen in Komponenten gibt es einen Unterschied zu SFC. Um beispielsweise eine msg
zu binden, genügt v-model:msg
in SFC. In JSX müssen Sie ein Array verwenden. Wenn wir uns die folgenden beiden Beispiele direkt ansehen, werden Sie verstehen, dass, wenn unsere Komponente den Namen ea_button
trägt, diese Komponente eine update:changeMsg
-Methode und den Die Variable msg
muss die von der Funktion update:changeMsg
übergebenen Parameter akzeptieren#🎜🎜##🎜🎜#SFC:#🎜🎜#rrreee#🎜🎜#JSX:#🎜 🎜#rrreee# 🎜🎜#slot#🎜🎜##🎜🎜# Schauen wir uns zunächst den Standard-Slot an. Wir definieren eine Unterkomponente, um einen Standard-Slot zu erhalten. #🎜🎜#rrreee#🎜🎜#Wenn Sie ihn verwenden möchten Ein benannter Slot muss dem übergeordneten Slot hinzugefügt werden. Ein Objekt wird an die Komponente übergeben, und der Schlüsselwert des Objekts ist der Name des Slots #🎜🎜#rrreee#🎜🎜#Wenn wir das erhalten möchten Wenn Sie Variablen in der untergeordneten Komponente aus dem Slot-Inhalt der übergeordneten Komponente beziehen, betrifft dies den Rollendomänen-Slot. In JSX können wir Parameter übergeben, wenn die Unterkomponente den Standard-Slot oder einen benannten Slot aufruft, wie zum Beispiel den folgenden Slot eins als Beispiel #🎜🎜#rrreee#🎜🎜#Wir können prama1= Slot 1 sehen
ist eine Variable in der untergeordneten Komponente. Wir übergeben sie über slots.slotOne(prama1)
#🎜🎜# an den Slot-Inhalt der übergeordneten Komponente.Das obige ist der detaillierte Inhalt vonSo verwenden Sie jsx/tsx in Vue3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

vue3+vite:src verwendet „require“, um Bilder dynamisch zu importieren, und vue3+vite importiert dynamisch mehrere Bilder. Wenn Sie „requireisnotdefined“ verwenden, wird eine Fehlermeldung angezeigt like vue2 like imgUrl:require(' .../assets/test.png') wird importiert, da Typescript Require nicht unterstützt, daher wird Import verwendet. So lösen Sie das Problem: Verwenden Sieawaitimport

tinymce ist ein voll funktionsfähiges Rich-Text-Editor-Plug-in, aber die Einführung von tinymce in Vue ist nicht so reibungslos wie bei anderen Vue-Rich-Text-Plug-ins. Tinymce selbst ist nicht für Vue geeignet, und @tinymce/tinymce-vue muss eingeführt werden. und Es handelt sich um ein ausländisches Rich-Text-Plug-in, das die chinesische Version nicht bestanden hat. Sie müssen das Übersetzungspaket von der offiziellen Website herunterladen (möglicherweise müssen Sie die Firewall umgehen). 1. Installieren Sie die zugehörigen Abhängigkeiten npminstalltinymce-Snpminstall@tinymce/tinymce-vue-S2. 3. Führen Sie den Skin und das chinesische Paket ein. Erstellen Sie einen neuen Tinymce-Ordner im öffentlichen Ordner des Projekts und laden Sie ihn herunter

Um das Blog-Frontend mit Vue zu implementieren, müssen Sie die Markdown-Analyse implementieren. Wenn Code vorhanden ist, müssen Sie die Code-Hervorhebung implementieren. Es gibt viele Markdown-Parsing-Bibliotheken für Vue, wie z. B. markdown-it, vue-markdown-loader, markiert, vue-markdown usw. Diese Bibliotheken sind alle sehr ähnlich. Hier wird Markiert verwendet, und highlights.js wird als Code-Hervorhebungsbibliothek verwendet. Die spezifischen Implementierungsschritte lauten wie folgt: 1. Installieren Sie abhängige Bibliotheken. Öffnen Sie das Befehlsfenster unter dem Vue-Projekt und geben Sie den folgenden Befehl ein: npminstallmarked-save//marked, um Markdown in htmlnpmins zu konvertieren

Um eine teilweise Aktualisierung der Seite zu erreichen, müssen wir nur das erneute Rendern der lokalen Komponente (dom) implementieren. In Vue lässt sich dieser Effekt am einfachsten mit der v-if-Direktive erzielen. In Vue2 können wir zusätzlich zur Verwendung der v-if-Anweisung zum erneuten Rendern des lokalen Doms auch eine neue leere Komponente erstellen. Wenn wir die lokale Seite aktualisieren müssen, springen wir zu dieser leeren Komponentenseite und springen dann wieder hinein der beforeRouteEnter-Schutz in der leeren Komponente. Wie in der Abbildung unten gezeigt, wie man in Vue3.X auf die Schaltfläche „Aktualisieren“ klickt, um das DOM im roten Feld neu zu laden und den entsprechenden Ladestatus anzuzeigen. Da der Guard in der Komponente in der scriptsetup-Syntax in Vue3.X nur o hat

Nachdem das vue3-Projekt gepackt und auf dem Server veröffentlicht wurde, wird auf der Zugriffsseite eine leere 1 angezeigt. Der publicPath in der Datei vue.config.js wird wie folgt verarbeitet: const{defineConfig}=require('@vue/cli-service') module.exports=defineConfig({publicPath :process.env.NODE_ENV==='produktion'?'./':'/&

Vorwort Ob Vue oder React: Wenn wir auf mehrere wiederholte Codes stoßen, werden wir darüber nachdenken, wie wir diese Codes wiederverwenden können, anstatt eine Datei mit einer Reihe redundanter Codes zu füllen. Tatsächlich können sowohl Vue als auch React eine Wiederverwendung durch Extrahieren von Komponenten erreichen. Wenn Sie jedoch auf einige kleine Codefragmente stoßen und keine andere Datei extrahieren möchten, kann React im Vergleich dazu verwendet werden Deklarieren Sie das entsprechende Widget in der Datei , oder implementieren Sie es über die Renderfunktion, wie zum Beispiel: constDemo:FC=({msg})=>{returndemomsgis{msg}}constApp:FC=()=>{return(

Verwenden von Vue zum Erstellen benutzerdefinierter Elemente. WebComponents ist ein Sammelname für eine Reihe webnativer APIs, die es Entwicklern ermöglichen, wiederverwendbare benutzerdefinierte Elemente (Customelements) zu erstellen. Der Hauptvorteil von benutzerdefinierten Elementen besteht darin, dass sie mit jedem Framework verwendet werden können, auch ohne Framework. Sie sind ideal, wenn Sie Endbenutzer ansprechen, die möglicherweise einen anderen Front-End-Technologie-Stack verwenden, oder wenn Sie die endgültige Anwendung von den Implementierungsdetails der verwendeten Komponenten entkoppeln möchten. Vue und WebComponents sind komplementäre Technologien und Vue bietet hervorragende Unterstützung für die Verwendung und Erstellung benutzerdefinierter Elemente. Sie können benutzerdefinierte Elemente in bestehende Vue-Anwendungen integrieren oder Vue zum Erstellen verwenden

Der letzte Effekt besteht darin, die VueCropper-Komponente „garnaddvue-cropper@next“ zu installieren. Wenn es sich um Vue3 handelt oder Sie andere Methoden als Referenz verwenden möchten, besuchen Sie bitte die offizielle npm-Adresse. Es ist auch sehr einfach, es in einer Komponente zu referenzieren und zu verwenden. Sie müssen nur die entsprechende Komponente und ihre Stildatei einführen. Ich verweise hier nicht global, sondern nur auf import{userInfoByRequest}from'../js/api ' in meiner Komponentendatei. import{VueCropper}from'vue-cropper&
