gpt4 book ai didi

reactjs - 如何为传奇提供历史实例?

转载 作者:行者123 更新时间:2023-12-03 13:32:22 26 4
gpt4 key购买 nike

我想在成功登录后重定向到新页面。路线(V4)的使用方式如下:

import { browserHistory } from '....browser_history_signleton';
...

class App extends Component {
render() {
const { authentication: { isSignedIn } } = this.props;
return (
<ConnectedRouter history={browserHistory}>
<div>
<Header/>
<Route exact path="/" component={Home}/>
<PrivateRoute isAuthorized={isSignedIn} path="/page1" component={PageOne}/>
<PrivateRoute isAuthorized={isSignedIn} path="/page2" component={PageTwo}/>
</div>
</ConnectedRouter>
);
}
}

这个传奇看起来像:

import { browserHistory } from '....browser_history_signleton';

export function* loginSaga() {
while (true) { // eslint-disable-line no-constant-condition
try {
const payload = yield take(LOGIN_SUBMIT);
const raceResult = yield race({
signin: call(loginRequest, payload),
logout: take('LOGOUT')
});
if (raceResult.signin) {
const { data } = raceResult.signin;
yield put(loginRequestSucceeded(data));
const redirectUrl = `.....based on location.state.from.pathname`
browserHistory.push(rediretUrl);
...

我的主要问题是如何共享browserHistoryhistory 模块中的 createHistory 不是一个signleton,所以我必须添加:

// browser_history_signleton.js
import createHistory from 'history/createBrowserHistory';

export const browserHistory = createHistory();

向 saga 提供 history 实例的最有效方法是什么?

最佳答案

我发现了两个感觉不错的选项,并且我都使用了。我很好奇是否有人遇到任何问题。

选项 1:将 history 对象传递给 sagas。

这并不明显,但是 sagaMiddleware.run 函数采用转发给 sagas 的第二个参数。即:

/wherever/you/start/saga.js

import { createBrowserHistory } from "history";
import saga1 from "./saga1.js";

const function* rootSaga({ history }) {
yield all([saga1({ history })])
}

const sagaTask = sagaMiddleware.run(rootSaga, { history: createBrowserHistory() });

我在这里学到了这一点:https://github.com/ReactTraining/react-router/issues/3972#issuecomment-251189856

这是一种访问历史记录功能的干净方式。在实际的传奇中,您将像平常一样使用历史对象。

./saga1.js

export default ({ history }) => [
takeEvery(actions.DO_SOMETHING_THEN_NAVIGATE, function*({ payload }) {
...do something
history.push("/somewhere");
}),
];

选项 2:让单个 saga 管理 history 对象并使用操作进行导航

这是选项 1 的扩展。专用一个传奇来“管理”历史对象 - 使用操作推送/替换。即:

/my/history/saga.js


export default ({ history }) => [ // history is passed in ala option 1.
takeEvery(actions.HISTORY_PUSH, function*({ payload }) {
const pathname = payload.fooParam;
yield history.push(pathname);
}),
takeEvery(actions.HISTORY_REPLACE, function*({ payload }) {
yield history.replace({ pathname: payload.barParam });
}),
];

这可以让您的 redux 存储和操作保持干净,不受社区建议的一些奇怪的黑客攻击 - 例如在操作中传递历史对象。

让我知道你的想法。

关于reactjs - 如何为传奇提供历史实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42893161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com