как передать значение состояния useState в useReducer initialstate

#reactjs #react-hooks

#reactjs #реагирующие хуки

Вопрос:

Я хочу передать значение из значения состояния useState в useReducer initialstate.

 const [item, setItem] = useState([]);

const initialState = {
    menuOpen: true,
    promoOpen: false,
    couponOpen: false,
    cartOpen: false,
    orderOpen: false,
    orderAmount: 1,
    filteredItem: item,
  };

const [state, dispatch] = useReducer(reducer, initialState);

const fetchUrl = async () => {
    const resp = await fetch(url);
    const respData = await resp.json();
    const item = respData.item;
    const category = respData.category;
    const promo = respData.promo;
    setItem(item);
    setCategory(category);
    setPromo(promo);
    setFilterItem(item);
  };
 

Но когда я это делаю console.log(state.filteredItem) , я получаю пустой массив, поэтому я предполагаю, что он не передал значение в initialState . Есть ли у меня способ передать значение состояния useState в значение useReducer initialState?
Спасибо перед

Комментарии:

1. Я не понимаю, поведение, которое вы описали, правильное. item изначально является пустым массивом, что означает filteredItem , что изначально является пустым массивом, поскольку вы это делаете filteredItem: item . Поэтому, когда вы печатаете его через console.log(state.filteredItem) , он печатает пустой массив. Что вы ожидаете от его печати?

2. извините, я забыл о своей выборке

Ответ №1:

То, что вы пытаетесь сделать здесь, не сработает. Начальное состояние редуктора — это просто НАЧАЛЬНОЕ состояние. Он будет использовать значение initialState с самого первого рендеринга, прежде чем ваш items будет обновлен результатами выборки. Изменения в переменной initialState не повлияют на редуктор после того, как он уже был создан. Вам необходимо dispatch выполнить действие для сохранения items в вашем редукторе.

Ответ №2:

const [item, setItem] = useState([]);

Вы объявили свое состояние с помощью пустого массива, поэтому это то, что показывает filteredItem. Если вы установили свое состояние позже, чтобы изменить его в редукторе, я думаю, вам нужно использовать функцию диспетчеризации.

Комментарии:

1. извините, я забыл о своей выборке