#javascript #reactjs #use-state
#javascript #reactjs #use-state
Вопрос:
Я пытаюсь передать состояния нескольким компонентам через счетчик щелчков. Итак, я могу щелкнуть счетчик, который увеличивает значение состояния счетчика, и если я остановлюсь, скажем, на 10 и отправлю его компоненту, я хочу, чтобы в следующий раз, когда я использую счетчик и устанавливаю его на 15 на этот раз, мне нужно, чтобы он отправлял его другому компоненту (или тому же самому) но теперь количество состояний равно 15. Я не хочу, чтобы для обоих экземпляров состояния было установлено значение 15. Каждое состояние должно сохранять свои номера.
JSX
<div className="addnum" onClick={() => addUnits()}> </div>
JS
const [units,setUnits] = useState(0)
function addUnits() {
setUnits(prev => prev 1)
}
Некоторый компонент 1
<div>{units}</div>
Некоторый компонент 2
<div>{units}</div>
Моя проблема в том, что когда я устанавливаю состояние одного, другой получает то же состояние, что и обычно. Как я могу удалить ссылку или создать копии каждого состояния, чтобы они были индивидуальными?
Я видел этот пост, который отвечает на вопрос при использовании компонентов на основе классов, но мое состояние не является массивом, так как я могу сделать то же самое здесь? https://stackdev.io/question/434/copy-the-state-in-react-without-reference
Комментарии:
1. В каждом компоненте вы можете сохранить его в значении
2. Что? Не могли бы вы объяснить, что вы имеете в виду? В идеале с примером
Ответ №1:
Насколько я понимаю. У вас есть список счетчиков и список так называемых некоторых компонентов. Итак, простой структурой данных в таком случае является array . Кроме того, таймер необходим для создания нового слота после некоторого простоя. useReducer является предпочтительным способом обработки нескалярного состояния. Что-то вроде следующего:
const initialState = [0];
function reducer(state, action) {
const [head, ...tail] = state;
switch (action.type) {
case 'inc':
return [head 1, ...tail];
case 'new':
return [0, ...state];
default:
throw new Error();
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);
const timer = useRef(null);
const inc = useCallback(() => {
if (timer.current) clearTimeout(timer.current);
timer.current = setTimeout(() => dispatch({type: 'new'}), 1000);
dispatch({type: 'inc'});
}, [timer, dispatch]);
useEffect(() => () => {
if (timer.current) clearTimeout(timer.current);
});
return (
<>
{state.map((count, i) => <div key={i}>{count}</div>)}
<button onClick={inc}> </button>
</>
);
}