我想通过Reaction获取用户令牌.我在我的登录提交表单中使用以下代码,它是可以的: 在Login.jsx中:

const Login = () => {

const { setUserToken } = useContext(AppContext);

const submitForm = async (values) => {

        postUserLogin(values)
            .then((response) => {
                const { token } = response.data;
                setUserToken(token);
                setApiError({ status: '', error: '' });
                navigate('/employer/jobs');
            })
            .catch((err) => {
                setUserToken('');
             
            });
     return (<>...</>);
export default Login;

在EmployerJob.jsx中:

const EmployerJob = () => {

const { employerJobs, setEmployerJobs, userToken} = useContext(AppContext);

useEffect(() => {
    const fetchData = async () => {
        const res = await getEmployerJobList(userToken);
        if (res.status === 200) {
            const { paginator, items: jobs } = res.data;
            setPaginatorInfo(paginator);
            setEmployerJobs(jobs);
        }


    }
    fetchData();
}, []);

return (
    <div className="text-light my-4">

        {
            <span>Length: {paginatorInfo.count}</span>
        }

        {
            employerJobs.length > 0 ? employerJobs.map((job, index) => (
                <p key={index}>{job.salary}</p>
            )) : <p>No Job!</p>
        }



      </div>
    );
};

export default EmployerJob;

在appConext.jsx中:

import {createContext} from 'react';

export const AppContext = createContext({
    userToken:'',
    setUserToken:()=>{},
    employerJobs:[],
    setEmployerJobs:()=>{},
});

在App.js中:

const App= ()=> {

  const [userToken, setUserToken] = useImmer('');
  const [employerJobs, setEmployerJobs] = useImmer([]);
  
  return(
    <AppContext.Provider value={{
      userToken,
      setUserToken,
      employerJobs,
      setEmployerJobs,
    }}>
    <div className='App'>
        <Navbar/>
        <Routes>
          <Route path='/employer/login' element={<Login/>} />
          <Route path='/employer/jobs' element={<EmployerJob/>}/>
          <Route path="*" element={<NotFound/>}/>
        </Routes>
    </div>
    </AppContext.Provider>
  );
}

export default App;

它只适用于第一次登录,但当我刷新‘/Employer/Jobs’页面时,userToken值为空.我是新手,我认为不应该更改用户令牌.为什么会这样?我该如何解决这个问题?

推荐答案

在页面重新加载之间,react 状态不会持续存在.当重新加载网页时,所有的JavaScript状态和数据,包括Reaction状态,都会被重置.

您可以使用浏览器的本地存储或会话存储来存储在页面重新加载之间保持不变的少量数据(字符串).

您可以通过这种方式存储、检索和删除本地存储中的数据.

// Storing data in local storage
const dataToStore = { key: 'value', foo: 'bar' };
localStorage.setItem('myData', JSON.stringify(dataToStore));

以此方式检索令牌.

// Retrieving data from local storage
const storedData = localStorage.getItem('myData');
const parsedData = JSON.parse(storedData);

删除令牌

// Removing data from local storage
localStorage.removeItem('myData');

或者你可以设置一个曲奇

const expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 7); // Expires in 7 days

document.cookie = `myCookie=myValue; expires=${expirationDate.toUTCString()}`;

这两种方法都有局限性和安全考虑.

刷新令牌是实现这一点的最佳方式.

Reactjs相关问答推荐

更新数据时有关CQR和更新UI的问题

如何使用next.js以DOM为目标在映射中使用Ref

Redux向后端发送请求时出现钩子问题

REACT路由DOM根据参数呈现不同的路由

Reaction Ploly:如何在多个子情节中共享zoom 状态

梅X折线图无响应

状态更改时的rtk查询触发器

使用experial_useFormState将参数传递给服务器操作

Chart.js如何go 除边框

生产部署:控制台中 Firebase 无效 api 密钥错误

useRef.current.value 为空值

无法使axiosmockadapter正常工作

Firebase Storage: 对象不存在图片上传路径错误

如何到达类组件中的状态?

ReactJS:在导航栏中使用 Select inside Link 组件时如何避免重定向?

在 React 中,为什么在使用 addEventListener 时外部元素上的 onclick 事件监听器在内部元素的 onclick 事件监听器之前执行?

react-router v6 中的 BrowserRouter 和 createBrowserRouter 有什么区别?我可以在不使用数据 API 的情况下使用 createBrowserRouter 吗?

来自一个自定义 React Native 组件的样式从另一个自定义组件移除样式

如何跟踪 dexie UseLiveQuery 是否完成

react 路由:router.ts:11 没有匹配的路由位置/管理