中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue3如何使用JSX

發布時間:2023-02-23 11:07:29 來源:億速云 閱讀:113 作者:iii 欄目:開發技術

這篇文章主要介紹“Vue3如何使用JSX”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Vue3如何使用JSX”文章能幫助大家解決問題。

    1. Vue3 中 JSX 的基本應用

    • 使用 .jsx 格式文件和 defineComponent

    • defineComponent 可傳入 setup 函數 或 組件的配置

    • 插值使用單括號 {}

    1.1 在 .vue 文件中使用 jsx

    // 父
     
    <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>

    1.2 .jsx文件格式

    // 父組件
     
    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
      }
    })

    2. JSX 和 template 的區別

    • 語法上有很大區別

    • JSX 本質就是 js 代碼,可以使用 js 的任何能力

    • template 只能嵌入簡單的 js 表達式,其他需要指令,如 v-if

    • JSX 已經成為 ES 規范,template 還是 Vue 自家規范

    • 本質是相同的:

    • 都會被編譯為 js 代碼(render 函數)

    2.1 插值

    • template 使用雙括號 {{ }}

    • jsx 使用單括號 { }

    // template
     
    <template>
      <p>{{ name }} -- {{ age }}</p>
    </template>
     
    // jsx
     
    const render = () => {
        return <>
            <p>child {props.a}</p>
        </>
    }

    2.2 自定義組件

    • template 組件名使用時可改變大小寫或是駝峰,jsx 不可更改

    • 引入動態參數,template使用冒號+參數名(:msg='msg'),jsx 不需要冒號

    // 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
    })

    2.3 屬性和事件

    template 區分屬性和事件的寫法,jsx 不區分
    // 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
    })

    2.4 條件和循環 

    條件 template 使用 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 '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
    })
     循環 template 使用 v-for 指令,jsx 使用數組的 .map 函數
    // 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
    })

    3. JSX 和 slot (體會 JSX 的優越性)

    • slot 是 Vue 發明的概念,為了完善 template 的能力

    • slot 一直是 Vue 初學者的“噩夢”,特別是:作用域 slot

    • 但使用 JSX 將很容易理解,因為 JSX 本質就是 js

    關于“Vue3如何使用JSX”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    乌兰察布市| 安义县| 桃源县| 旺苍县| 台南县| 江油市| 长宁县| 静安区| 温泉县| 肇州县| 金秀| 桦川县| 莱州市| 甘肃省| 应城市| 叙永县| 澄城县| 苏州市| 常州市| 邹平县| 磐安县| 台中县| 吉木乃县| 平安县| 墨玉县| 江油市| 平阴县| 德惠市| 昌江| 仁寿县| 锡林郭勒盟| 四平市| 道孚县| 闸北区| 丹巴县| 原平市| 梁平县| 九寨沟县| 泊头市| 武汉市| 五指山市|