React基礎學習-Day06

React基礎學習-Day06

zustand基本使用方式

1.基礎使用

基本使用 zustand 的步驟包括創建狀態存儲和在組件中使用這些狀態和更新函數。以下是一個基礎的示例,演示如何使用 zustand 來管理一個簡單的計數器狀態。

安裝

首先,確保你的項目中已經安裝了 zustand

npm install zustand

或者使用 yarn:

yarn add zustand

創建和使用狀態存儲

  1. 創建狀態存儲:

使用 create 函數來創建一個狀態存儲。在回調函數中,定義狀態對象及其更新函數。

// counterStore.jsimport create from 'zustand';const useCounterStore = create((set) => ({count: 0,increment: () => set((state) => ({ count: state.count + 1 })),decrement: () => set((state) => ({ count: state.count - 1 })),
}));export default useCounterStore;

在這個示例中:

  • count 是狀態的初始值,初始化為 0。
  • incrementdecrement 是更新函數,分別用于增加和減少 count 的值。
  1. 在組件中使用狀態:

在需要使用狀態的 React 組件中,使用 useCounterStore Hook 來獲取狀態和更新函數。然后,可以直接在組件中使用這些函數來更新狀態。

import React from 'react';
import useCounterStore from './counterStore';const CounterComponent = () => {const { count, increment, decrement } = useCounterStore();return (<div><p>Count: {count}</p><button onClick={increment}>Increment</button><button onClick={decrement}>Decrement</button></div>);
};export default CounterComponent;

在這個組件中:

  • 使用 useCounterStore Hook 來獲取 countincrementdecrement 更新函數。
  • 每當按鈕被點擊時,對應的更新函數將被調用,從而更新 count 的值。

總結

使用 zustand 可以簡化和管理 React 應用程序中的狀態。通過 create 函數創建狀態存儲,定義狀態和更新函數。然后,在組件中使用相應的 Hook 來獲取和更新狀態,從而實現組件之間的狀態共享和管理。這種方式不僅簡潔直觀,而且基于 React Hooks,適用于函數組件中的狀態管理。

當然可以,請稍等。

以下是帶有保留專用名詞的翻譯:

2.切片模式

在 Zustand 中,切片模式是一種將主要存儲區分割為較小、更易管理的存儲單元的技術。每個存儲單元負責特定的狀態和操作,有助于保持模塊化并隨著應用程序的增長改善代碼組織。

示例切片

以下是如何使用 Zustand 創建和組合單獨切片的示例:

Fish 切片
// fishSlice.js
export const createFishSlice = (set) => ({fishes: 0,addFish: () => set((state) => ({ fishes: state.fishes + 1 })),
});
Bear 切片
// bearSlice.js
export const createBearSlice = (set) => ({bears: 0,addBear: () => set((state) => ({ bears: state.bears + 1 })),eatFish: () => set((state) => ({ fishes: state.fishes - 1 })),
});
合并切片成為綁定存儲
// useBoundStore.js
import { create } from 'zustand';
import { createBearSlice } from './bearSlice';
import { createFishSlice } from './fishSlice';export const useBoundStore = create((set) => ({...createBearSlice(set),...createFishSlice(set),
}));

在 React 組件中的使用

然后,您可以在 React 組件中使用 useBoundStore 來訪問和更新組合狀態:

import React from 'react';
import { useBoundStore } from './useBoundStore';function App() {const bears = useBoundStore((state) => state.bears);const fishes = useBoundStore((state) => state.fishes);const addBear = useBoundStore((state) => state.addBear);return (<div><h2>熊的數量:{bears}</h2><h2>魚的數量:{fishes}</h2><button onClick={() => addBear()}>添加一只熊</button></div>);
}export default App;

更新多個切片

如果需要同時更新多個切片,您可以創建一個組合操作:

