主頁 > 企業開發 > StencilJs 學習之 JSX

StencilJs 學習之 JSX

2023-06-21 09:07:35 企業開發

Stencil 組件使用 JSX 渲染,這是一種流行的宣告式模板語法,每個組件都有一個渲染函式,它回傳在運行時渲染到 DOM 的組件樹,

基礎用法

render 函式用于輸出將繪制到螢屏上的組件樹,

class MyComponent {
    render() {
        return (
            <div>
                <h1>Hello World</h1>
                <p>This is JSX!</p>
            </div>
        );
    }
}

在這個例子中,我們回傳了一個 div ,它有兩個子元素 h1p

Host Element

如果你想修改宿主元素本身,比如向組件本身添加一個類或一個屬性,可以使用 Host 組件,

資料系結

組件經常需要渲染動態資料,要在 JSX 中執行此操作,請使用 {}

render() {
  return (
    <div>Hello {this.name}</div>
  )
}

如果你熟悉 ES6 模板變數,JSX 變數和 ES6 非常相似,只是沒有 $ 符號,

//ES6
`Hello ${this.name}`

//JSX
Hello {this.name}

條件

如果你想根據不同的條件渲染不同的內容,可以使用 if/else 來實作

render() {
  if (this.name) {
    return ( <div>Hello {this.name}</div> )
  } else {
    return ( <div>Hello, World</div> )
  }
}

此外,可以使用 JavaScript 的三元運算子來創建行內條件

render() {
  return (
    <div>
    {this.name ? <p>Hello {this.name}</p> : <p>Hello World</p> }
    </div>
  );
}

請注意:Stencil 重用 DOM 元素以獲得更好的性能,請看下面的代碼:

{
    someCondition ? (
        <my-counter initialValue=https://www.cnblogs.com/guojikun/p/{2} />
    ) : (
        
    );
}

上面的代碼與下面的代碼完全相同:

<my-counter initialValue=https://www.cnblogs.com/guojikun/p/{someCondition ? 2 : 5} />

因此,如果某些條件發生了變化,my-counter的內部狀態不會被重置,它的生命周期方法(如 componentWillLoad())也不會被觸發,相反,條件陳述句只會觸發同一個組件的更新,

如果你想在一個條件陳述句中銷毀并重新創建一個組件,你可以指定 key 屬性,這告訴 Stencil,這些組件實際上是不同的兄弟組件:

{
    someCondition ? (
        <my-counter key="a" initialValue=https://www.cnblogs.com/guojikun/p/{2} />
    ) : (
        
    );
}

這樣,如果某些條件發生變化,你會得到一個新的 my-counter 組件實體,它具有新的內部狀態,同時也將會同步運行生命周期 componentWillLoad()componentDidLoad()

Slots

組件通常需要在其組件樹的特定位置動態渲染子組件,允許開發人員在使用我們的組件時提供子內容,我們的組件將子組件放置在適當的位置,

要做到這一點,您可以在 my-component 中使用 Slot 標簽,

// my-component.tsx
render() {
  return (
    <div>
      <h2>A Component</h2>
      <div><slot /></div>
    </div>
  );
}

然后,如果用戶在創建組件 my-component 時傳遞子組件,那么 my-component 將把該組件放在上面第二層的 div 中:

render(){
  return(
    <my-component>
      <p>Child Element</p>
    </my-component>
  )
}

slot 可以增加 name 屬性,來決定內容的輸出位置:

// my-component.tsx

render(){
  return [
    <slot name="item-start" />,
    <h1>Here is my main content</h1>,
    <slot name="item-end" />
  ]
}

render(){
  return(
    <my-component>
      <p slot="item-start">I'll be placed before the h1</p>
      <p slot="item-end">I'll be placed after the h1</p>
    </my-component>
  )
}

Dealing with Children

JSX 中節點的子節點在運行時對應于一個節點陣列,無論它們是通過 array.prototype.map 跨陣列創建的,還是直接在 JSX 中宣告為兄弟節點,這意味著在運行時,下面兩個頂級
div 的子元素(.Todo-one 和.todo-two)的表示方式相同:

