reactjs 如何在一个js函数中使用props和user token?

nszi6y05  于 12个月前  发布在  React
关注(0)|答案(2)|浏览(96)

我正在寻找一个解决方案,它可以使用 prop 和用户令牌来创建一个动态对话框窗口,用于更改用户的Meta数据(如密码)。
当我在纵断面图中单击按钮时

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

字符串
它将changerequest设置为password,这样对话框就知道用户想要更改密码,并相应地呈现Dialog窗口。

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;


到目前为止,一切都很好,除了从恢复函数,因为它会下降错误“无法读取未定义的属性(阅读'电子邮件')”我想这个错误发生,因为我没有正确传递令牌,我已经尝试过:

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


结果是函数提前停止了一个示例,错误说:“Cannot read properties of undefined(阅读'user')”在其他页面上,我这样做了,它工作得很好:

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


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

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


Login.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(...)}


但我猜是因为功能的原因,这把斧头是不同的。很想得到一个答案,提前谢谢!

wh6knrhe

wh6knrhe1#

你传递props的方式是不正确的,你现在这样做的方式会使第一个参数(props)interpets,因为props对象和token将是未定义的。
1.使用 prop 。令牌

export default function ChangeRequestDialog(props){
 const token = props.token;
...
}

字符串
1.就地破坏

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

uxh89sit

uxh89sit2#

我有办法了!除了Quak_2023的答案之外,我还在Profile.js中的ChangeRequestDialog调用中添加了“token={token}”,现在看起来像这样:

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

字符串

相关问题