ホームページ >ウェブフロントエンド >Vue.js >Vue3 で JSX を使用するにはどうすればよいですか?

Vue3 で JSX を使用するにはどうすればよいですか?

WBOY
WBOY転載
2023-05-09 21:09:192254ブラウズ

    1. Vue3 での JSX の基本的なアプリケーション

    • .jsx 形式のファイルと defineComponent## を使用します

    • #defineComponent はセットアップ関数またはコンポーネント構成に渡すことができます。

    • # 補間には単一の括弧を使用します。

      #{}

    1.1 .vue ファイルでの jsx の使用

    // 父
     
    <template>
      <div class="home">
        <JSXDemo1 />
      </div>
    </template>
     
    <script>
    import JSXDemo1 from &#39;@/components/JSXDemo1.vue&#39;
    export default {
      name: &#39;HomeView&#39;,
      components: {
        JSXDemo1
      }
    }
    </script>
     
    // JSXDemo1.vue
     
    <script>
    import { ref } from &#39;vue&#39;
    export default {
      setup () {
        const countRef = ref(200)
     
        const render = () => {
          return <p>DEMO1--{countRef.value}</p> // jsx就是js语法,所以要加 .value
        }
        return render
      }
    }
    </script>

    1.2 .jsx ファイル形式

    // 父组件
     
    import { defineComponent, ref } from &#39;vue&#39;
    import JSXChild from &#39;./JSXChild.jsx&#39;
     
    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 &#39;vue&#39;
     
    export default defineComponent({ // 传入组件配置
      props: [&#39;a&#39;],
      setup (props) {
        const render = () => {
          return <>
            <p>child {props.a}</p>
          </>
        }
        return render
      }
    })

    2. JSX とテンプレートの違い

    • #構文には大きな違いがあります:

    • JSX は本質的には JS コードであり、任意のコードを使用できます。 js

    • template の機能は単純な js 式のみを埋め込むことができます。その他は v-if

    • JSX が ES 仕様になっているなどの命令が必要です、テンプレートは依然として Vue 独自のものです仕様

    • は本質的に同じです:

    • は js コードにコンパイルされます(レンダリング関数)

    2.1 補間

    • テンプレートでは二重括弧 {{ }}

      を使用しています
    • jsx は単一括弧 { }

    // template
     
    <template>
      <p>{{ name }} -- {{ age }}</p>
    </template>
     
    // jsx
     
    const render = () => {
        return <>
            <p>child {props.a}</p>
        </>
    }
    2.2 カスタム コンポーネント

    • テンプレートを使用します。コンポーネント名、大文字と小文字またはキャメルケースを変更できます。jsx は変更できません

    • 動的パラメーターを導入します。テンプレートはコロンパラメーター名 (:msg='msg') を使用します。jsx は使用しません。コロンが必要

    // template
     
    <template>
      <div class="home">
        <watch-effect :msg="msgRef"/>
      </div>
    </template>
     
    <script>
    import { ref } from &#39;vue&#39;
    import WatchEffect from &#39;@/components/WatchEffect.vue&#39;
    export default {
      name: &#39;HomeView&#39;,
      components: {
        WatchEffect,
      },
      setup () {
        const msgRef = ref(&#39;123&#39;)
        return {
            msgRef
        }
      }
    }
    </script>
     
    // jsx 组件名称不可变,要和引入名字保持一致
     
    import { defineComponent, ref } from &#39;vue&#39;
    import JSXChild from &#39;./JSXChild.jsx&#39;
     
    export default defineComponent(() => {
      const countRef = ref(300)
     
      const render = () => {
        return <>
          <p>DEMO2--{countRef.value}</p>
          <JSXChild a={countRef.value + 100}></JSXChild>
        </>
      }
      return render
    })
    2.3 プロパティとイベント

    テンプレートではプロパティとイベントの書き方を区別しますが、jsx では区別しません
    // jsx 属性和事件的写法一样
     
    import { defineComponent, ref } from &#39;vue&#39;
    import JSXChild from &#39;./JSXChild.jsx&#39;
     
    export default defineComponent(() => {
      const countRef = ref(300)
     
      function onChange () {
        console.log(&#39;onChange&#39;)
      }
      const render = () => {
        return <>
          <p>DEMO2--{countRef.value}</p>
          <JSXChild a={countRef.value + 100} change={onChange}></JSXChild>
        </>
      }
      return render
    })
    2.4条件とループ

    条件付きテンプレートは v-if 命令を使用し、jsx は式で && を使用します (if( a && b) と同様)
    // template v-if
     
    <template>
      <p v-if="flagRef">template demo</p>
      <button @click="changeFlagRef">click</button>
    </template>
    <script>
    import { ref } from &#39;vue&#39;
    export default {
      setup () {
        const flagRef = ref(true)
     
        function changeFlagRef () {
          flagRef.value = !flagRef.value
        }
     
        return {
          flagRef,
          changeFlagRef
        }
      }
    }
    </script>
     
    // jsx &&符号判断
     
    import { defineComponent, ref } from &#39;vue&#39;
    import JSXChild from &#39;./JSXChild.jsx&#39;
     
    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
    })
    ループ テンプレートは v-for 命令を使用します。 jsx は配列
    // template v-for
     
    <template>
      <ul>
        <li v-for="item in state.list" :key="item">{{ item }}</li>
      </ul>
    </template>
    <script>
    import { reactive } from &#39;vue&#39;
    export default {
      setup () {
        const state = reactive({
          list: [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
        })
     
        return {
          state
        }
      }
    }
    </script>
     
    // jsx 数组 .map 函数
     
    import { defineComponent, reactive } from &#39;vue&#39;
     
    export default defineComponent(() => {
      const state = reactive({
        list: [&#39;a1&#39;, &#39;b1&#39;, &#39;c1&#39;]
      })
     
      const render = () => {
        return <>
          <ul>
            {state.list.map(item => <li>{item}</li>)}
          </ul>
        </>
      }
      return render
    })
    3 の .map 関数を使用します。JSX とスロット (JSX の優位性を体験してください)

    • スロットは Vue によって発明された概念ですテンプレートの能力を向上させるために

    • スロットは常に Vue 初心者、特にスコープ スロットの「悪夢」でした。 JSX は本質的に js

    • であるため、JSX を使用すると理解しやすくなります。

    以上がVue3 で JSX を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。