// createBearFishSlice.js
export const createBearFishSlice = (set, get) => ({addBearAndFish: () => {get().addBear();get().addFish();},
});
將所有商店合并在一起與以前相同。
import { create } from 'zustand'
import { createBearSlice } from './bearSlice'
import { createFishSlice } from './fishSlice'
import { createBearFishSlice } from './createBearFishSlice'export const useBoundStore = create((...a) => ({...createBearSlice(...a),...createFishSlice(...a),...createBearFishSlice(...a),
}))

添加中間件

您還可以將中間件應用于組合存儲,增強其功能:

// useBoundStore.js with middleware
import { create } from 'zustand';
import { createBearSlice } from './bearSlice';
import { createFishSlice } from './fishSlice';
import { persist } from 'zustand/middleware';export const useBoundStore = create(persist((set) => ({...createBearSlice(set),...createFishSlice(set),}),{ name: 'bound-store' })
);
中間件解釋:

在上下文中使用 persist 中間件時,它通常會將狀態持久化到瀏覽器的本地存儲中,例如使用 localStorage。具體來說,它將狀態數據序列化為字符串并存儲在瀏覽器提供的持久化存儲中,以確保即使在頁面刷新或關閉后,數據仍然可以被讀取和恢復。

主要點概述:

  1. localStorage:

    • localStorage 是瀏覽器提供的一個持久化存儲機制,允許網頁存儲鍵值對數據。
    • 使用 persist 中間件時,它默認會將狀態數據序列化為 JSON 字符串,并存儲在 localStorage 中。
  2. 數據位置:

    • 持久化的數據存儲在瀏覽器的 localStorage 中,與當前網站域名相關聯。
    • 數據以鍵值對的形式存儲,鍵是配置中指定的名稱(例如 { name: 'bound-store' } 中的 'bound-store')。
  3. 持久化機制:

    • 當應用程序使用 set 函數來更新 Zustand 中的狀態時,persist 中間件會捕獲這些更新,并將新的狀態數據序列化后存儲到 localStorage
    • 在頁面刷新或重新加載后,可以通過讀取 localStorage 中相應的鍵來恢復存儲的狀態數據,從而實現數據的持久化和恢復功能。
  4. 配置選項:

    • persist 中間件的配置選項允許您指定存儲的名稱、存儲路徑或其他相關設置,以便更精細地控制數據的存儲和管理。

通過使用 persist 中間件,您可以輕松地在 Zustand 狀態管理中實現數據的持久化,這對于需要在用戶會話之間保持狀態或保存用戶偏好設置的應用程序特別有用。

總結

Zustand 中的切片模式使您能夠在 React 應用程序中保持可擴展和組織良好的狀態管理方法。通過將主存儲分解為更小、專注的切片,您可以提高模塊化程度、簡化測試并增強代碼庫的可維護性。這是管理復雜應用程序狀態的強大模式。

3.create函數

在 Zustand 中,create 函數用于創建狀態存儲。create 函數的第一個參數是一個狀態創建器(state creator)函數。這個狀態創建器函數接收一組參數,這些參數用于管理和修改狀態。通常,這些參數包括 setget 和其他可能的工具函數。

狀態創建器函數的參數列表

  1. set:

    • 用于更新狀態的函數。
    • 典型的用法是 set((state) => ({ ...state, someProperty: newValue })),它接收一個函數,這個函數的參數是當前的狀態,返回值是新的狀態部分對象。
  2. get:

    • 用于獲取當前狀態的函數。
    • 可以通過 get() 來訪問當前的狀態值,常用于讀取狀態的當前值以便在更新時參考。
  3. api:

    • 代表整個 Zustand 存儲 API 的對象。
    • 包含其他有用的方法和工具,可以用于更高級的狀態管理需求。

參數列表示例

假設我們有一個簡單的狀態存儲,用于管理一個計數器和一個名稱屬性,狀態創建器函數的參數列表如下:

