最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue中正確使用jsx語法的姿勢分享

 更新時間:2021年07月15日 10:30:34   作者:啥都不會的小前端  
這篇文章主要給大家介紹了關(guān)于vue中正確使用jsx的相關(guān)資料,JSX就是Javascript和XML結(jié)合的一種格式,React發(fā)明了JSX,利用HTML語法來創(chuàng)建虛擬DOM,當(dāng)遇到<,JSX就當(dāng)HTML解析,遇到{就當(dāng)JavaScript解析,需要的朋友可以參考下

前言

又到了愉快的摸魚時間,我覺得不能荒廢,H5頁面我一直用的vant,出于對源碼的好奇,我從git上拉了一份vant源碼,里面竟然都是jsx寫的組件,于是我開始了對在vue中使用jsx的探索

虛擬DOM

什么是虛擬DOM

在這之前,先了解下虛擬DOM,vue和react框架都在內(nèi)部使用了虛擬DOM,這樣做的原因是通過js操作DOM的計算成本很高,雖然js更新速度很快,但是查找dom并更新的成本很高。那么有什么方法可以優(yōu)化呢,vue等框架使用js對象,通過改變js對象,最后進(jìn)行批量處理,一次更新DOM,所以虛擬DOM本質(zhì)上就是一個js對象

虛擬DOM的優(yōu)點(diǎn)

  • 從原先的操作真實DOM到操作虛擬DOM,降低查找成本
  • 通過diff比對,我們可以更快的定位數(shù)據(jù)的變化,從而更新DOM
  • 更好的ui更新
  • 抽象渲染過程,帶來了實現(xiàn)跨平臺的能力,如vue3中的createRenderer API

渲染函數(shù)是什么

渲染函數(shù)是用來生成虛擬DOM的。我們在vue單文件中編寫模板語法,最終會在底層實現(xiàn)中被編譯成渲染函數(shù)

Vue 推薦在絕大多數(shù)情況下使用模板來創(chuàng)建你的 HTML。然而在一些場景中,你真的需要 JavaScript 的完全編程的能力。這時你可以用渲染函數(shù),它比模板更接近編譯器。

當(dāng)出現(xiàn)以下場景,雖然下列寫法也能實現(xiàn)想要的效果,但是他不僅冗長,而且我們?yōu)槊總€級別標(biāo)題重復(fù)書寫了 。當(dāng)我們添加錨元素時,我們必須在每個 v-if/v-else-if 分支中再次重復(fù)它

const { createApp } = Vue

const app = createApp({})

app.component('anchored-heading', {
  template: `
    <h1 v-if="level === 1">
      <slot></slot>
    </h1>
    <h2 v-else-if="level === 2">
      <slot></slot>
    </h2>
    <h3 v-else-if="level === 3">
      <slot></slot>
    </h3>
    <h4 v-else-if="level === 4">
      <slot></slot>
    </h4>
    <h5 v-else-if="level === 5">
      <slot></slot>
    </h5>
    <h6 v-else-if="level === 6">
      <slot></slot>
    </h6>
  `,
  props: {
    level: {
      type: Number,
      required: true
    }
  }
})

雖然模板在大多數(shù)組件中都非常好用,但是顯然在這里它就不合適了。那么,我們來嘗試使用 render 函數(shù)重寫上面的例子:

const { createApp, h } = Vue

const app = createApp({})

app.component('anchored-heading', {
  render() {
    return h(
      'h' + this.level, // tag name
      {}, // props/attributes
      this.$slots.default() // array of children
    )
  },
  props: {
    level: {
      type: Number,
      required: true
    }
  }
})

jsx

這樣寫渲染函數(shù)有點(diǎn)痛苦,有沒有更接近模板的寫法呢,vue提供了一個babel-plugin-jsx babel插件來讓vue支持jsx寫法

我這邊使用的vuecli創(chuàng)建的vue3 + ts項目,腳手架已經(jīng)集成了jsx和ts的相關(guān)依賴

在vue3中編寫jsx的兩種方式

直接將文件后綴名從vue改成tsx或者jsx

在vue3中,可以直接使用render選項編寫

import { defineComponent } from "vue";
export default defineComponent({
  name: "Jsx",
  render() {
    return <div>我是一個div</div>;
  },
});

也可以在setup中返回

import { defineComponent } from "vue";
export default defineComponent({
  name: "Jsx",
  setup() {
    return () => <div>我是div</div>;
  },
});

兩種方式都可以,具體看個人習(xí)慣,setup中訪問不到this,但是render中可以通過this訪問當(dāng)前vue實例

用法

class綁定,和react的jsx綁定的有區(qū)別,react中使用className,vue中使用class

 setup() {
   return () => <div class="test">我是div</div>;
 },

style綁定

  setup() {
    return () => <div style={{ color: "red" }}>我是div</div>;
  },

props綁定

