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

溫馨提示×

溫馨提示×

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

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

怎么在Vue中使用JSX

發布時間:2021-11-05 14:25:16 來源:億速云 閱讀:106 作者:iii 欄目:web開發

本篇內容主要講解“怎么在Vue中使用JSX”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么在Vue中使用JSX”吧!

簡介

先舉一個例子來說明為什么 JSX 是好的。

我們要構建一個組件,該組件可以是普通的單行文本輸入或多行輸入(文本區域)。我們的模板聲明可能看起來像這樣。

typeof10;//=>'number'typeof'Hello';//=>'string'typeoffalse;//=>'boolean'typeof{a:1};//=>'object'typeofundefined;//=>'undefined'typeofSymbol();//=>'symbol'

從上面的代碼片段中可以看到,我們很快就會遇到一些問題,比如重復代碼等等。想象一下,必須支持input上面所列的各種屬性。上面的這個小片段將會增長并成為一個難以維護的噩夢。

要解決這個問題,我們需要使用Vue進行降級處理,因此需要使用理接近Vue的內部API來解決這個問題。

render() 方法

注意:這里并不是說沒有JSX就沒有一種簡單的方法來處理上面的問題,只是說將這個邏輯移動到帶有JSX的render()方法可以使組件更直觀。

我們在 Vue 中創建的每個組件都有一個render方法。這個就是 Vue 選擇渲染組件的地方。即使我們不定義這個方法,Vue 也會為我們做這件事。

這意味著當我們在 Vue 中定義 HTML 模板時,Vue 的模板編譯器將其編譯為一個createElement函數,該函數帶有幾個參數并從render函數返回結果。

為了修復上一節中的代碼,我們刪除了template屬性或template標簽,并在組件上定義了render()方法。如果在組件上定義了render方法,則 Vue 將忽略template定義。

classCat{}constmyCat=newCat();myCatinstanceofCat;//=>true

上面的代碼做了幾件事:

  • render方法從Vue獲取一個createElement助手。

  • 我們以編程方式定義我們的標簽。

  • 然后,我們創建標簽并將其屬性,類等作為對象傳遞。我們可以傳遞給createElement的選項很多。

  • 我們返回新創建的元素進行渲染。

我們為 Vue 組件定義的每個模板都將轉換為可返回createElement函數的render方法。因為這個原因,render方法將優先于模板定義。

舉個例子:

//HTML<div><p>Onlyyoucanstopforestfires</p></div>

模板編譯器將把上面的 HTML 轉換成:

...render(createElement){returncreateElement('div',{},createElement('p',{},'Onlyyoucanstopforestfires'))}...

現在你可能會問這個問題:“對可讀性來說這不好嗎?” 答案是肯定的。一旦定義了具有許多元素嵌套級別或具有多個同級元素的組件,我們就會遇到這個新問題。

這就是 JSX 出現的原因,它可以很好的解決此類問題。

JSX 是什么

JSX 是 Facebook 工程團隊創造的一個術語。

JSX 是 JavaScript 的類似XML的語法擴展,沒有任何定義的語義。

JSX 不打算由引擎或瀏覽器實現。相反,我們將使用 Babel 之類的轉置器將JSX轉換成常規的 JS 。

//此行是JSX的示例constheading=<h2>WelcometoScotch</h2>;

基本上,JSX 允許我們在 JS 中使用類似 Html 的語法。

配置 Vue 以使用 JSX

如果使用的 Vue-cli 大于或等于 3.0 版本,那么就直接可以使用JSX的語法了。

如果您使用的是不支持 JSX 的Vue-cli較舊版本,則可以通過安裝babel-preset-vue-app來添加它,并將其添加到您的.babelrc文件中。

#Usingnpmnpminstall--save-devbabel-preset-vue-app#Usingyarnyarnadd--devbabel-preset-vue-app

在.babelrc文件中,添加:

{"presets":["vue-app"]}

我們現在可以在組件的render函數中使用 JSX。

在 Vue 中使用 JSX 需要注意的地方

在 Vue 中使用JSX需要注意幾點。

要監聽 JSX 中的事件,我們需要“on”前綴。例如,將onClick用于單擊事件。

render(createElement){return(<buttononClickbuttononClick={this.handleClick}></button>)}

要修改事件,請使用

render(createElement){return(<buttononClick:preventbuttononClick:prevent={this.handleClick}></button>)}

綁定變量,注意這里不是使用 :

render(createElement){return(<buttoncontentbuttoncontent={this.generatedText}></button>)}

將HTML字符串設置為元素的內容,使用domPropsInnerHTML而不是使用v-html

render(createElement){return(<buttondomPropsInnerHTMLbuttondomPropsInnerHTML={htmlContent}></button>)}

我們也可以展開一個大對象:

render(createElement){return(<button{...this.largeProps}></button>)}

在 render 中使用JSX

回到我們最初的“TextField”組件。現在我們已經在 Vue 應用程序中啟用了 JSX,我們現在可以這樣做了。

render(createElement){constinputAttributes={class:'input-fieldhas-outline',//classdefinitiononClick:this.handleClick//eventhandlerbackdrop:false//customprop}constinputMarkup=this.multiline?<textarea{...inputAttributes}></textarea>:<input{...inputAttributes}/>returninputMarkup}

導入 Vue JS 組件

在 Vue 中使用JSX的另一個好處是,我們不再需要注冊所需的每個組件。我們只是導入和使用。

import{Button}from'../components'exportdefault{render(createElement){return<ButtonprimaryButtonprimary={true}>Edit</Button>}}

如何使 JSX 與 TypeScript 一起使用

TypeScript 用作一種向 JavaScript添加類型檢查的機制。要在 JSX 支持 TypeScript中,需要修改 tsconfig.json。

要在 TypeScript 中啟用 JSX,請先將該文件另存為.tsx文件,然后將tsconfig.json修改為包括:

{"compilerOptions":{...."jsx":"preserve",}}

將jsx選項設置為“preserve”意味著 TypeScript 不應處理JSX。這樣做使 Babel 可以控制所有JSX 和 TypeScript 堅持使用類型,因為它尚不支持 Vue JSX。

然后在項目中創建一個jsx.d.ts文件,并為 Vue 添加 TypeScript JSX 聲明。

importVue,{VNode}from'vue'declareglobal{namespaceJSX{interfaceElementextendsVNode{}interfaceElementClassextendsVue{}interfaceElementAttributesProperty{$props:{}}interfaceIntrinsicElements{[elemName:string]:any}}}

確保 TypeScript 可以加載聲明文件。或者,可以通過以下方式在tsconfig.json中為其添加自動加載功能:

{"compilerOptions":{..."typesRoot":["./node_modules/@types","./types"]}}

到此,相信大家對“怎么在Vue中使用JSX”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

英德市| 长顺县| 湖南省| 大姚县| 西峡县| 鄂伦春自治旗| 丹东市| 满城县| 保定市| 特克斯县| 梓潼县| 福鼎市| 思茅市| 德惠市| 康定县| 襄汾县| 正安县| 景东| 舟山市| 林州市| 绿春县| 凤阳县| 白河县| 沈阳市| 湘乡市| 内黄县| 莱阳市| 德化县| 乌什县| 大石桥市| 玉环县| 双城市| 北川| 兴文县| 东方市| 信阳市| 瓦房店市| 广元市| 富锦市| 天门市| 神木县|