【发布时间】:2016-08-19 14:23:32
【问题描述】:
在 page A 上,我有一个 react-router <Link> 可以通向 page B。在 页面 B 上,我有一个按钮尝试在服务器上执行某些操作,并且要么导致 页面 C(成功)要么留在 页面 B(失败)。在最后一种情况下,页面上会出现一条消息以显示错误。
当我在页面 B 上看到错误消息时,如果我使用浏览器返回按钮返回 页面 A,然后再次单击 <Link> 继续页面B,消息还在。
所以使用 <Link> 时状态似乎没有重置,我想知道在 <Link> 上更改状态的好方法是什么?
编辑:
为了更清楚,在 page A 上,您有一个 <Link> 到 page B。在页面 B,您有一个按钮来提交您的登录信息(登录名和密码)。
当您点击时,一个动作会向服务器发出请求:
function authRequest() {
return {
type: actionTypes.AUTH_REQUEST
};
}
function authReceive(authToken) {
return {
type: actionTypes.AUTH_RECEIVE,
authToken
};
}
function authError(errors) {
return {
type: actionTypes.AUTH_ERROR,
errors
};
}
export function fetchLogin(email, password) {
return function (dispatch) {
dispatch(authRequest());
const urlApi = `//${AUTH_BACKEND_HOST}:${AUTH_BACKEND_PORT}/${AUTH_BACKEND_URL.login}`
fetch(urlApi, {
method: 'POST',
headers: {
'Accept': 'application/json',
'content-type': 'application/json'
},
body: JSON.stringify({
email,
password
})
})
.then((response) => {
if(response.ok) {
response.json().then(function(json) {
dispatch(authReceive(json.key));
dispatch(push('/'));
});
} else {
response.json().then(function(json) {
dispatch(authError(JSON.stringify(json)));
});
}
})
.catch(function(ex) {
console.log(ex);
});
};
}
...如果失败,一个reducer在状态中添加错误信息:
const initialState = {
authToken: '',
isFetching: false,
errors: ''
}
export default function (state=initialState, action) {
switch (action.type) {
case actionType.AUTH_REQUEST:
return {
...state,
isFetching: true,
errors: ''
};
case actionType.AUTH_RECEIVE:
return authLogin(state, action);
case actionType.AUTH_ERROR:
return {
...state,
errors: (JSON.parse(action.errors))
};
}
return state;
}
function authLogin(state, action) {
const { authToken } = action;
return {
...state,
isFetching: false,
errors: '',
authToken
};
}
...最后,presenter 有一个带有 <p> 的渲染方法,如果它处于该状态,则会显示错误:
render() {
return (
<form onSubmit={this.handleSubmit}>
<label>Email <input ref="email" /></label>
<label>Password <input ref="password" type="password" /></label><br />
<p className="error">{this.props.errors.non_field_errors}</p>
<button type="submit">Login</button>
</form>
)
}
正如我所说,如果它显示错误,然后我返回 页面 A,然后通过单击链接再次返回 页面 B,消息仍然存在。
谢谢。
【问题讨论】:
-
如果状态没有被重置,这意味着
componentWillMount的ComponentB没有被调用。包括您的路线配置,它将提供更好的想法 -
你说得对,我正在开发的这个应用程序中没有 componentSomething 之类的功能。我在一些示例中看到了它们,但在此应用程序中没有使用它们,我仍然可以设法注册用户,然后在主页上连接和导航。
标签: reactjs react-router react-redux