如何在使用狀態掛鉤更新狀態時覆蓋具有相同鍵的對象 (How can overwrite objects that have the same key in updating State with state hooks)


問題描述

如何在使用狀態掛鉤更新狀態時覆蓋具有相同鍵的對象 (How can overwrite objects that have the same key in updating State with state hooks)

我想在選擇新過濾器時更新狀態。初始狀態顯示我瞄準的對象結構。例如,我添加了一個過濾器選擇(例如“f2”),每個過濾器的標籤是固定的,所以我們可以忽略它,但值可能是“va”。這很好,但是當我想將“f2”的值更改為“vb”時,我現在在我的狀態 {“f2”:“va”} 和 {“f2”:“vb”} 中有兩個條目,而我寧願第一個被第二個覆蓋。

 const [filterValues, setFilterValues] = useState([{"f1":["l","v"]}]);

 const handleChange = (filter, label, value) => {
   setFilterValues([
     ...filterValues,
     {[filter]: [label, value]}
   ]);
 };

我嘗試調用 setFilterValues 兩次(一次將條目映射到我的條件)來解決問題,但後來我什至根本沒有更新狀態:

 const handleChange = (filter, label, value) => {
    setFilterValues([
      ...filterValues,
      {[filter]: [label, value]}
    ]);
    let key = filter
    setFilterValues(
      filterValues.map(
        el => el.key == key?  { [key]: [label, value] } : el
      )
    )
  };

我有點有點新的反應,所以也許我沒有得到更新功能組件狀態的基本知識。有人可以幫我嗎?謝謝!


參考解法

方法 1:

The way to do it would be finding the right object and changing its value before setting the state:

const handleChange = (filter, label, value) => {
   const currentFilters = [...filterValues] // A new copy of the state.
   const newFilters = currentFilters.map(stateFilter => stateFilter[filter] ? {[filter]: [label, value]} : stateFilter)
   setFilterValues(newFilters);
 };

While I believe this solves your case, I think it would be better if you stored your filters in an array, meanning an object structure of:

[[l1,v1], [l1, v2]]

That way, filter one is just index 0 on your filter array, and so on. So to do what you want, you will have a function that receives a filter number, label and value:

const handleChange = (filter, label, value) => {
   let newFilters = [...filterValues] // A new copy of the state.
   newFilters[filter ‑ 1] = [label, value];
   setFilterValues(newFilters);
 };

Please note that if you receive a filter number of 1, meanning the first filter, you want to access place 0 on the filters array.

方法 2:

const handleChange = (filter, label, value) => {
    filterValues.map(el => {
      for (let keys in el) {
        if (keys === filter) {
          el[filter] = [label, value];
          setFilterValues([el]);
        } else {
          let newObj = { [filter]: [label, value] };
          let finalArr = [...filterValues, newObj];
          setFilterValues(finalArr);
        }
      }
    });
  };

(by MalteSagi RikaPrakhar Mittal)

參考文件

  1. How can overwrite objects that have the same key in updating State with state hooks (CC BY‑SA 2.5/3.0/4.0)

#use-state #react-hooks #reactjs #react-functional-component






相關問題

為什麼在使用 useState 時初始加載狀態設置為 true? (Why the initial loading state is set to true while using useState?)

如何在 React 中提取狀態的值 (How to extract value of a state in React)

如何在使用狀態掛鉤更新狀態時覆蓋具有相同鍵的對象 (How can overwrite objects that have the same key in updating State with state hooks)

如何使用 useState 將許多元素添加到數組中? (How to add many elements to an array with useState?)

如何正確附加到在功能組件中作為道具傳遞的字符串數組 (How to properly append to string array that was passed as props in functional component)

useState 在功能上與組件 React 的行為不同 (useState behaves differently in function vs componenet React)

如何在反應鉤子中設置多個值來狀態 (How to set multiple values to state in react hooks)

在 reactJS 中使用 useState 和外部過濾器 (using useState and External Filters in reactJS)

React.js 更改下拉值 (React.js to change dropdown value)

useState 不會立即更新狀態 (useState is not updating state immediately)

使用 useState 時,Reactjs 不會立即更新分配的值 (Reactjs doesn't immediately update the assigned value when useState is used)

如何為 useState 創建動態函數名稱? (How do I create a dynamic function name for useState?)







留言討論