成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學不完的框架,舔不完的面,Qwik,你到底想干啥

開發 前端
useSignal?,雖然讓我想起來了熟悉地SolidJS?,但是看寫法,這不就是vue3的ref?嗎?是的,看起來很像,那有沒有類似reactive呢?

最近我又又雙學習了一個新框架,qwik

圖片

真的沒完沒了了,

圖片

不過作為"前端娛樂圈戰地記者",我繼續幫大家踩雷。

圖片

?? 同系列閱讀

  • 學不完的框架,??啄不完的米,SolidJS,你到底愛誰???
  • ??超級簡單的Svelte,學不會你來打我
  • 真心希望不會有燒不斷地鎖這篇文章!!!

?? 初識qwik

廢話不多說,我們先上代碼。一個簡單的計數器功能

?? useSignal

const App = component$(() => {
  
  const count = useSignal(0);

  return (
    <>
      <button onClick$={() => count.value++}>+</button>
      <div>{count.value}</div>
    </>
  );
});

讓我們給這個計數器加上監聽事件(后面會詳細講)

useVisibleTask$(({ track }) => {
    track(() => console.log(count.value))
  })

圖片

sigal.gif

useSignal,雖然讓我想起來了熟悉地SolidJS,但是看寫法,這不就是vue3的ref嗎?是的,看起來很像,那有沒有類似reactive呢?

?? useStore

當然有啊,useSignal是針對基本變量的。對于非基本類型可以使用useStore。

const App = component$(() => {
  
  const data = useStore({count: 0})

  return (
    <>
      <button onClick$={() => data.count++}>+</button>
      <p>{data.count}</p>
    </>
  );
});

圖片

sigal.gif

useStore可以提供方法,不過比較復雜:

import {
  $,
  type QRL
} from "@builder.io/qwik";
 
type Store = {
  count: number
  add: QRL<(this: Store) => void>
}