import create from 'zustand';const useStore = create((set, get, api) => ({count: 0,name: 'Zustand',increment: () => set((state) => ({ count: state.count + 1 })),reset: () => {const currentName = get().name;set({ count: 0, name: 'Zustand' });console.log('Reset done for', currentName);},apiFunction: () => {console.log('Store API:', api);}
}));export default useStore;

參數詳細說明

  1. set:

    • 類型(partial: Partial<State> | ((state: State) => Partial<State>)) => void
    • 用途:更新狀態。
    • 示例set((state) => ({ count: state.count + 1 }))
  2. get:

    • 類型() => State
    • 用途:獲取當前狀態。
    • 示例const currentCount = get().count
  3. api:

    • 類型StoreApi<State>
    • 用途:訪問存儲 API。
    • 示例api.getState()

示例解釋

  • countname 是狀態屬性。
  • increment 是一個方法,使用 set 函數更新 count
  • reset 方法使用 get 函數讀取當前的 name,然后重置 countname
  • apiFunction 方法展示了如何使用 api 對象。

總結

Zustand 的 create 函數接受一個狀態創建器函數,該函數可以接收三個參數:setgetapi。這些參數提供了更新和獲取狀態的功能,以及對 Zustand 存儲 API 的訪問。通過這些工具,您可以靈活地管理狀態并實現復雜的狀態邏輯。

5.create中的參數API

在 Zustand 中,api 對象是整個存儲 API,它提供了對狀態存儲的全面控制。這個 api 對象可以通過狀態創建器函數的第三個參數訪問。api 對象包括以下常見方法和屬性:

  1. setState(partialState, replace?):

    • 更新狀態。
    • partialState 是一個部分狀態對象或函數,它接收當前狀態并返回部分狀態對象。
    • replace 是一個可選的布爾值,指示是否替換整個狀態。
  2. getState():

    • 獲取當前狀態。
    • 返回當前狀態對象。
  3. subscribe(listener):

    • 訂閱狀態變化。
    • listener 是一個函數,每當狀態改變時都會被調用。
    • 返回一個取消訂閱的函數。
  4. destroy():

    • 銷毀存儲,清理所有訂閱。

示例代碼

import create from 'zustand';const useStore = create((set, get, api) => ({count: 0,increment: () => set((state) => ({ count: state.count + 1 })),reset: () => {const currentState = get();set({ count: 0 });console.log('State has been reset:', currentState);},printApi: () => {console.log('Store API:', api);}
}));export default useStore;

使用說明

  1. setState(partialState, replace?):

    • 用于更新狀態。

    • 示例:

      api.setState({ count: 10 });
      api.setState((state) => ({ count: state.count + 1 }));
      api.setState({ count: 0 }, true);  // 完全替換狀態
      
  2. getState():

    • 用于獲取當前狀態。

    • 示例:

      const state = api.getState();
      console.log('Current state:', state);
      
  3. subscribe(listener):

    • 用于訂閱狀態變化。

    • 示例:

      const unsubscribe = api.subscribe((newState) => {console.log('State changed:', newState);
      });// 取消訂閱
      unsubscribe();
      
  4. destroy():

    • 用于銷毀存儲,清理所有訂閱。

    • 示例:

      api.destroy();
      

總結

api 對象提供了對 Zustand 存儲的全面控制,通過它可以更新狀態、獲取當前狀態、訂閱狀態變化以及銷毀存儲。了解這些方法有助于更靈活和高效地管理 Zustand 狀態。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46016.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

socket編程(2) -- TCP通信

TCP通信 2. 使用 Socket 進行TCP通信2.1 socket相關函數介紹socket()bind()listen()accept()connect()2.2 TCP協議 C/S 模型基礎通信代碼 最后 2. 使用 Socket 進行TCP通信 Socket通信流程圖如下&#xff1a; 這里服務器段listen是監聽socket套接字的監聽文件描述符。如果客戶…

Redis--布隆過濾器

