Reactjs React本机深度链接仅在第二次单击时有效
问题:我试图使用深度链接引导用户从电子邮件中重置密码页面,但第一次单击链接会将我带到应用程序的上一个状态,只有第二次单击链接才会将我带到重置密码页面 问题更新:当前的行为是,我可以在第一次单击时转到正确的屏幕,但是,来自上一个应用程序状态的屏幕仍然是我看到的第一个屏幕,并且在转到正确的屏幕之前,它会停留2秒钟 这是我的密码:Reactjs React本机深度链接仅在第二次单击时有效,reactjs,react-native,react-navigation,deep-linking,Reactjs,React Native,React Navigation,Deep Linking,问题:我试图使用深度链接引导用户从电子邮件中重置密码页面,但第一次单击链接会将我带到应用程序的上一个状态,只有第二次单击链接才会将我带到重置密码页面 问题更新:当前的行为是,我可以在第一次单击时转到正确的屏幕,但是,来自上一个应用程序状态的屏幕仍然是我看到的第一个屏幕,并且在转到正确的屏幕之前,它会停留2秒钟 这是我的密码: class NavigationWrapper extends React.Component { constructor(props) { super(pro
class NavigationWrapper extends React.Component {
constructor(props) {
super(props)
this.state = {
token: null,
route: null
}
this.handleDeepLink = this.handleDeepLink.bind(this)
this.navigatorRef = navigatorRef
}
componentDidMount() {
Linking.getInitialURL().then(url => {
const { route, token } = unpackLink(url)
this.setState({ route, token })
})
Linking.addEventListener('url', this.handleDeepLink)
}
componentDidUpdate() {
if (!this.props.loggedIn && this.state.token) {
const token = this.state.token
this.setState(
{ token: null },
() => this.props.tokenLogin(token)
)
}
}
componentWillUnmount() {
Linking.removeEventListener('url', this.handleDeepLink)
}
handleDeepLink(e) {
const { route, token } = unpackLink(e.url)
this.setState({ route, token })
}
render() {
return <NavigationContainer ref={this.navigatorRef}><RootStack /></NavigationContainer>
}
}
以及处理该请求的传奇故事:
export function* sendEmail() {
try {
yield takeEvery(
authTypes.PASSWORD_RESET_EMAIL.REQUEST,
resetPassword
)
} catch (err) {
console.warn('error', err)
}
}
function* resetPassword(action) {
yield makeApiRequest(
authTypes.PASSWORD_RESET_EMAIL,
`forgot-password`,
'',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email: action.username })
},
false,
{ email: action.username }
)
}
我看不到你在这里导航到任何关于接收深度链接的页面。我很惊讶你竟然可以重新设置密码页面。还有,你为什么不使用链接道具来处理深层链接,而不是手动添加侦听器?@satya164谢谢你的评论!该应用程序设置为,当第一次登录状态更改时,它会将用户带到“更改密码”页面。我尝试过使用钩子和链接道具,并在链接中使用route参数进行导航,但行为仍然是一样的-第一次单击会将我带到上一个应用程序状态,第二次单击会将我带到正确的屏幕…真的对此感到困惑。你能将代码发布到你带用户更改密码页面的位置吗?是的,更新了上面的代码。谢谢你看!如何设置firstLogin状态?发布组件的完整代码
case authTypes.PASSWORD_RESET_EMAIL.SUCCESS:
return {
...initialState,
passwordChanged: false,
emailSent: true,
firstLogin: true,
}
export function* sendEmail() {
try {
yield takeEvery(
authTypes.PASSWORD_RESET_EMAIL.REQUEST,
resetPassword
)
} catch (err) {
console.warn('error', err)
}
}
function* resetPassword(action) {
yield makeApiRequest(
authTypes.PASSWORD_RESET_EMAIL,
`forgot-password`,
'',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ email: action.username })
},
false,
{ email: action.username }
)
}