ホームページ >ウェブフロントエンド >Vue.js >Vue3でjsx/tsxを使う方法
ここでは、vite プロジェクトを例として取り上げます。プロジェクトで JSX を使用したい場合は、プラグインをインストールする必要があります @vitejs/plugin-vue -jsx
. このプラグインは、プロジェクトで JSX/TSX を使用しましょう
npm i @vitejs/plugin-vue-jsx -D
After 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
ファイルで使用することです。これには、スクリプトの lang を tsx
に設定するか、セットアップ関数でテンプレート
<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
//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> );のように 1 つのファイルで複数のコンポーネント テンプレートを定義できる機能があることを見つけるのは難しくありません。 、定義した 2 つのコンポーネントが表示されたページ 次に、vueInterpolation での JSX の具体的な使用法を見てみましょう。 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 を追加する必要はありませんが、SFC テンプレートに
.value
<div> <div v-if="showyes">yes</div> <span v-else>no</span> </div>
などの条件付きレンダリングに
v-if を使用できますが、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
<pre class="brush:js;">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>
);
},
});</pre>
リスト ループ (v-for)
<ul> <li v-for="{ index, item } in list" :key="index">{{ item }}</li> </ul>
など) です。JSX では、リスト ループのレンダリングにマップを使用するように変更する必要があります。
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 のリスト ループでもマップが必要であることに注意してください。キーを追加するには #イベント バインディングイベント バインディングは、実際には JSX と SFC の違いです。例として
@click またはSFC の
v-on:click JSX のイベント バインディングの場合、イベント バインディングに
onClick を使用します。
import { defineComponent, ref } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { return () => ( <div onClick={() => { console.log("我被点击"); }} > 点击 </div> ); }, });
ここで、バインドされた関数はアロー関数
イベント変更シンボルイベント修飾子は、import { defineComponent, ref, withModifiers } from "vue"; export default defineComponent({ name: "app", setup(props, ctx) { return () => ( <div onClick={withModifiers(() => { console.log("我被点击"); }, ["self"])} > 点击 </div> ); }, });# など、vue によって提供される
withModifiers
を使用して設定できます。 ##ただし、.passive、.capture、および Once イベント修飾子の場合、withModifiers
を使用しても効果はありません。チェーンされたキャメル ケースの形式で設定できます。 ほど優れたものではありません。 Once<pre class="brush:js;">import { defineComponent } from "vue";
export default defineComponent({
name: "app",
setup(props, ctx) {
return () => (
<div
onClickOnce={() => {
console.log("我被点击");
}}
>
点击
</div>
);
},
});</pre>
v-model
v-model は、
タグで使用する場合、実際には SFC に似ています。 <pre class="brush:js;">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} />;
},
});</pre>
コンポーネントでバインディングのカスタマイズを使用する場合 イベントと SFC には違いがあります。たとえば、msg
をバインドする場合、SFC では
ただし、JSX では配列を使用する必要があります。次の 2 つの例を直接見ると、コンポーネントの名前が ea_button
である場合、このコンポーネントは親コンポーネントの msg# である
update:changeMsg メソッドを送信することがわかります。 ##変数は、
update:changeMsg 関数によって渡されたパラメータを受け入れる必要があります
SFC:
<ea-button v-model:changeMsg="msg"></ea-button>
JSX:
<ea-button v-model={[msg.value, 'changeMsg']}></ea-button>Slot最初にデフォルトのスロットを見てみましょう。デフォルトのスロットを受け取るサブコンポーネントの子を定義します
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>; }, });名前付きスロットを使用したい場合は、親コンポーネントでオブジェクトを渡す必要があります。名前
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> ); }, });
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=slot 1## がわかります。 # は子コンポーネントの変数です。
slots.slotOne(prama1) を通じて親コンポーネントのスロット コンテンツに渡します。以上がVue3でjsx/tsxを使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。