解決緩存穿透是構建高效緩存系統中的關鍵問題之一。緩存穿透指的是惡意或者非法請求經過緩存層直接訪問數據庫或者后端服務&#xff0c;導致系統資源浪費和性能下降的情況。為了有效應對緩存穿透問題&#xff0c;以下是幾種常見的解決方法&#xff1a; 1. 布隆過濾器預檢查 布…

運維-Docker-黑馬

運維-Docker-黑馬 編輯時間&#xff1a;2024/7/15 來源&#xff1a;黑馬程序員 docker&#xff1a;快速構建&#xff0c;運行&#xff0c;管理應用的工具 Docker安裝 部署mysql 命令解讀

[Cesium for Supermap] 加載3dTiles,點擊獲取屬性

代碼&#xff1a; // 設為橢球var obj [6378137.0, 6378137.0, 6356752.3142451793];Cesium.Ellipsoid.WGS84 Object.freeze(new Cesium.Ellipsoid(obj[0], obj[1], obj[2]));var viewer new Cesium.Viewer(cesiumContainer);var scene viewer.scenescene.lightSource.ambi…

Oracle TDE(Transparent Data Encryption) 常見問題解答 - 官網

此FAQ來源于官網鏈接。此為新版&#xff0c;老版的博客參見Oracle TDE(Transparent Data Encryption) 常見問題解答。 通用問題 透明數據加密 (TDE) 提供什么功能&#xff1f; TDE 以透明方式加密 Oracle 數據庫中的靜態數據。它可以阻止操作系統未經授權嘗試訪問存儲在文件…

徹底改變時尚:使用 GAN 實現 AI 的未來

徹底改變時尚&#xff1a;使用 GAN 實現 AI 的未來 一、介紹 想象一下&#xff0c;在這個世界里&#xff0c;時裝設計師永遠不會用完新想法&#xff0c;我們穿的每一件衣服都是一件藝術品。聽起來很有趣&#xff0c;對吧&#xff1f;好吧&#xff0c;我們可以在通用對抗網絡 &a…

鴻蒙基本工程目錄

工程級目錄 AppScope 中存放應用全局所需要的資源文件。entry 是應用的主模塊&#xff0c;存放 HarmonyOS 應用的代碼、資源等。oh_modules 是工程的依賴包&#xff0c;存放工程依賴的源文件。build-profile.json5 是工程級配置信息&#xff0c;包括簽名、產品配置等。hvigorf…

品牌產業出海指南如何搭建國際化架構的跨境電商平臺?

在“品牌&產業出海指南 – 成功搭建跨境電商平臺”系列中&#xff0c;我們將從電商分銷系統、跨境平臺商城/多商戶商城系統和國際化架構三個方面對幫助您梳理不同平臺模式的優缺點、應用場景、開發重點和運營建議。 在“品牌&產業出海指南 – 成功搭建跨境電商平臺”系…

【漏洞復現】Rejetto HTTP文件服務器——遠程命令執行(CVE-2024-23692)

聲明&#xff1a;本文檔或演示材料僅供教育和教學目的使用&#xff0c;任何個人或組織使用本文檔中的信息進行非法活動&#xff0c;均與本文檔的作者或發布者無關。 文章目錄 漏洞描述漏洞復現測試工具 漏洞描述 Rejetto HTTP文件服務器是一個輕量級的HTTP服務器軟件&#xff…

VBA學習(20):一批簡單的Excel VBA編程問題解答

1.如何確定單元格區域內的行數和列數&#xff1f; 使用Range.Rows.Count和Range.Columns.Count屬性。 2.Application.Columns指的是什么&#xff1f; 活動工作表中的列。 3.你的程序在列B位置插入一個新列&#xff0c;原來的列B會怎樣&#xff1f; 它向右移動成為列C。 4.假…

vue項目1分鐘實現自定義右鍵菜單,懶人的福音

