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

React+valtio響應(yīng)式狀態(tài)管理

 更新時(shí)間:2023年12月21日 15:09:33   作者:天問(wèn)_  
Valtio是一個(gè)很輕量級(jí)的響應(yīng)式狀態(tài)管理庫(kù),使用外部狀態(tài)代理去驅(qū)動(dòng)React視圖來(lái)更新,本文主要介紹了React+valtio響應(yīng)式狀態(tài)管理,感興趣的可以了解一下

Valtio 是一個(gè)很輕量級(jí)的響應(yīng)式狀態(tài)管理庫(kù)。valtio 讓數(shù)據(jù)管理在 React 和原生 JS (Vanilla) 中變得更加簡(jiǎn)單的一個(gè)庫(kù),它類(lèi)似于 Vue 的數(shù)據(jù)驅(qū)動(dòng)視圖的理念,使用外部狀態(tài)代理去驅(qū)動(dòng) React 視圖來(lái)更新。

React + Valtio

一、狀態(tài)管理庫(kù)

  • dispatch 流派(單向數(shù)據(jù)流-中心化管理):redux、zustand、dva 等
  • 響應(yīng)式流派(中心化管理):mobx、valtio 等
  • 原子狀態(tài)流派(原子組件化管理):recoil、jotai 等

值得一提的是:JotaiZustand、Valtio 這三個(gè)開(kāi)源狀態(tài)管理庫(kù)都是出自一人之手。
zustand 德語(yǔ) “狀態(tài)”,jotai 日語(yǔ) “狀態(tài)”、valtio 芬蘭語(yǔ) “狀態(tài)”。
作者叫做 Daishi Kato,他是日本東京人,是個(gè)全職開(kāi)源作者。

二、Jotai、Zustand、Valtio 使用對(duì)比

  • Zustand
import { create } from "zustand";

const useStore = create((set) => ({
  count: 0,
  inc: () => set((state) => ({ count: state.count + 1 })),
}));

export default function Counter() {
  const count = useStore((state) => state.count);
  const inc = useStore((state) => state.inc);

  return (
    <div>
      {count}
      <button onClick={inc}>+1</button>
    </div>
  );
}
  • Jotai:每個(gè)狀態(tài)都是原子化,用法和原生的 useState 有點(diǎn)像
import { atom, useAtom } from "jotai";

const countAtom = atom(0);

function Counter() {
  const [count, setCount] = useAtom(countAtom);

  return (
    <div>
      {count}
      <button onClick={() => setCount((v) => v + 1)}>+1</button>
    </div>
  );
}
  • Valtio:和 Vue 的響應(yīng)式類(lèi)似,當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候就驅(qū)動(dòng)視圖更新
const state = proxy({
  dur: 10,
  count: 1102
});
const incDur = () => {++state.dur};
const decDur = () => {--state.dur};
const incCount = () => {
  ++state.count;
  setTimeout(incCount, 100 * state.dur);
};

incCount();

export default function Main() {
  const snap = useSnapshot(state)

  return (
      <div>
        <h3>{snap.dur}</h3>
        <button
            disabled={snap.dur <= 1}
            onClick={decDur}>
          -
        </button>
        <button
            disabled={snap.dur >= 10}
            onClick={incDur}>
          +
        </button>
      </div>
  );
}

三、Valtio 狀態(tài)管理最佳實(shí)踐

  • 創(chuàng)建一個(gè) store.js 文件
import { proxy } from 'valtio'
import { useProxy } from 'valtio/utils'
import { cloneDeep } from 'lodash-es'

export const defaultData = {
  activeIndex: 0,
  rangeData: [5, 20],
  baseSelected: [],
  step: {
    1: true,
    2: false,
    3: false,
    4: false,
    5: false,
    6: false,
  },
}

const state = cloneDeep(defaultData)
const store = proxy(state)

export const useStore = () => {
  return useProxy(store)
}

export function resetData() {
  Object.entries(defaultData).forEach(
    ([key, value]) => {
      store[key] = cloneDeep(value)
    }
  )
}
  • 在組件中使用
import { useStore, resetData } from '@/store/store'

const tabs = [
  {
    value: '1',
    label: '基礎(chǔ)設(shè)置',
  },
  {
    value: '2',
    label: '高級(jí)設(shè)置',
  },
  {
    value: '3',
    label: '其他設(shè)置',
  }
]

const list = [
  {
    value: '1',
    label: '標(biāo)簽'
  },
  {
    value: '2',
    label: '分類(lèi)'
  },
  {
    value: '3',
    label: '作者'
  },
]

export default function Main() {
  const store = useStore()

  useEffect(() => {
    return () => {
      // 在組件卸載的時(shí)候重置數(shù)據(jù)
      resetData()
    }
  }, []);

  function onSelect(id) {
    if (store.baseSelected.includes(id)) {
      store.baseSelected =
          store.baseSelected.filter(
              (item) => item !== id
          )
    } else {
      if (store.baseSelected.length >= 5) return
      store.baseSelected.push(id)
    }
  }
    
  return (
    <div>
      {
        tabs.map(({ value, label }, index) => (
          <div
            key={value}
            onClick={() => {
              store.activeIndex = index
            }}
          >
            {label}
          </div>
        ))
      }
      <hr/>
      {
        list.map(({ value, label }) => (
          <div
            key={value}
            onClick={() => {
              onSelect(value)
            }}
          >
            {label}
          </div>
        ))
      }
    </div>
  );
}

