【发布时间】:2018-03-01 22:13:45
【问题描述】:
这是一个有点冗长的解释。尽可能简短:我有两个组件,Employees 和 AddEmployee - 它们都分别附加到路由 /employees 和 employees/add。来自Employee 组件的链接会将employees/add 推送到BrowserHistory,反之亦然(如果表单提交成功,或者如果用户单击“取消”,AddEmployee 组件也会推送/employees)。
如果我导航到/employees,该组件工作正常。如果我点击导航到/employees/add,that 组件工作正常。如果我单击“取消”或提交表单以重定向回 /employees... 组件将中断。
通过大量调试,我确定这是因为 AddEmployee 的 redux 状态一直持续到 Employee。我的猜测是这是因为他们都使用了同一个传奇。我编写了一个 get Redux saga 来处理对远程 API 的请求。 Employees 显然使用 get saga 来检索所有用户,而 AddEmployee 使用 get saga 来检索可能的位置以将用户分配到。
当Employees 被加载时,apiGet saga 的状态包含检索到的员工。加载 AddEmployee 时,apiGet saga 的状态包含检索到的位置。当您随后导航返回到 Employees 时,apiGet 传奇的状态仍然包含检索到的位置,并且它不会再次运行以再次加载员工。
我该如何解决这个问题?
我已尽力将下面的代码压缩到相关部分。
get传奇:
function getApi(endpoint, token) {
return fetch(apiUrl + endpoint, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
}
}).then(handleApiErrors)
.then(response => response.json())
.catch((error) => {throw error})
}
function* apiGetFlow(endpoint) {
let response, token
try {
token = localStorage.getItem('token')
token = JSON.parse(token)
response = yield call(getApi, endpoint, token)
yield put({ type: CLIENT_GET_SUCCESS, response: response })
} catch(error) {
...
}
return response
}
function* apiGetWatcher() {
while(true) {
const { endpoint } = yield take(CLIENT_GET_REQUESTING)
const task = yield fork(apiGetFlow, endpoint)
}
}
export default apiGetWatcher
Employees 组件:
class Employees extends Component {
componentDidMount() {
this.usersGet()
}
usersGet() {
this.props.apiGetRequest('users')
}
render() {
...
}
}
const mapStateToProps = state => {
return {
users: state.apiGet,
}
}
const connected = connect(mapStateToProps, { apiGetRequest })(Employees)
export default connected
AddEmployee 组件:
class AddEmployeeForm extends Component {
componentDidMount() {
this.locationsGet()
}
locationsGet() {
this.props.apiGetRequest('locations')
}
render() {
...
}
}
const mapStateToProps = state => {
return {
locations: state.apiGet,
save: state.apiPost,
}
}
const formed = reduxForm({
form: 'addemployee',
})(AddEmployeeForm)
const connected = connect(mapStateToProps, { apiGetRequest, apiPostRequest })(formed)
export default connected
【问题讨论】:
标签: reactjs redux react-redux redux-saga