const App = component$(() => {
  const data = useStore<Store>({
    count: 0,
    add: $(function(this) {
        this.count++;
    })
  })
  return (
    <>
      <button onClick$={() => data.add()}>+</button>
      <p>{data.count}</p>
    </>  
  );
}

圖片

sigal.gif

?? useComputed$

reactive有了,computed是不是也應該有啊,來了,它就是useComputed$

const capitalizedName = useComputed$(() => {
    return count.value + 'mmdctjj';
  });

  useVisibleTask$(({ track }) => {
    track(() => console.log(capitalizedName.value))
  })

圖片

computer.gif

?? useContext

那依賴注入有沒有啊?抱歉,沒有,因為qwik是基于jsx的框架,所以只有拿useContext來將就了

type Store = {
  count: number
  add: QRL<(this: Store) => void>
}
// ?? 創建全局的上下文
const context = createContextId<Store>('uuid')

const App = component$(() => {

  const data = useStore<Store>({
    count: 0, 
    add: $(function(this) 
      this.count++;
    })
  })
  // ?? provider數據
  useContextProvider(context, data);
  
  return (
    <>
      <button onClick$={() => data.add()}>+</button>
      <p>{data.count}</p>
    </>  
  );
}

const Child = component$(() => {
  // ?? 消費上下文
  const data = useContext(context)
  
  return (
    <>
      <Child />
    </>  
  );
}

好吧,接下來我們說些不一樣的

?? useTask$ or useVisibleTask$

上面的例子中,我們所有的監聽事件都是通過useVisibleTask$實現的。雖然它看起來和useEffect類似,但是卻有著很大的區別。

這得從qwik的架構說起,首先qwik是個服務端渲染的框架,相當于Next.js(基于React服務端渲染框架)、 Nuxt.js(基于Vue地服務端渲染框架),換句話說,它天生支持服務端渲染的前端框架。所以一個組件的生命周期是從服務器開始的。

useTask$ -------> RENDER ---> useVisibleTask$
|| --- SERVER or BROWSER --- | ----- BROWSER ----- || 
                        pause|resume

它們都是用來注冊任務的鉤子函數,這個任務在服務端僅僅執行一次,在客戶端可能多次渲染。

下面是具體的區別

?? useTask$

useTask$首先在服務端執行一次,如果客戶端使用track訂閱依賴了,那么當客戶端渲染之后觸發更新時,任務會在客戶端再次執行。如果沒有track,那么僅僅在客戶端執行一次。

const App = component$(() => {
  
  const count = useSignal(0);
  
  useTask$(({ track }) => {
    track(() => console.log(count.value))
  })

  return (
    <>
      <button onClick$={() => count.value++}>+</button>
      <div>{count.value}</div>
    </>
  );
});

圖片

task.gif

頁面刷新后服務端也執行了一次任務

?? useVisibleTask$

useVisibleTask$:僅僅在瀏覽器執行,渲染之后立馬執行,當訂閱的參數發生改變時,任務會被再次執行。

const App = component$(() => {
  
  const count = useSignal(0);
  
  useVisibleTask$(({ track }) => {
    track(() => console.log(count.value))
  })

  return (
    <>
      <button onClick$={() => count.value++}>+</button>
      <div>{count.value}</div>
    </>
  );
});

圖片

taskvis.gif

它們還有一個特別重要的參數cleanup,每次新的任務被觸發時,都會執行上次任務的cleanup。另外組件被移除時也會被執行。

useVisibleTask$(({ track, cleanup  }) => {
    // console.log('I am excuted!')
    track(() => console.log(count.value))
    cleanup(() => console.log('last'))
  })

圖片

cleanup.gif

我們可以看到,每次任務觸發都是先打印last,然后才是最新的count.value

另外,還有一個重要的配置項:{ strategy: 'document-ready' },此時,會在頁面加載完畢立馬執行。

useVisibleTask$(() => {
    // 渲染完畢之后執行
    console.log(2222)
  })
  useVisibleTask$(() => {
    // document-ready立馬執行
    console.log(1111)
  }, { strategy: 'document-ready' })

此時console的打印結果是先1111,然后是2222。

?? 幫它模擬完整的生命周期

綜上,我們可以模擬出一個完整的生命周期,

唯一的瑕疵是before update會在組件銷毀時和unmount一起執行一次。

useVisibleTask$(() => {
    console.log('before mounted!')
  }, { strategy: 'document-ready' })
  
  useVisibleTask$(({ cleanup }) => {
    console.log('mounted!')
    cleanup(() => console.log('unmount'))
  })
  
  useVisibleTask$(({ track, cleanup }) => {
    track(() => console.log('updated!', count.value))
    cleanup(() => console.log('before update'))
  })

圖片

?? 總結

qwik上線一年不到已經17.9k地star了,足見它地優秀了!

責任編輯:武曉燕 來源: 萌萌噠草頭將軍
相關推薦

2020-11-18 13:24:02

廣告彈窗網信互聯網

2009-09-11 09:36:53

李開復

2023-02-28 11:59:59

2017-04-13 08:46:41

oracle數據挖掘

2017-03-10 16:32:44

Apache Spar大數據工具

2012-06-04 13:06:05

微軟Windows 8

2023-05-04 10:43:42

Qwik前端框架

2023-03-01 10:19:23

2012-12-04 10:10:30

求職程序員

2009-09-23 11:59:48

Office 2010Web程序漏洞

2015-09-01 10:42:15

編程規范完全指南

2021-08-13 05:47:48

通信設計院通信行業設計院

2010-08-16 10:39:59

虛擬化

2018-08-03 08:40:01

LinuxBash

2021-07-25 17:50:27

微軟Windows 11Windows

2025-04-29 00:00:00

超節點SuperPod大模型

2009-06-05 14:15:09

Google SquaGoogleLabs

2015-10-10 10:02:44

程序員面試指南

2021-06-01 06:03:28

Css前端CSS 特效

2015-03-04 10:11:59

IE漏洞
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产一级片 | 欧洲精品一区 | 97人人爱 | 精品久久久久久18免费网站 | 三级黄色片在线 | 亚洲福利一区 | 亚洲综合婷婷 | 91色在线视频 | 欧美影院| 久久一久久 | 99爱在线观看 | 99精品视频一区二区三区 | 四虎最新地址 | 秋霞在线一区二区 | 欧美一区二区三区久久精品 | 久久99久久99精品免视看婷婷 | 在线看av网址 | 中文字幕一区在线观看视频 | 国产精品久久二区 | 男女啪啪网址 | 欧美成人猛片aaaaaaa | 久久中文视频 | 国产成人综合亚洲欧美94在线 | 亚洲高清在线观看 | 日韩 国产 在线 | 成人在线免费网站 | 国产欧美久久一区二区三区 | 日韩欧美视频在线 | 欧美一区二区三区在线观看视频 | 亚洲国产欧美91 | 免费看黄视频网站 | 色播久久| 欧美日韩综合精品 | 最新高清无码专区 | 黄色在线免费看 | 国产91精品久久久久久久网曝门 | 日本精品在线观看 | 青青草原综合久久大伊人精品 | 在线观看免费国产 | av在线免费观看网站 | 精品三区 |