高效實現需求&#xff0c;避免重復造輪子&#xff0c;今天給大家分享的是&#xff0c;如何在最短的時間內實現右鍵菜單&#xff0c;方法也很簡單&#xff0c;一個插件就可以搞定&#xff0c;話不多說&#xff0c;上效果圖&#xff1a; 1. 效果圖&#xff1a; 2. 安裝&#xff…

5. 基于Embedding實現超越elasticsearch高級搜索

Embedding介紹 Embedding是向量的意思&#xff0c;向量可以理解為平面坐標中的一個坐標點(x,y),在編程領域&#xff0c;一個二維向量就是一個大小為float類型的數組。也可以用三維坐標系中的向量表示一個空間中的點。在機器學習中&#xff0c;向量通常用于表示數據的特征。 向量…

SCI丨中三區

無線網絡遙感圖像和視頻處理技術在xxxxx析基于智能物聯網的xxxxx養老模式可持續發展基于心理行為大數據分類算法xxxxxx研究基于云計算xxxxx行為分析及客戶感知體系的構建基于機器學習的xxxxx金鋼時效行為研究 基于機器視覺的xxxxx檢測系統研究 機器學習的電子顯微鏡xxxxx材料的…

探索Laravel的視圖組件與插槽:構建動態且可復用的UI

探索Laravel的視圖組件與插槽&#xff1a;構建動態且可復用的UI 引言 Laravel作為一個現代化的PHP框架&#xff0c;提供了許多強大的功能來幫助開發者構建高性能和可維護的Web應用。其中&#xff0c;視圖組件&#xff08;View Components&#xff09;和插槽&#xff08;Slots…

【React Hooks原理 - forwardRef、useImperativeHandle】

概述 上文我們聊了useRef的使用和實現&#xff0c;主要兩個用途&#xff1a;1、用于持久化保存 2、用于綁定dom。 但是有時候我們需要在父組件中訪問子組件的dom或者屬性/方法&#xff0c;而React中默認是不允許父組件直接訪問子組件的dom的&#xff0c;這時候就可以通過forwa…

數據庫SQL Server列拼接Join和Union

文章目錄 JOINJOIN的基本語法如下&#xff1a; UNIONUNION的基本語法如下&#xff1a; 在 SQL Server中&#xff0c; JOIN和 UNION是兩種不同的操作&#xff0c;它們用于合并來自兩個或多個表的數據。 JOIN JOIN操作用于將兩個或多個表中的行結合起來&#xff0c;基于它們之…

Jmeter二次開發Demo

Jmeter二次開發Demo 前言 在上一集&#xff0c;我們已經完成了JMX腳本的分析&#xff0c;大致了解了JMX腳本的基本元素。 那么在這一集&#xff0c;我們將會介紹一下Jmeter二次開發的Demo。 Demo代碼 那么話不多說&#xff0c;我們就直接上代碼。 public class TestStress…

SpringBoot+HttpClient實現文件上傳下載

服務端&#xff1a;SpringBoot Controller package com.liliwei.controller;import java.io.File; import java.io.FileInputStream; import java.io.IOException;import javax.servlet.http.HttpServletResponse;import org.springframework.http.HttpHeaders; import org.s…

Cesium 判斷位置是否在當前視口范圍內

詳細步驟都在注釋里,不過多贅述了。 /*** @param {Object} position - Cartesian3坐標* @return {Boolean} 是否在視口中*/ function isPositionInViewport(position) {// 獲取當前視口范圍let viewport = viewer.camera.computeViewRectangle();// 2D模式下拾取不到坐標,vi…

類和對象的簡述(c++篇)

開局之前&#xff0c;先來個小插曲&#xff0c;放松一下&#xff1a; 讓我們的熊二來消滅所有bug 各位&#xff0c;在這祝我們&#xff1a; 放松過后&#xff0c;開始步入正軌吧。愛學習的鐵子們&#xff1a; 目錄&#xff1a; 一類的定義&#xff1a; 1.簡述&#xff1a; 2…