// 父組件
setup() {
    return () => (
      <div style={{ color: "red" }}>
        <span>我是父組件</span>
        <Mycom msg={"我是父組件傳的值"} />
      </div>
 );
// 子組件,setup的第一個參數(shù),可以獲取props里的值
  setup(props) {
    return () => <div>我是子組件{props.msg}</div>;
  },

事件綁定

setup() {
    function eventClick() {
      console.log("點(diǎn)擊");
    }
    return () => <button onClick={eventClick}>按鈕</button>;
},

組件自定義事件

// 子組件
import { defineComponent } from "vue";
export default defineComponent({
  name: "Mycom",
  emits: ["event"],
  setup(props, { emit }) {
    function sendData() {
      emit("event", "子組件傳遞的數(shù)據(jù)");
    }
    return () => (
      <div>
        <span>自定義事件</span>
        <button onClick={sendData}>傳遞數(shù)據(jù)</button>
      </div>
    );
  },
});
// 父組件
// @ts-nocheck
// 這樣寫在jsx中沒問題,但是在tsx中會報ts類型錯誤,所以我在上面忽略了當(dāng)前文件ts監(jiān)測@ts-nocheck
import { defineComponent } from "vue";
import Mycom from "./mycom";
export default defineComponent({
  name: "Jsx",
  setup() {
    function getSon(msg: string) {
      console.log(msg);
    }
    return () => (
      <div>
        <Mycom onEvent={getSon} />
      </div>
    );
  },
});

也可以這樣解決ts類型報錯

  setup() {
    function getSon(msg: string) {
      console.log(msg);
    }
    return () => (
      <div>
        <Mycom {...{ onEvent: getSon }} />
      </div>
    );
  },

插槽

// 父組件
setup() {
    const slots = {
      test: () => <div>具名插槽</div>,
      default: () => <div>默認(rèn)插槽</div>,
    };
    return () => (
      <div>
        <Mycom v-slots={slots}></Mycom>
      </div>
    );
},
setup(props, { slots }) {
// 子組件
    return () => (
      <div>
        <span>插槽</span>
        {slots.default?.()}
        {slots.test?.()}
      </div>
    );
  },

指令,v-if,v-for等指令在jsx中無法使用,jsx只支持v-model和v-show指令

  setup() {
    const inputData = ref("");
    return () => (
      <div>
        <span v-show={true}>顯示</span>
        <span v-show={false}>隱藏</span>
        <input type="text" v-model={inputData.value} />
        <span>{inputData.value}</span>
      </div>
    );
},

最后

話不多說,我先打開vant源碼,準(zhǔn)備開啟我的第一個組件源碼閱讀 src =>button=>button.tsx

到此這篇關(guān)于vue中正確使用jsx的文章就介紹到這了,更多相關(guān)vue中使用jsx內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

參考

相關(guān)文章

  • 講解vue-router之什么是編程式路由

    講解vue-router之什么是編程式路由

    編程式路由在我們的項目使用過程中最常用的的方法了。這篇文章主要介紹了講解vue-router之什么是編程式路由,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • vue+element-plus上傳圖片及回顯問題及數(shù)量限制

    vue+element-plus上傳圖片及回顯問題及數(shù)量限制

    本文主要介紹了vue+element-plus上傳圖片及回顯問題及數(shù)量限制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • vue之使用echarts圖表setOption多次很卡問題及解決

    vue之使用echarts圖表setOption多次很卡問題及解決

    這篇文章主要介紹了vue之使用echarts圖表setOption多次很卡問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue3通過hooks方式封裝節(jié)流和防抖的代碼詳解

    Vue3通過hooks方式封裝節(jié)流和防抖的代碼詳解

    vue3 中的 hooks 就是函數(shù)的一種寫法,就是將文件的一些單獨(dú)功能的js代碼進(jìn)行抽離出來,放到單獨(dú)的js文件中,或者說是一些可以復(fù)用的公共方法/功能,本文給大家介紹了Vue3通過hooks方式封裝節(jié)流和防抖,需要的朋友可以參考下
    2024-10-10
  • cdn模式下vue的基本用法詳解

    cdn模式下vue的基本用法詳解

    這篇文章主要介紹了cdn模式下vue的基本用法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-10-10
  • vue項目設(shè)置scrollTop不起作用(總結(jié))

    vue項目設(shè)置scrollTop不起作用(總結(jié))

    這篇文章主要介紹了vue項目設(shè)置scrollTop不起作用(總結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • vue調(diào)用高德地圖實例代碼

    vue調(diào)用高德地圖實例代碼

    本篇文章主要介紹了vue調(diào)用高德地圖實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 詳解基于vue-cli3快速發(fā)布一個fullpage組件

    詳解基于vue-cli3快速發(fā)布一個fullpage組件

    這篇文章主要介紹了詳解基于vue-cli3快速發(fā)布一個fullpage組件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • ant-design-vue導(dǎo)航菜單a-menu的使用解讀

    ant-design-vue導(dǎo)航菜單a-menu的使用解讀

    這篇文章主要介紹了ant-design-vue導(dǎo)航菜單a-menu的使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 解決vue單頁面應(yīng)用進(jìn)入頁面加載所有 js 的問題

    解決vue單頁面應(yīng)用進(jìn)入頁面加載所有 js 的問題

    這篇文章主要介紹了解決vue單頁面應(yīng)用進(jìn)入頁面加載所有 js 的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論

南宫市| 德昌县| 枣阳市| 潮安县| 沂源县| 寻乌县| 台州市| 怀柔区| 中阳县| 峨眉山市| 汤原县| 上犹县| 桦南县| 额敏县| 门源| 息烽县| 凤阳县| 宝清县| 延庆县| 柘城县| 尚义县| 富源县| 德兴市| 闽清县| 济源市| 凤冈县| 米林县| 永新县| 徐闻县| 虞城县| 霍邱县| 泸水县| 陵川县| 扬中市| 三门县| 双江| 阿克| 仁布县| 界首市| 突泉县| 三原县|