useProxy 其實(shí)就是對(duì)取 useSnapshot() 或 store 數(shù)據(jù)的封裝,這個(gè) hook 也很簡(jiǎn)單,就是判斷是渲染期間(渲染體內(nèi))就返回 useSnapshot() 的快照數(shù)據(jù),非渲染期間(非渲染體內(nèi))就返回原始的 store 數(shù)據(jù),和我們自己手寫(xiě)的是差不多的,只不過(guò)這個(gè) hook 幫我們把這個(gè)過(guò)程封裝了起來(lái)。

官方文檔:https://valtio.pmnd.rs/

到此這篇關(guān)于React+valtio響應(yīng)式狀態(tài)管理的文章就介紹到這了,更多相關(guān)React valtio響應(yīng)式狀態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 比ant更豐富Modal組件功能實(shí)現(xiàn)示例詳解

    比ant更豐富Modal組件功能實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了比ant更豐富Modal組件功能實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React父組件數(shù)據(jù)實(shí)時(shí)更新了,子組件沒(méi)有更新的問(wèn)題

    React父組件數(shù)據(jù)實(shí)時(shí)更新了,子組件沒(méi)有更新的問(wèn)題

    這篇文章主要介紹了React父組件數(shù)據(jù)實(shí)時(shí)更新了,子組件沒(méi)有更新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 關(guān)于React Native報(bào)Cannot initialize a parameter of type''NSArray<id<RCTBridgeModule>>錯(cuò)誤(解決方案)

    關(guān)于React Native報(bào)Cannot initialize a parameter of type''NSArra

    這篇文章主要介紹了關(guān)于React Native報(bào)Cannot initialize a parameter of type'NSArray<id<RCTBridgeModule>>錯(cuò)誤,本文給大家分享解決方案,需要的朋友可以參考下
    2021-05-05
  • react.js使用webpack搭配環(huán)境的入門(mén)教程

    react.js使用webpack搭配環(huán)境的入門(mén)教程

    本文主要介紹了react 使用webpack搭配環(huán)境的入門(mén)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • Reactjs?+?Nodejs?+?Mongodb?實(shí)現(xiàn)文件上傳功能實(shí)例詳解

    Reactjs?+?Nodejs?+?Mongodb?實(shí)現(xiàn)文件上傳功能實(shí)例詳解

    今天是使用?Reactjs?+?Nodejs?+?Mongodb?實(shí)現(xiàn)文件上傳功能,前端我們使用?Reactjs?+?Axios?來(lái)搭建前端上傳文件應(yīng)用,后端我們使用?Node.js?+?Express?+?Multer?+?Mongodb?來(lái)搭建后端上傳文件處理應(yīng)用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-06-06
  • 在React中編寫(xiě)樣式的六種方式

    在React中編寫(xiě)樣式的六種方式

    在React中,編寫(xiě)樣式主要有以下幾種方式,內(nèi)聯(lián)樣式,外部樣式表,CSS Modules,Styled Components,Emotion和Radium這六種樣式,下面我將針對(duì)上面提到的6種方式給出詳細(xì)的代碼示例,需要的朋友可以參考下
    2024-01-01
  • React網(wǎng)絡(luò)請(qǐng)求發(fā)起方法詳細(xì)介紹

    React網(wǎng)絡(luò)請(qǐng)求發(fā)起方法詳細(xì)介紹

    在編程開(kāi)發(fā)中,網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求是必不可少的,這篇文章主要介紹了React網(wǎng)絡(luò)請(qǐng)求發(fā)起方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • 如何深入理解React的ref 屬性

    如何深入理解React的ref 屬性

    關(guān)于 Refs ,React 官網(wǎng)講解的對(duì)于新手來(lái)說(shuō)不太友好,還是自己一字一句解讀后并以代碼驗(yàn)證的方式后真正理解的.
    2021-05-05
  • 使用ES6語(yǔ)法重構(gòu)React代碼詳解

    使用ES6語(yǔ)法重構(gòu)React代碼詳解

    本篇文章主要介紹了使用ES6語(yǔ)法重構(gòu)React代碼詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • React避免不必要的重新渲染的方法示例

    React避免不必要的重新渲染的方法示例

    構(gòu)建高性能?React?應(yīng)用程序的關(guān)鍵之一是避免不必要的重新渲染,React?的渲染引擎是高效的,但防止在不需要的地方重新渲染仍然至關(guān)重要,在這篇文章中,我們將介紹常見(jiàn)錯(cuò)誤以及如何避免它們,需要的朋友可以參考下
    2024-10-10

最新評(píng)論

随州市| 海口市| 蓬溪县| 高密市| 大理市| 宝鸡市| 许昌县| 鹿邑县| 绍兴市| 观塘区| 永靖县| 徐州市| 罗平县| 讷河市| 福鼎市| 施秉县| 庄河市| 昂仁县| 肇东市| 松溪县| 揭东县| 阳城县| 景谷| 新野县| 咸阳市| 芒康县| 内丘县| 洞头县| 罗山县| 昆山市| 长白| 视频| 绥滨县| 巴林左旗| 南漳县| 扶绥县| 青川县| 亳州市| 扎鲁特旗| 奎屯市| 略阳县|