gpt4 book ai didi

javascript - 使用 BrowserRouter 响应空闲计时器

转载 作者:行者123 更新时间:2023-11-29 10:56:27 32 4
gpt4 key购买 nike

我正在尝试使用 React Idle Timer 在 15 分钟后转到锁定屏幕。

我遇到的问题是重定向页面。我正在使用带有反应的 Electron 和 react BrowserRouter。因此我不能使用 window.location.assign('/clock'); (或类似的 window.location)方法来重定向页面。通常在我的组件中我使用:

this.props.history.push("/clock");

这在 BrowserRouter 的 Switch 内的组件中工作。但是,我需要 React Idle Timer 处于顶层,当我在 onIdle 函数中使用 props.history.push 时,我收到消息:

Uncaught TypeError: Cannot read property 'push' of undefined

class AppRouter extends Component {
constructor(props) {
super(props);
this.idleTimer = null;
this.onAction = this._onAction.bind(this);
this.onActive = this._onActive.bind(this);
this.onIdle = this._onIdle.bind(this);
}

_onAction(e) {
console.log("user did something", e);
}

_onActive(e) {
console.log("user is active", e);
console.log("time remaining", this.idleTimer.getRemainingTime());
}

_onIdle(e) {
console.log("user is idle", e);
console.log("last active", this.idleTimer.getLastActiveTime());

//need to push to /clock after 15 minutes
//window.location.assign('/clock'); -- WORKS in browser, but not with Electron

// this.props.history.push("/clock"); -- gives Uncaught TypeError: Cannot read property 'push' of undefined

//can't place <IdleTimer inside BrowserRouter because it only allows 1 thing within.

}

render() {
return (
<div>
<IdleTimer
ref={ref => {
this.idleTimer = ref;
}}
element={document}
onActive={this.onActive}
onIdle={this.onIdle}
onAction={this.onAction}
debounce={250}
timeout={1000 * 60 * 0.1}
/>

<BrowserRouter>
<div>
<Switch>
<Route path="/institution" component={Institution} />
<Route path="/location" component={Location} />
<Route path="/timezone" component={TimeZone} />
<Route path="/clock" component={Clock} />
<Route path="/" component={PreflightCheck} />
</Switch>
</div>
</BrowserRouter>
</div>
);
}
}


ReactDOM.render(<AppRouter />, document.getElementById("root"));

重定向到 BrowserRouter 标签之外的顶级组件的正确方法是什么?

我也试过这个:

import { createHashHistory } from 'history'
export const history = createHashHistory()

然后调用 history.push('/clock');

这似乎只是将/clock 附加到我所在的当前页面,我收到了这条消息:

Hash history cannot PUSH the same path; a new entry will not be added to the history stack

最佳答案

创建历史记录(你可以使用 npm install history):

import { createBrowserHistory } from "history";
const history = createBrowserHistory();

然后将空闲计时器放置在 Router 中。在这种情况下,BrowserRouter 似乎不像 Router 那样处理历史记录。

<Router history={history}>
<div>

<IdleTimer
ref={ref => {
this.idleTimer = ref;
}}
element={document}
onActive={this.onActive}
onIdle={() => this.checkplayerstatus(history)}
onAction={this.onAction}
debounce={250}
timeout={1000 * 60 * 15}
/>
<Switch>
<Route path="/institution" component={Institution} />
<Route path="/location" component={Location} />
<Route path="/timezone" component={TimeZone} />
<Route path="/clock" component={Clock} />
<Route path="/" component={PreflightCheck} />
</Switch>
</div>
</>

然后在 onIdle 函数中你可以这样做:“whatevervariableyoupassashistoryfromonidle”.push(“/clock”).

关于javascript - 使用 BrowserRouter 响应空闲计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56400196/

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