#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть состояние newuser
, которое изменяется в зависимости от входных данных в полях ввода, в конце концов, входные данные заполнены, и нажата кнопка отправки.
Я хочу сохранить текущее состояние нового пользователя, а затем, когда поля ввода будут заполнены во второй раз, у меня будет другое состояние для хранения предыдущего значения newuser
и текущего значения.
const [newuser,setnewuser] = useState({'firstname':'','lastname':''});
const [users,setusers] = useState([]); <-- this is expected to hold newuser objects as the submit button is clicked
Пожалуйста, как мне это сделать, я попытался использовать оператор распространения setusers(...newuser,newuser)
, но это не сработало.
Комментарии:
1. Как насчет
setusers([...users, newuser]);
2. Он отображает только текущее состояние
3. Можете ли вы показать больше своего кода или jsFiddle с минимальным кодом, необходимым для воспроизведения вашей ошибки?
Ответ №1:
правильное решение для этого — сохранить ваше старое состояние где-нибудь, например, в cache или localstorage. Для вашего конкретного случая кода мы можем использовать effect для синхронизации состояния
const [newuser,setnewuser] = useState({'firstname':'','lastname':''});
const [users,setusers] = useState([]);
useEffect(() => {
if(newuser amp;amp; newuser.firstname amp;amp; newuser.lastname amp;amp; !users.includes(newuser)) {
setusers([...users, newuser])
}
}, [JSON.stringify(newuser)]);
в случае, если вы хотите использовать правильное решение, я могу показать простое решение с использованием кэша, вам необходимо установить «memory-cache»
import cache from 'memory-cache'
const [newuser, _setnewuser] = useState(cache.get('newuser') || {'firstname':'','lastname':''});
const setnewuser = (user) => {
_setnewuser(user);
cache.put('newuser', user);
}
Комментарии:
1. Спасибо за это, то, что я на самом деле хочу сделать, это сохранять
newuser
в локальное хранилище при каждом нажатии кнопки, поэтому мой план состоял в том, чтобы сохранить всеnewuser
вusers
и нажать на localstorage2. вы можете использовать кэш памяти или localstorage напрямую
3. Пожалуйста, как мне это сделать
4. Я только что добавил решение с использованием кэша. если вы хотите использовать localstorage, измените cache api на localstorage api вместо этого. Идея все та же