render() {
  return (
    <>
      <div >
        {this.todos.map((todo) => (
          <span>{ todo.taskName }</span>
        )}
      </div>
      <div >
        <span>{ todos[0].taskName }</span>
        <span>{ todos[1].taskName }</span>
      </div>
    </>
  )
}

如果這個子元素陣列是動態的,即任何節點都可以被添加、洗掉或重新排序,那么最好為每個元素設定一個唯一的 key 屬性,如下所示:

render() {
  return (
    <div>
      {this.todos.map((todo) =>
        <div key={todo.uid}>
          <div>{todo.taskName}</div>
        </div>
      )}
    </div>
  )
}

當子陣列中的節點被重新排列時,Stencil 會努力在渲染時保留 DOM 節點,但它不能在所有情況下都這樣做,設定一個 key 屬性可以讓 Stencil 確保在渲染時能夠匹配新舊子節點,從而避免
不必要地重新創建 DOM 節點,

不要使用陣列索引或其他非唯一值作為鍵,嘗試確保每個子節點都有一個不變的 key,并且在其所有兄弟節點中是唯一的,

處理用戶輸入

Stencil 使用原生的 DOM 事件,

下面是一個處理按鈕點擊的例子,注意箭頭函式的使用,

...
export class MyComponent {
  private handleClick = () => {
    alert('Received the button click!');
  }

  render() {
    return (
      <button onClick={this.handleClick}>Click Me!</button>
    );
  }
}

這是另一個監聽輸入變化的例子,注意箭頭函式的使用,

...
export class MyComponent {
  private inputChanged = (event: Event) => {
    console.log('input changed: ', (event.target as HTMLInputElement).value);
  }

  render() {
    return (
      <input onChange={this.inputChanged}/>
    );
  }
}

復雜的模板內容(Complex Template Content)

到目前為止,我們已經看到了如何只回傳一個根元素的例子,我們也可以在根元素中嵌套元素

在組件有多個“頂級”元素的情況下,render 函式可以回傳一個陣列,注意 div 元素,

render() {
  return ([
  // first top level element
  <div >
    <ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
    </ul>
  </div>,

  // second top level element, note the , above
  <div >
    ... more html content ...
  </div>
  ]);
}

或者你可以使用 Fragment 函陣列件,在這種情況下你不需要添加逗號:

import { Fragment } from '@stencil/core';
...
render() {
  return (<Fragment>
    // first top level element
    <div >
      <ul>
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
      </ul>
    </div>

    <div >
      ... more html content ...
    </div>
  </Fragment>);
}

也可以使用 innerHTML 直接將內容行內到元素中,例如,當動態加載一個 svg,然后想要在 div 中渲染它時,這就很有用了,這就像在普通的 HTML 中一樣:

<div innerHTML={svgContent}></div>

獲取 DOM 元素的參考

jsx 中使用 ref 屬性來獲取 dom 的參考,示例如下

@Component({
    tag: "app-home",
})
export class AppHome {
    textInput!: HTMLInputElement;

    handleSubmit = (event: Event) => {
        event.preventDefault();
        console.log(this.textInput.value);
    };

    render() {
        return (
            <form onSubmit={this.handleSubmit}>
                <label>
                    Name:
                    <input
                        type="text"
                        ref={(el) => (this.textInput = el as HTMLInputElement)}
                    />
                </label>
                <input type="submit" value="https://www.cnblogs.com/guojikun/p/Submit" />
            </form>
        );
    }
}

避免共享 JSX 節點

在 jsx 中應該避免共享 jsx 節點,每一個 jsx 節點應該都是唯一的,這是因為在再次渲染時會遇到問題,

@Component({
  tag: 'my-cmp',
})
export class MyCmp {

  render() {
-    const sharedNode = <div>Text</div>;
    return (
      <div>
-        {sharedNode}
-        {sharedNode}
+        <div>Text</div>
+        <div>Text</div>
      </div>
    );
  }
}

或者,可以創建一個工廠函式來回傳一個通用的 JSX 節點,因為回傳值將是一個唯一的實體, 示例如下:

@Component({
    tag: "my-cmp",
})
export class MyCmp {
    getText() {
        return <div>Text</div>;
    }

    render() {
        return (
            <div>
                {this.getText()}
                {this.getText()}
            </div>
        );
    }
}

結束語

至此,我們已經基本把 StencilJs 的相關基礎知識已經學習的差不多了,在下一個章節中將會使用之前學習到的知識來開發一個常用的組件,
由于我們只是使用 StencilJs 來開發 web component 組件,其它不想關的知識(router)便不再講解,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/555735.html

標籤:JavaScript

上一篇:記錄--前端實作檔案預覽(pdf、excel、word、圖片)

下一篇:返回列表

標籤雲
其他(161425) Python(38243) JavaScript(25512) Java(18251) C(15238) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7260) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1970) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • StencilJs 學習之 JSX

    Stencil 組件使用 `JSX` 渲染,這是一種流行的宣告式模板語法。每個組件都有一個渲染函式,它回傳在運行時渲染到 DOM 的組件樹。 ## 基礎用法 `render` 函式用于輸出將繪制到螢屏上的組件樹。 ```ts class MyComponent { render() { return ......

    uj5u.com 2023-06-21 09:07:35 more
  • 記錄--前端實作檔案預覽(pdf、excel、word、圖片)

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前端實作檔案預覽功能 需求:實作一個在線預覽pdf、excel、word、圖片等檔案的功能。 介紹:支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代碼實作所有功能,建議以下的預覽檔案標簽可以在外層包裹一層彈窗 ......

    uj5u.com 2023-06-21 08:34:40 more
  • js如何操作video標簽

    一.簡介 在做web ui自動化時,遇到操作視頻的時候有時比較讓人頭疼,定位時會發現只有一個<video>標簽,用selenium來實作的話比較麻煩,使用js后我們只需定位到video標簽,然后通過js 中處理video的相關屬性和方法就可實作,我們繼續往下看。 二.實體用法 1.獲取視頻的總時長( ......

    uj5u.com 2023-06-21 08:34:32 more
  • 搭建自動化 Web 頁面性能檢測系統 —— 實作篇

    >我們是[袋鼠云數堆疊 UED 團隊](http://ued.dtstack.cn/),致力于打造優秀的一站式資料中臺產品。我們始終保持工匠精神,探索前端道路,為社區積累并傳播經驗價值。。 >本文作者:琉易 [liuxianyu.cn](https://link.juejin.cn/?target=h ......

    uj5u.com 2023-06-21 08:34:16 more
  • StencilJs學習之事件

    其實并沒有所謂的 stencil Event,相反 stencil 鼓勵使用 `DOM event`。然而,Stencil 提供了一個 API 來指定組件可以觸發的事件,以及組件監聽的事件。 這是通過 Event()和 Listen()裝飾器實作的。 ## Event 裝飾器 組件可以使用事件發射器 ......

    uj5u.com 2023-06-21 08:34:06 more
  • CSS3有哪些新特性

    CSS3引入了很多新特性,比如: 1. 選擇器:CSS3引入了新的選擇器,如偽類選擇器、偽元素選擇器等,使得選擇元素更加靈活和精確。 2. 邊框圓角:CSS3允許通過 border-radius 屬性為元素的邊框添加圓角,創建圓形、橢圓形或具有不同角度的矩形邊框。 3. 盒陰影:使用 box-sha ......

    uj5u.com 2023-06-21 08:34:02 more
  • js如何操作video標簽

    一.簡介 在做web ui自動化時,遇到操作視頻的時候有時比較讓人頭疼,定位時會發現只有一個<video>標簽,用selenium來實作的話比較麻煩,使用js后我們只需定位到video標簽,然后通過js 中處理video的相關屬性和方法就可實作,我們繼續往下看。 二.實體用法 1.獲取視頻的總時長( ......

    uj5u.com 2023-06-21 08:33:49 more
  • StencilJs學習之事件

    其實并沒有所謂的 stencil Event,相反 stencil 鼓勵使用 `DOM event`。然而,Stencil 提供了一個 API 來指定組件可以觸發的事件,以及組件監聽的事件。 這是通過 Event()和 Listen()裝飾器實作的。 ## Event 裝飾器 組件可以使用事件發射器 ......

    uj5u.com 2023-06-21 08:33:44 more
  • 搭建自動化 Web 頁面性能檢測系統 —— 實作篇

    >我們是[袋鼠云數堆疊 UED 團隊](http://ued.dtstack.cn/),致力于打造優秀的一站式資料中臺產品。我們始終保持工匠精神,探索前端道路,為社區積累并傳播經驗價值。。 >本文作者:琉易 [liuxianyu.cn](https://link.juejin.cn/?target=h ......

    uj5u.com 2023-06-21 08:33:11 more
  • CSS3有哪些新特性

    CSS3引入了很多新特性,比如: 1. 選擇器:CSS3引入了新的選擇器,如偽類選擇器、偽元素選擇器等,使得選擇元素更加靈活和精確。 2. 邊框圓角:CSS3允許通過 border-radius 屬性為元素的邊框添加圓角,創建圓形、橢圓形或具有不同角度的矩形邊框。 3. 盒陰影:使用 box-sha ......

    uj5u.com 2023-06-21 08:33:00 more