91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

React狀態管理的規則有哪些

發布時間:2021-08-02 11:32:39 來源:億速云 閱讀:124 作者:Leah 欄目:開發技術

React狀態管理的規則有哪些,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。


No.1 一個關注點

有效狀態管理的第一個規則是:

使狀態變量負責一個問題。

使狀態變量負責一個問題使其符合單一責任原則。

讓我們來看一個復合狀態的示例,即一種包含多個狀態值的狀態。

const [state, setState] = useState({
    on: true,
    count: 0
});

state.on    // => true
state.count // => 0

狀態由一個普通的 JavaScript 對象組成,該對象具有 on 和 count 屬性。

第一個屬性 state.on 包含一個布爾值,表示開關。同樣,``state.count` 包含一個表示計數器的數字,例如,用戶單擊按鈕的次數。

然后,假設你要將計數器加1:

// Updating compound state
setUser({
    ...state,
    count: state.count + 1
});

你必須將整個狀態放在一起,才能僅更新 count。這是為了簡單地增加一個計數器而調用的一個大結構:這都是因為狀態變量負責兩個方面:開關和計數器。

解決方案是將復合狀態分為兩個原子狀態 on 和 count:

const [on, setOnOff] = useState(true);
const [count, setCount] = useState(0);

狀態變量 on 僅負責存儲開關狀態。同樣,count 變量僅負責計數器。

現在,讓我們嘗試更新計數器:

setCount(count + 1);
// or using a callback
setCount(count => count + 1);

count 狀態僅負責計數,很容易推斷,也很容易更新和讀取。

不必擔心調用多個 useState() 為每個關注點創建狀態變量。

但是請注意,如果你使用過多的 useState() 變量,則你的組件很有可能就違反了“單一職責原則”。只需將此類組件拆分為較小的組件即可。

No.2 提取復雜的狀態邏輯

將復雜的狀態邏輯提取到自定義 hook 中。

在組件內保留復雜的狀態操作是否有意義?

答案來自基本面(通常會發生這種情況)。

創建 React hook 是為了將組件與復雜狀態管理和副作用隔離開。因此,由于組件只應關注要渲染的元素和要附加的某些事件偵聽器,所以應該把復雜的狀態邏輯提取到自定義 hook 中。

考慮一個管理產品列表的組件。用戶可以添加新的產品名稱。約束是產品名稱必須是唯一的。

第一次嘗試是將產品名稱列表的設置程序直接保留在組件內部:

function ProductsList() {
    const [names, setNames] = useState([]);  
    const [newName, setNewName] = useState('');

    const map = name => <div>{name}</div>;

    const handleChange = event => setNewName(event.target.value);
    const handleAdd = () => {    
        const s = new Set([...names, newName]);    
        setNames([...s]);  };
    return (
        <div className="products">
            {names.map(map)}
            <input type="text" onChange={handleChange} />
            <button onClick={handleAdd}>Add</button>
        </div>
    );
}

names 狀態變量保存產品名稱。單擊 Add 按鈕時,將調用 addNewProduct() 事件處理程序。

在 addNewProduct() 內部,用 Set 對象來保持產品名稱唯一。組件是否應該關注這個實現細節?不需要。

最好將復雜的狀態設置器邏輯隔離到一個自定義 hook 中。開始做吧。

新的自定義鉤子 useUnique() 可使每個項目保持唯一性:

// useUnique.js
export function useUnique(initial) {
    const [items, setItems] = useState(initial);
    const add = newItem => {
        const uniqueItems = [...new Set([...items, newItem])];
        setItems(uniqueItems);
    };
    return [items, add];
};

將自定義狀態管理提取到一個 hook 中后,ProductsList 組件將變得更加輕巧:

import { useUnique } from './useUnique';

function ProductsList() {
  const [names, add] = useUnique([]);  const [newName, setNewName] = useState('');

  const map = name => <div>{name}</div>;

  const handleChange = event => setNewName(e.target.value);
  const handleAdd = () => add(newName);
  return (
    <div className="products">
      {names.map(map)}
      <input type="text" onChange={handleChange} />
      <button onClick={handleAdd}>Add</button>
    </div>
  );
}

const [names, addName] = useUnique([]) 啟用自定義 hook。該組件不再被復雜的狀態管理所困擾。

如果你想在列表中添加新名稱,則只需調用 add('New Product Name') 即可。

最重要的是,將復雜的狀態管理提取到自定義 hooks 中的好處是:

  • 該組件不再包含狀態管理的詳細信息

  • 自定義 hook 可以重復使用

  • 自定義 hook 可輕松進行隔離測試

No.3 提取多個狀態操作

將多個狀態操作提取到化簡器中。

繼續用 ProductsList 的例子,讓我們引入“delete”操作,該操作將從列表中刪除產品名稱。

現在,你必須為 2 個操作編碼:添加和刪除產品。處理這些操作,就可以創建一個簡化器并使組件擺脫狀態管理邏輯。

同樣,此方法符合 hook 的思路:從組件中提取復雜的狀態管理。

以下是添加和刪除產品的 reducer 的一種實現:

function uniqueReducer(state, action) {
    switch (action.type) {
        case 'add':
            return [...new Set([...state, action.name])];
        case 'delete':
            return state.filter(name => name === action.name);
        default:
            throw new Error();
    }
}

然后,可以通過調用 React 的 useReducer()  hook 在產品列表中使用 uniqueReducer():

function ProductsList() {
    const [names, dispatch] = useReducer(uniqueReducer, []);
    const [newName, setNewName] = useState('');

    const handleChange = event => setNewName(event.target.value);

    const handleAdd = () => dispatch({ type: 'add', name: newName });
    const map = name => {
        const delete = () => dispatch({ type: 'delete', name });    
        return (
            <div>
                {name}
                <button onClick={delete}>Delete</button>
            </div>
        );
    }

    return (
        <div className="products">
            {names.map(map)}
            <input type="text" onChange={handleChange} />
            <button onClick={handleAdd}>Add</button>
        </div>
    );
}

const [names, dispatch] = useReducer(uniqueReducer, []) 啟用 uniqueReducer。names 是保存產品名稱的狀態變量,而 dispatch 是使用操作對象調用的函數。

當單擊 Add 按鈕時,處理程序將調用 dispatch({ type: 'add', name: newName })。調度一個 add 動作使 reducer uniqueReducer 向狀態添加一個新的產品名稱。

以同樣的方式,當單擊 Delete 按鈕時,處理程序將調用 dispatch({ type: 'delete', name })。remove 操作將產品名稱從名稱狀態中刪除。

有趣的是,reducer 是命令模式的特例。

看完上述內容,你們掌握React狀態管理的規則有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

绍兴市| 如东县| 界首市| 罗甸县| 册亨县| 湟源县| 瑞丽市| 泰和县| 奎屯市| 南昌县| 禄劝| 阜新市| 遵义县| 巴林右旗| 霍城县| 遂昌县| 衡东县| 咸宁市| 腾冲县| 理塘县| 教育| 宽城| 丁青县| 弋阳县| 平江县| 娄底市| 五常市| 赣榆县| 岳普湖县| 石棉县| 凤台县| 江孜县| 通许县| 晋州市| 六枝特区| 新郑市| 布尔津县| 桂平市| 天台县| 离岛区| 香河县|