verwendet eine Datei im .jsx-Format und defineComponent
defineComponent kann an die Setup-Funktion oder Komponentenkonfiguration übergeben werden
Verwenden Sie einzelne Klammern für Werte {}
// 父 <template> <div class="home"> <JSXDemo1 /> </div> </template> <script> import JSXDemo1 from '@/components/JSXDemo1.vue' export default { name: 'HomeView', components: { JSXDemo1 } } </script> // JSXDemo1.vue <script> import { ref } from 'vue' export default { setup () { const countRef = ref(200) const render = () => { return <p>DEMO1--{countRef.value}</p> // jsx就是js语法,所以要加 .value } return render } } </script>
// 父组件 import { defineComponent, ref } from 'vue' import JSXChild from './JSXChild.jsx' export default defineComponent(() => { // 传入 setup 函数 const countRef = ref(300) const render = () => { return <> <p>DEMO2--{countRef.value}</p> <JSXChild a={countRef.value + 100}></JSXChild> </> } return render }) // 子组件 JSXChild.jsx import { defineComponent } from 'vue' export default defineComponent({ // 传入组件配置 props: ['a'], setup (props) { const render = () => { return <> <p>child {props.a}</p> </> } return render } })
Es gibt einen großen Unterschied in der Syntax:
JSX ist im Wesentlichen JS-Code, Sie können jede Fähigkeit von JS nutzen
Vorlage kann nur einfache JS-Ausdrücke einbetten, andere Anweisungen sind erforderlich, wie z. B. v-if
JSX ist geworden eine ES-Spezifikation und die Vorlage ist immer noch Vues eigene. Die Spezifikationen
sind im Wesentlichen die gleichen:
werden in js-Code kompiliert (Renderfunktion)
Vorlage verwendet doppelte Klammern {{ }}
jsx verwendet einfache Klammern { }
// template <template> <p>{{ name }} -- {{ age }}</p> </template> // jsx const render = () => { return <> <p>child {props.a}</p> </> }
Der Name der Vorlagenkomponente kann in Groß- und Kleinschreibung geändert werden. Bei Verwendung kann jsx nicht geändert werden
Dynamische Parameter einführen, Vorlage verwendet Doppelpunkt + Parameter Name (:msg='msg'), jsx benötigt keinen Doppelpunkt
// template <template> <div class="home"> <watch-effect :msg="msgRef"/> </div> </template> <script> import { ref } from 'vue' import WatchEffect from '@/components/WatchEffect.vue' export default { name: 'HomeView', components: { WatchEffect, }, setup () { const msgRef = ref('123') return { msgRef } } } </script> // jsx 组件名称不可变,要和引入名字保持一致 import { defineComponent, ref } from 'vue' import JSXChild from './JSXChild.jsx' export default defineComponent(() => { const countRef = ref(300) const render = () => { return <> <p>DEMO2--{countRef.value}</p> <JSXChild a={countRef.value + 100}></JSXChild> </> } return render })
Vorlage unterscheidet die Schreibmethode von Eigenschaften und Ereignissen, jsx unterscheidet nicht
// jsx 属性和事件的写法一样 import { defineComponent, ref } from 'vue' import JSXChild from './JSXChild.jsx' export default defineComponent(() => { const countRef = ref(300) function onChange () { console.log('onChange') } const render = () => { return <> <p>DEMO2--{countRef.value}</p> <JSXChild a={countRef.value + 100} change={onChange}></JSXChild> </> } return render })
Bedingte Vorlage verwendet v-if-Anweisung, jsx verwendet && (ähnlich wie if( a && b)) in Ausdrücken
// template v-if <template> <p v-if="flagRef">template demo</p> <button @click="changeFlagRef">click</button> </template> <script> import { ref } from 'vue' export default { setup () { const flagRef = ref(true) function changeFlagRef () { flagRef.value = !flagRef.value } return { flagRef, changeFlagRef } } } </script> // jsx &&符号判断 import { defineComponent, ref } from 'vue' import JSXChild from './JSXChild.jsx' export default defineComponent(() => { const flagRef = ref(true) function changeFlagRef () { flagRef.value = !flagRef.value } const render = () => { return <> <p onClick={changeFlagRef}>DEMO2--{flagRef.value.toString()}</p> {flagRef.value && <JSXChild a={flagRef.value}></JSXChild>} </> } return render })
Schleifenvorlage verwendet v-for-Anweisung, jsx verwendet Array .map-Funktion
// template v-for <template> <ul> <li v-for="item in state.list" :key="item">{{ item }}</li> </ul> </template> <script> import { reactive } from 'vue' export default { setup () { const state = reactive({ list: ['a', 'b', 'c'] }) return { state } } } </script> // jsx 数组 .map 函数 import { defineComponent, reactive } from 'vue' export default defineComponent(() => { const state = reactive({ list: ['a1', 'b1', 'c1'] }) const render = () => { return <> <ul> {state.list.map(item => <li>{item}</li>)} </ul> </> } return render })
Slot ist ein von Vue erfundenes Konzept, um die Fähigkeit von Templates zu verbessern.
Slot war schon immer ein „Albtraum“. Vue-Anfänger, insbesondere: Scope-Slot
Aber die Verwendung von JSX wird sehr schwierig sein. Leicht zu verstehen, da JSX im Wesentlichen js ist
Das obige ist der detaillierte Inhalt vonWie verwende ich JSX mit Vue3?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!