如何在一个JS函数中使用props和用户令牌?

how to use props and a user token in one js function?

提问人:hanlok 提问时间:11/14/2023 最后编辑:hanlok 更新时间:11/14/2023 访问量:23

问:

我正在寻找一种解决方案,可以使用道具和用户令牌来创建动态对话框窗口来更改用户元数据(例如密码)。

当我单击剖面图中的按钮时

<ChangeRequestDialog changerequest="Password"></ChangeRequestDialog>

它将 changerequest 设置为 password,以便对话框知道用户想要更改密码,并相应地呈现对话框窗口。

export default function ChangeRequestDialog(props, token){
  const [open, setOpen] = React.useState(false);
  
  const handleClickOpen = () => {
    setOpen(true);
  };

  const handleClose = () => {
    setOpen(false);
  };
const handleChange = (event) => {
    setModel(event.target.value);
  };
const pwrecovery = async (e) => {
    let { data, error } = await supabase.auth.resetPasswordForEmail(
      token.user.email
    );
    console.log('pw recovery done')
  };

return (
<React.Fragment>
<Button className="button" variant="contained" onClick={handleClickOpen}>
                      change password
                    </Button>
<Dialog open={open} onClose={handleClose}>
        <DialogTitle>change {props.changerequest}</DialogTitle>
        <DialogContent>
          <DialogContentText>
{ props.changerequest=='Password'
                      ? "Are you sure you want to change you password?"
: ""
                  }
</DialogContentText>
 <DialogActions>
          <Button onClick={handleClose}>Cancel</Button>
          {
                     props.changerequest=='Password'
                      ? <Button onClick={pwrecovery}>Change</Button>
                      : ""
                  }
        </DialogActions>
</Dialog>
    </React.Fragment>

我正在将令牌从 App.js 传递到 ChangeRequestDialog.js,如下所示:

function App() {
  const [token, setToken] = useState(false);

  if (token) {
    sessionStorage.setItem("token", JSON.stringify(token));
  }

  useEffect(() => {
    if (sessionStorage.getItem("token")) {
      let data = JSON.parse(sessionStorage.getItem("token"));
      setToken(data);
    }
  }, []);
return (
<BrowserRouter>
<Routes>
<Route path="/profile" element={<Profile token={token} />} />
<Route path="/ChangeRequestDialog" element={<ChangeRequestDialog token={token} />} />
</Routes>
</BrowserRouter>
  );
}

export default App;

到目前为止,除了 pwrecovery 函数之外,一切都很好,因为它删除了错误“无法读取未定义的属性(读取'电子邮件')” 我想发生此错误是因为我没有正确传递令牌 我已经尝试过:

export default function ChangeRequestDialog(props, {token}){

结果是该函数提前停止了一个实例,并且错误显示:“无法读取未定义的属性(读取'user')” 在其他页面上,我是这样做的,它工作得很好:

const Profile = ({ token }) => {
};
export default Profile;

令牌是在用户登录时设置的 App.js:

<Route path="/login" element={<Login setToken={setToken} />} />

登录.jsx:

const Login=({setToken}) =>{
...
async function handleSubmit(e){
    e.preventDefault()

    try{
      const {data, error} = await supabase.auth.signInWithPassword(
        {
          email: formData.email,
          password: formData.password,
        }
        )

      if (error) throw error
      console.log(data)
      setToken(data)
      navigate('/profile')
    }
      catch(error){
        alert(error)
      }
}
return(...)}

但我想由于功能的原因,synthax 是不同的。很想得到答案,提前谢谢!

ReactJS 访问令牌

评论

0赞 Quak_2023 11/14/2023
尝试{token, ...道具}

答:

0赞 Quak_2023 11/14/2023 #1

你传递道具的方式是不正确的,你现在的反应方式会干扰第一个参数(props),因为道具对象和令牌将是未定义的 有 2 种方法可以修复它

  1. 使用 props.token
export default function ChangeRequestDialog(props){
 const token = props.token;
...
}
  1. 就地解构
export default function ChangeRequestDialog({token, ...props}){
....
}

评论

0赞 hanlok 11/14/2023
您好Quak_2023,感谢您的回答。不幸的是,这些都没有解决,我仍然收到消息“无法读取未定义的属性(读取'用户')”。令牌是在用户登录时设置的。我已经用这些信息更新了问题,也许它有助于更好地了解我的项目。
0赞 Quak_2023 11/14/2023
对不起,我忘了包括您必须改变传递道具的方式才能使此解决方案起作用的部分,但我看到您已经想通了
0赞 hanlok 11/16/2023
非常感谢您对Quak_2023的帮助!
0赞 hanlok 11/14/2023 #2

我得到了解决方案!除了 Quak_2023 的答案之外,我还将“token={token}”添加到配置文件中的 ChangeRequestDialog 调用中.js现在如下所示:

<ChangeRequestDialog changerequest="Mitgliedsmodel" token={token}></ChangeRequestDialog>