代码之家  ›  专栏  ›  技术社区  ›  shauna vayne

跨组件的可变存储更新

  •  0
  • shauna vayne  · 技术社区  · 2 年前

    这是下一个项目。 文件夹结构:

    components > Navbar.js
    
    pages > index.js (/ route)(includes Navbar)
          > submitCollection.js (/submitCollection)(includes Navbar)
    

    我试图让用户提交一个特定的字符串作为输入,并将其存储在account变量中。 导航栏。js

    const Navbar = ({}) => {
        
        const [account,setAccount] = useState()
        
        const handleClick = () => {
            setAccount(randomNumberThatIHaveGenerated)
        }
        ...
        return (
            <Link href="/">home</Link>
            <Link href="/submitCollection">submit collection</Link>
            ...
            <button onClick={handleClick} >press to set account</button>
            ...
            {account?(<p>{account}</p>):(<p>u need to set an accout</p>)}
        )
    }
    

    当我使用导航栏链接到家时,帐户再次被设置为未定义,我需要再次按下按钮以进行设置。我怎样才能使绳子保持固定。比如在导航栏上坚持

    2 回复  |  直到 2 年前
        1
  •  0
  •   Icekid    2 年前

    你可以使用 localstorage useEffect

    将这段代码添加到工作中就可以了

    const [account,setAccount] = useState(localStorage.getItem('account') ?localStorage.getItem('account') : null)
    
    
    useEffect(()=>{
    localstorage.setItem(account)
    },[account])
    

    例如

    const [account,setAccount] = useState(localStorage.getItem('account') ?localStorage.getItem('account') : null)
        useEffect(()=>{
    localStorage.setItem('account',account)
    },[account])
        const handleClick = () => {
            setAccount(randomNumberThatIHaveGenerated)
        }
    

    希望有帮助

        2
  •  0
  •   Andrei Stoica    2 年前

    useState 不是持久的,它是绑定到它的组件的,为了使它持久,你必须使用 localStorage

    const [account,_setAccount] = useState();
    const setAccount = (val) => {
      _setAccount(val);
      localStorage.setItem('account', val);
    }
    
    useEffect(() => {
      const storedAccount = localStorage.getItem('account');
      if (storedAccount) _setAccount(storedAccount);
    }, [])
        
    const handleClick = () => {
      setAccount(randomNumberThatIHaveGenerated)
    }
    

    useEffect 在组件渲染时调用,检查存储的帐户并显示它。

    注意我们是如何重新实现的 setAccount ,因此每次调用它时,我们都会更新本地存储。

    你也可以用这个逻辑创建一个定制的钩子,这样组件看起来会更干净。或者更好,使用 use-state-persist